本文共 6607 字,大约阅读时间需要 22 分钟。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。MySQL 是最流行的关系型数据库管理系统。
结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言。
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL语句分类:
SQL通用写法
查询返回的结果是结果集。
直接创建数据库CREATE DATABASE 数据库名;判断是否存在并创建数据库(了解)CREATE DATABASE IF NOT EXISTS 数据库名;创建数据库并指定字符集(了解)CREATE DATABASE 数据库名 CHARACTER SET 字符集;
查看所有的数据库SHOW DATABASES;查看某个数据库的定义信息SHOW CREATE DATABASE 数据库名;
修改数据库字符集格式ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;alter database db3 character set utf8;--例
DROP DATABASE 数据库名;
查看正在使用的数据库SELECT DATABASE();使用/切换数据库USE 数据库名;
===================================创建表===================================create table 表名( 字段名 字段类型 约束, 字段名 字段类型 约束);--快速创建一个表结构相同的表CREATE TABLE 新表名 LIKE 旧表名;===================================查看表===================================--查看某个数据库中的所有表SHOW TABLES;--查看表结构DESC 表名;--查看创建表的SQL语句SHOW CREATE TABLE 表名;==============================修改表结构(了解)==============================--添加表列/字段ALTER TABLE 表名 ADD 列名 类型;--修改列/字段名ALTER TABLE 表名 MODIFY 列名 新的类型;--修改列/字段名ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;--删除列ALTER TABLE 表名 DROP 列名;--修改表名RENAME TABLE 表名 TO 新表名;--修改字符集ALTER TABLE 表名 character set 字符集;===================================删除表===================================--直接删除表DROP TABLE 表名;---判断表是否存在并删除表(了解)DROP TABLE IF EXISTS 表名;===================================更新表结构/数据===================================--不带条件修改数据UPDATE 表名 SET 字段名=值,字段名=值;--带条件修改数据UPDATE 表名 SET 字段名=值 WHERE 字段名=值 AND 字段名=值;--更新nprice字段为price字段的+10;update product set nprice=price+10;
===================================新增全部字段数据===================================--罗列所有的字段INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);--不写字段名INSERT INTO 表名 VALUES (值1, 值2, 值3…);此时值的个数,顺序,类型要和数据库表字段的个数,顺序,类型保持一致。===================================新增部分字段数据===================================INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
INSERT INTO 表名 //表示往哪张表中添加数据 (字段名1, 字段名2, …) //要给哪些字段设置值 VALUES (值1, 值2, …); //设置具体的值
本质:在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中。
作用:将表名2 中的数据复制到 表名1 中
INSERT INTO 表名1 SELECT * FROM 表名2;
--不带条件修改数据UPDATE 表名 SET 字段名=值,字段名=值;--带条件修改数据UPDATE 表名 SET 字段名=值 WHERE 字段名=值 AND 字段名=值;--更新nprice字段为price字段的+10;update product set nprice=price+10;
关键字说明:
update // 修改数据 set //修改哪些字段 where 条件; //指定条件
--不带条件删除数据DELETE FROM 表名;--根据条件删除数据DELETE FROM 表名 WHERE 字段名=值;--truncate删除表记录TRUNCATE TABLE 表名;
delete
是将表中的数据一条一条删除。
truncate
是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样。 查询不会对数据库中的数据进行修改.只是一种显示数据的方式。
===================================查询所有===================================select * from 表名;===================================查询指定列===================================select 字段名1,字段名2... from 表名;===================================别名查询===================================select 字段名1 as 别名,字段名2 别名 from 表名 as 表别名;as关键字可以省去不写--表别名:查询商品名称和价格SELECT pro.pname,pro.price FROM product AS pro;--列别名:查询商品名称和价格SELECT pname AS "商品名称",price "商品价格" FROM product;===================================去重复查询===================================select distinct 字段名 from 表名;===================================查询结果参与运算===================================select 列名1 + 固定值 from 表名;-- 需求:将所有商品的价格+10元进行显示. (查询结果可参与运算)SELECT *,IFNULL(price,0)+10 FROM product;--同时包含了null情况
SELECT * FROM student3 WHERE math>80;--查询math分数大于80分的学生
SELECT * FROM student3 WHERE age>35 AND sex='男';--查询age大于35且性别为男的学生(两个条件同时满足)
语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);
语法格式:SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2
between 值1 and 值2 值1一定要小于值2 比如: age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
语法格式:select * from 表名 where 字段 like 条件;
% : 模糊所有 _ : 模糊一位 例如: "马%" 匹配以"马"字开头 "%马" 匹配以"马"字结尾 "_马" 匹配第二个字是"马"字的 "__马%" 匹配第三个字是"马"字的 "%马%" 匹配包含"马"字的
通过 ORDER BY
子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)。
select * from 表名 where 条件 order by 字段名称1 [desc | asc] , 字段名2 [desc | asc]... ;
asc(默认) : 升序(ascend) desc : 降序(descend) 先根据字段1排序,若有第二排序字段,在第一排序字段的基础上进行第二次排序
单列排序就是使用一个字段排序。
SELECT * FROM student3 ORDER BY age DESC;--查询所有数据,使用年龄降序排序
组合排序
就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
--查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序SELECT * FROM student3 ORDER BY age DESC, math DESC;
之前我们做的查询都是横向查询
,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询
,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值
。
count() : 计数 IFNULL(字段名,0) : 如果指定字段的值为null,则使用0表示 sum() : 求和 max() : 求最大值 min() : 求最小值 avg() : 求平均值 扩展-保留小数位 cast(avg(字段名称) as decimal(5,2))
聚合函数的使用:写在 SQL语句SELECT后查询结果的位置
SELECT 字段名… FROM 表名; SELECT COUNT(age) FROM 表名; 此时对于NULL的记录不会记录。IFNULL(expr1, expr2)
的用法:假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为expr2, 我们可以利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏。 例:SELECT COUNT(IFNULL(english,0)) FROM student3;
分组查询
是指使用 GROUP BY语句
对查询信息进行分组,相同数据作为一组
GROUP BY
怎么分组的?将分组字段结果中相同内容作为一组。
SELECT * FROM student3 GROUP BY sex;
这句话会将sex相同的数据作为一组。 GROUP BY
将分组字段结果中相同内容作为一组,并且返回每组的第一条数据
,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。 分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。
注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组。
对于分组后的条件需要使用having
语句。
--查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*)>2;
分组后
对数据进行过滤。分组前
对数据进行过滤。可以
使用聚合函数。不可以
使用聚合函数。LIMIT是 限制 的意思,所以 LIMIT 的作用就是限制查询记录的条数。
语法格式:SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句]\ [HAVING子句] [ORDER BY子句] [LIMIT子句];
思考:limit子句为什么排在最后? 因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了! LIMIT语法格式: LIMIT offset,length; 或者limit length; offset 是指偏移量,可以认为是跳过的记录数量,默认为0 length 是指需要显示的总记录数
--例:从第三条开始显示,显示6条SELECT * FROM student3 LIMIT 2,6;
LIMIT的使用场景:分页
即运用于记录过多的情况下。-- 每页显示5条-- 第一页: LIMIT 0,5; 跳过0条,显示5条-- 第二页: LIMIT 5,5; 跳过5条,显示5条-- 第三页: LIMIT 10,5; 跳过10条,显示5条SELECT * FROM student3 LIMIT 0,5;--如果是0开始 可以简写为`LIMIT 5;`SELECT * FROM student3 LIMIT 5,5;SELECT * FROM student3 LIMIT 10,5;--不够5条的话,则有多少显示多少
转载地址:http://gyowb.baihongyu.com/