第四章 DQL语句
4.1条件查询
4.1.1 比较运算符
>大于 <小于 <=小于等于 >=大于等于 =等于 <>、!=不等于
具体操作:查询math分数大于80分的学生
SELECT * FROM student3 WHERE math>80;
查询english分数小于或等于80分的学生
SELECT * FROM student3 WHERE english<=80;
查询english分数小于或等于80分的学生
SELECT * FROM student3 WHERE english<=80;
查询age等于20岁的学生
SELECT * FROM student3 WHERE age=20;
查询age不等于20岁的学生
SELECT * FROM student3 WHERE age!=20; SELECT * FROM student3 WHERE age<>20;
4.1.2 逻辑运算符
and(&&) 多个条件同时满足 or(||) 多个条件其中一个满足 not(!) 不满足
具体操作:查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student3 WHERE age>35 AND sex='男';
查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student333 WHERE age>35 OR sex='男';
查询id是1或3或5的学生
SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5;
in关键字 语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...); in里面的每个数据都会作为一次条件,只要满足条件的就会显示
具体操作:查询id是1或3或5的学生
SELECT * FROM student3 WHERE id IN (1,3,5);
查询id不是1或3或5的学生
SELECT * FROM student3 WHERE id NOT IN (1,3,5);
4.1.3 范围
BETWEEN 值1 AND 值2 表示从值1到值2范围,包头又包尾 比如:age BETWEEN 80 AND 100 相当于: age>=80 &&age<=100
具体操作:查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student3 WHERE english>=75 AND english<=90; SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;
4.1.4 like
LIKE表示模糊查询 SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串'; 满足通配符字符串规则的数据就会显示出来 所谓的通配符字符串就是含有通配符的字符串 MySQL通配符有两个: %: 表示0个或多个字符(任意个字符) _: 表示一个字符
具体操作:查询姓马的学生
SELECT * FROM student3 WHERE NAME LIKE '马%';
查询姓名中包含'德'字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';
查询姓马,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '马__';
4.2排序
通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序) SELECT字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC]; ASC: 升序, 默认是升序 DESC: 降序
4.2.1单列排序
单列排序就是使用一个字段排序
具体操作:查询所有数据,使用年龄降序排序
SELECT * FROM student3 ORDER BY age DESC;
4.2.2组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。 上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序 SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
具体操作:查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC, math DESC;
4.3 聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值
五个聚合函数: count: 统计指定列记录数,记录为NULL的不统计 sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0 max: 计算指定列的最大值 min: 计算指定列的最小值 avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为0
聚合函数的使用:写在 SQL语句SELECT后 字段名的地方 SELECT 字段名... FROM 表名; SELECT COUNT(age)FROM 表名;
具体操作:查询学生总数
SELECT COUNT(english) FROM student3;
我们发现对于NULL的记录不会统计
我们可以利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏
ELECT COUNT(IFNULL(english,0)) FROM student3;
SELECT COUNT(*) FROM student3;
查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age>40;
查询数学成绩总分
SELECT SUM(math) FROM student3;
查询数学成绩平均分
SELECT AVG(math) FROM student3;
查询数学成绩最高分
SELECT MAX(math) FROM student3;
查询数学成绩最低分
SELECT MIN(math) FROM student3;
4.4 分组
分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组 SELECT 字段1,字段2... FROM 表名GROUP BY 分组字段 [HAVING 条件];GROUP BY怎么分组的?将分组字段结果中相同内容作为一组 SELECT * FROM student3 GROUP BY sex;这句话会将sex相同的数据作为一组
GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。分组后聚合函数的作用/?不是操作所有数据,而是操作一组数据。 SELECT SUM(math), sex FROM student3 GROUPBY sex; 效果如下:
实际上是将每组的math进行求和,返回每组统计的结果
注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的查询的时候没有查询出分组字
查询的时候查询出分组字段
具体步骤:按性别分组
SELECT sex FROM student3 GROUP BY sex;
查询男女各多少人
.查询所有数据,按性别分组。 2.统计每组人数SELECT sex, COUNT(*) FROM student3 GROUP BY sex;
查询年龄大于25岁的人,按性别分组,统计每组的人数
//
1.先过滤掉年龄小于25岁的人。2.再分组。3.最后统计每组的人数SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;
查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据 有很多同学可能会将SQL语句写出这样:
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;
注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用having子句
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;只有分组后人数大于2的`男`这组数据显示出来
having与where的区别
having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
having后面可以使用聚合函数
where后面不可以使用聚合函数
准备数据:
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (9,'唐僧',25,'男','长安',87,78),(10,'孙悟空',18,'男','花果山',100,66),(11,'猪八戒',22,'男','高老庄',58,78),(12,'沙僧',50,'男','流沙河',77,88),(13,'白骨精',22,'女','白虎岭',66,66),(14,'蜘蛛精',23,'女','盘丝洞',88,88);
4.5 limit语句
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数。 SELECT *|字段列表 [as 别名] FROM 表名[WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句]; 思考:limit子句为什么排在最后? 因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!
LIMIT语法格式: LIMIT offset,length; 或者limit length; offset是指偏移量,可以认为是跳过的记录数量,默认为0 length是指需要显示的总记录数
具体步骤:查询学生表中数据,从第三条开始显示,显示6条
我们可以认为跳过前面2条,取6条数据 SELECT * FROM student3 LIMIT 2,6;
LIMIT的使用场景:分页 比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。 假设我们一每页显示5条记录的方式来分页,SQL语句如下:
‐ 每页显示5条 ‐‐ 第一页: LIMIT 0,5; 跳过0条,显示5条 ‐‐ 第二页: LIMIT 5,5; 跳过5条,显示5条 ‐‐ 第三页: LIMIT 10,5; 跳过10条,显示5条 SELECT * FROM student3 LIMIT 0,5;SELECT * FROM student3 LIMIT 5,5;SELECT * FROM student3 LIMIT 10,5;
注意:
如果第一个参数是0可以简写:
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;
LIMIT 10,5; -- 不够5条,有多少显示多少
第五章 数据库备份
5.1 备份应用场景
在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。
5.2 source命令备份与还原
备份格式: mysqldump -u用户名 -p密码 数据库 > 文件的路径
还原格式: SOURCE 导入文件的路径;
注意:还原的时候需要先登录MySQL,并选中对应的数据库
具体操作:备份day22数据库中的数据
mysqldump ‐uroot ‐proot day22 > C:\work\课改\MYSQL课改资料\Day02‐MYSQL多表查询\code\bak.sql
数据库中的所有表和数据都会导出成SQL语句
还原day22数据库中的数据
删除day22数据库中的所有表 登录MySQL
mysql ‐uroot ‐proot
选中数据库
use day22; select database();
使用SOURCE命令还原数据
source C:\work\课改\MYSQL课改资料\Day02‐MYSQL多表查询\code\bak.sql
5.3 图形化界面备份与还原
备份day22数据库中的数据
包含创建数据库的语句
还原day22数据库中的数据
删除day22数据库
数据库列表区域右键“执行SQL脚本”, 指定要执行的SQL文件,执行即可