SQL学习五-having,order by, limit
今天将SQL使用的工具提升了,从workbench提升到了navicate.
数据准备
今天使用的数据是前面几节中使用到的数据
ID | NAME | CLASSID |
---|---|---|
1 | xiaoming | 1 |
2 | xiaowang | 1 |
3 | xiaotian | 2 |
4 | xiaoming | 2 |
5 | xiaowang | 3 |
6 | xiaotian | 4 |
7 | xiaogang | 1 |
8 | xiaoqiang | 1 |
9 | xiaojing | 2 |
10 | xiaotie | 2 |
11 | wangqiang | 3 |
12 | wangwei | 3 |
13 | liming | 4 |
14 | liqiang | 4 |
插入语句如下:
INSERT INTO Student
VALUES
(1, 'xiaoming', 1),
(2, 'xiaowang', 1),
(3, 'xiaotian', 2),
(4, 'xiaoming', 2),
(5, 'xiaowang', 3),
(6, 'xiaotian', 4),
(7, 'xiaogang', 1),
(8, 'xiaoqiang', 1),
(9, 'xiaojing', 2),
(10, 'xiaotie', 2),
(11, 'wangqiang', 3),
(12, 'wangwei', 3),
(13, 'liming', 4),
(14, 'liqiang', 4);
今天学习having,order by, limit就在这14条基础上学习。
简单复习一下各个语句的执行顺序
-- 各个语句写的顺序
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
-- 各个语句执行的顺序
FROM ...
WHERE ...
GROUP BY ...
SELECT ...
HAVING ...
ORDER BY ...
LIMIT ...
HAVING
HAVING的作用也是过滤,但是按照执行的顺序来看,HAVING的过滤是在GROUP BY/SELECT之后的过滤,
HAVING一般是用于什么样的过滤呢?GROUP BY 和SELECT之后的过滤,而WHERE则是在FROM之后的过滤,GROUP BY 和SELECT之后的内容无法过滤
看一个例子:
查询每个班级中人数大于3的班级号是多少?
首先在这个里面,需要写的内容有:FROM student ,因为有每个班级,故需要按照CLASSID进行分组,但是这个条件是在分组完成之后再进行判断的,故需要执行顺序在GROUP BY 后面的过滤语句,就是HAVING。
按照上面的分析写SQL:
SELECT CLASSID FROM student
GROUP BY CLASSID
HAVING COUNT(1) > 3;
根据上述使用的数据,其查询结果如下:
当前结果表明班级号为1和2的班级的人数是大于三的。
将当前的having语句和前面学习到的相关内容结合起来,搞一个新的语句,该语句查询了班级号大于3的班级,将相关信息拼接起来后的结果,该SQL的执行结果如下:
SELECT NAME, CLASSID, GROUP_CONCAT(ID, '@', NAME, '@', CLASSID)
FROM Student
GROUP BY CLASSID
HAVING CLASSID > 3;
ORDER BY
排序,ORDER BY的执行顺序是在HAVING之后的,该关键字的作用是将某列或者某些列按照某种顺序进行排序,默认是ASC,可以写DESC,
该字段可以使用的值是前面的SQL语句生成的字段都可以,例如下面的语句,除了可以用常规的字段排序之外,还可以使用生成的新列 n,进行排序
SELECT COUNT(1) AS n, CLASSID, NAME FROM student
GROUP BY CLASSID HAVING n >= 1;
对于上面的结果,再执行排序,即添加ORDER BY 字段,可得结果如下
SELECT COUNT(1) AS n, CLASSID, NAME FROM student
GROUP BY CLASSID HAVING n > =1
ORDER BY CLASSID DESC;
此外,ORDER BY 后面还可以写多个属性,表示,如果第一个属性的值相等,那么将按照下一个属性排序. 例如下面的SQL语句,从结果中可以看出,在CLASSID相同时,会按照ID属性排序
SELECT * FROM student
WHERE CLASSID IN (1, 2)
ORDER BY CLASSID, ID;
LIMIT
LIMIT是最后一个执行的SQL关键字,用于在前面的SQL执行后取部分结果,
比较简单的用法,LIMIT 5,是指取前5条记录
直接使用上面的SQL语句加上这句话,就是在刚才的结果下取前5条记录
SELECT * FROM student
WHERE CLASSID IN (1, 2)
ORDER BY CLASSID, ID
LIMIT 5;
还有另外一种用法,LIMIT A, B,是指从A开始取B条,例如在刚才的语句下取LIMIT 1, 4,是该刚才的记录下的第二条到第五条。
SELECT * FROM student
WHERE CLASSID IN (1, 2)
ORDER BY CLASSID, ID
LIMIT 1, 4;