一、DQL
1.什么是DQL?
DQL:Data Query Language 数据库查询语言
- 条件查询
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果给客户端;
通过查询语句查询出来的数据以表的形式展示给我们,我们称这个表为虚拟结果集,存放在内存中;
查询返回的结果集是一张虚拟表。
- 1.1查询所有信息
# 查询一个表中所有的数据
# select * from 表名;
select * from result;
1.2 查询指定列的信息
select StudentNo,StudentName from student;
# 等价于 as:别名 引号可加可不加
select StudentNo as '学号' ,StudentName as '姓名' from student;
1.3 查询mysql版本
select version();
1.4 选择学生成绩是100以下90以上的学生学号
# 选择学生成绩是100以下90以上的学生学号
select distinct StudentNo from result
where StudentResult > 90 and StudentResult < 100 and SubjectNo = 9;
#等价于
select distinct StudentNo from result
where StudentResult between 90 and 100 and SubjectNo = 9;
1.5 嵌套筛选信息
# 选择学生姓名 他的成绩是90以上100以下
select StudentName from student
where StudentNo in (select distinct StudentNo from result
where StudentResult > 90 and StudentResult < 100 and SubjectNo = 9);
1.6 查询年龄为13并且姓名为郝一凡的学生
SELECT * FROM grade WHERE gradename = '郝一凡' AND gradeage = 13;
1.7 查询性别为1的学生(1指的是女性 2指的是男性)
SELECT * FROM grade WHERE sex = '1';
1.8 查询id为1或者姓名为张三的学生
SELECT * FROM grade WHERE gradeid = '1' OR gradename = '张三';
1.9 查询学号是1,2,3的学生信息
SELECT * FROM grade WHERE gradeid IN(1,2,3);
#等价于
SELECT * FROM grade WHERE gradeid = '1' OR gradeid = '2' OR gradeid = '3';
1.10 查询姓名为 null 的信息
SELECT * FROM grade WHERE gradename IS NULL;
1.11 查询姓名不为 null 的学生信息
SELECT * FROM grade WHERE gradename IS NOT NULL;
1.12 查询表中性别不为1的信息 1表示女性 2表示男性
SELECT * FROM grade WHERE sex != '1';
二、模糊查询
2.1 查询姓名是由两个汉字组成的信息
# 一个下划线代表一个字符
SELECT * FROM grade WHERE gradename LIKE '__';
2.2 查询姓名是由两个汉字组成的姓名
SELECT gradename FROM grade WHERE gradename LIKE '__';
2.3 查询姓名是由两个汉字组成,并且第二个字是三的信息
SELECT * FROM grade WHERE gradename LIKE '_三';
2.4 查询姓名是由李开头的信息
# "%"匹配0-n个字符
SELECT * FROM grade WHERE gradename LIKE '李%';
2.5 查询姓名第二个字为一的信息
SELECT * FROM grade WHERE gradename LIKE '_一%';
2.6 查询姓名中带妮的信息
SELECT * FROM grade WHERE gradename LIKE '%妮%';
三、字段模糊查询
3.1 数学运算
select 1 + 2 as 结果;#数学运算
3.2 去重 加 distinct 关键字
select distinct StudentNo from result;
3.3 指定数据运算
将性别对应的数字和id相加
SELECT *,gradeid+sex FROM grade;
3.4 如果指定相加的数据中存在null的话,那么就替换为0
SELECT *,IFNULL(gradeid,0) + IFNULL(sex,0) FROM grade;
3.5 替换列名
# as 可加可不加
SELECT *,IFNULL(gradeid,0) + IFNULL(sex,0) AS total FROM grade;
可以看出上一张图片的最后一列 列名被替换成了total
# 本来是gradename 改成了name
SELECT gradename AS NAME FROM grade;
四、排序
#ASC升序 DESC降序 升序的话 ASC可以省略 默认升序
SELECT * FROM grade ORDER BY gradeage DESC;
4.1 如果有相同的排序 比如年龄都是21 难么就排序他们的名字
SELECT * FROM grade ORDER BY gradeage ASC,gradename DESC;
五、聚合函数
5.1 查看总共有多少行信息
SELECT COUNT(*)AS 总数 FROM grade;
5.2 统计name不为null的个数
可以看出 总共有12条记录 其中有一条记录姓名为null
SELECT COUNT(gradename) FROM grade;
5.3 查询年龄大于20岁的人数
SELECT COUNT(*)FROM grade WHERE gradeage > 20;
5.4 查询年龄+id大于30的人数
SELECT * FROM grade WHERE IFNULL(gradeid,0) + IFNULL(gradeage,0) > 30;
SELECT count(*) FROM grade WHERE IFNULL(gradeid,0) + IFNULL(gradeage,0) > 30;
5.5 查询有姓名的和年龄的人数
SELECT COUNT(gradename),COUNT(gradeage) FROM grade;
七、聚合函数 SUM 和 AVG
7.1 对年龄求和
SELECT SUM(gradeage) FROM grade;
7.2 查询所有id和,以及所有年龄和
SELECT SUM(gradeage),SUM(gradeid) FROM grade;
7.3 查询id和+年龄和
SELECT SUM(gradeid + IFNULL(gradeage,0)) FROM grade;
7.4 查询平均年龄
SELECT AVG(gradeage) FROM grade;
7.5 查询最大年龄和最小年龄
SELECT MIN(gradeage) FROM grade;
SELECT MAX(gradeage) FROM grade;
八、分组查询
8.1 group by
当group by 单独使用时,只能显示每组的第一条数据,意义不大
SELECT * FROM grade GROUP BY sex;
8.2 对年龄分组
SELECT gradeage FROM grade GROUP BY gradeage;
8.3 查询对应分组里面的人
可以简单看成是一个数组
SELECT gradeage,GROUP_CONCAT(`gradename`) FROM grade GROUP BY gradeage;
8.4 查询每个组的年龄之和
SELECT gradeage,GROUP_CONCAT(`gradename`),SUM(gradeage) FROM grade GROUP BY gradeage;
8.5 求每个组的平均年龄
SELECT gradeage,GROUP_CONCAT(`gradename`),AVG(gradeage) FROM grade GROUP BY gradeage;
9.
8.6 having
having只能用于group by 作用和where一样
按照年龄分组 并且找出哪个组的年龄之和大于30
SELECT gradeage,GROUP_CONCAT(gradename),SUM(gradeage) FROM grade
GROUP BY gradeage HAVING SUM(gradeage) > 30;
8.7 查询年龄大于20,并且组的年龄之和大于30,打印出来年龄之和还有姓名
SELECT gradeage,SUM(gradeage),GROUP_CONCAT(`gradename`)FROM grade WHERE gradeage > 20 GROUP BY gradeage HAVING SUM(gradeage) > 30;
- having与where区别
having是在分组后对数据进行过滤;
where是分组前对数据进行过滤;
having后面可以跟分组函数;
where后面不可以跟分组函数; - select语句的书写顺序
select ->from ->where->group by->having->order by->limit - select语句的执行顺序
from->where->group by->having->select->order by->limit - limit的使用
从索引0开始,取3条数据
SELECT * FROM grade LIMIT 0,3;
13. 分页算法
int position;//当前页数
int count;//一页显示几条数据
select * from grade limit ((position-1) * count)+1,count;