点击蓝字“程序员考拉”欢迎关注!

一.HAVING子句
一个选择语句块的HAVING子句和WHERE子句的目的相同,WHERE子句用来在FROM子句处理之后选择一行,而HAVING子句用来在GROUP BY子句处理之后选择一行。一个HAVING子句可以单独使用而不使用GROUP BY子句。
HAVING是分组之后的,所以HAVING之后的条件表达式可以使用聚合函数,而WHERE之后的条件表达式不能使用聚合函数。
1.HAVING子句的例子:
原始数据库:



2.没有GROUP BY的HAVING子句。
如果一个HAVING子句之前没有GROUP BY子句,那么表中的所有行都分组为一行。


3.HAVING子句的一般规则
HAVING子句中的所有列指定必须出现在一个聚合函数中,或者出现在GROUP BY子句指定的列的列表中。
二.ORDER BY子句
在SELECT语句的末尾添加一个ORDER BY子句,只是保证最终结果中的行按照一定的顺序进行排列。
1.按照列名排序


2.根据表达式进行排序
对于所有球员,获取姓,首字母,球员号码,按照姓的首字母进行排序:
SELECT NAME,INITIALS,PLAYERNO FROM PLAYERS ORDER BY SUBSTR(NAME,1,1)
ORDER BY子句中的表达式可以包含子查询。
获取球员号码和所有罚款额,并且按照罚款额和平均罚款额之间的差值来对结果排序:
SELECT PLAYERNO,AMOUNT FROM PENALTIES ORDER BY ABS(AMOUNT-SELECT AVG(AMOUNT) FROM PENALITIES)
3.使用顺序号码排序
SELECT PLAYERNO,NAME FROM PLAYERS ORDER BY NAME
等同于:
SELECT PALYERNO,NAME FROM PLAYERS ORDER BY 2
4.使用升序,降序进行排序

5.空值参与排序
MySQL把空值当做一列中的最小值。
三.LIMIT子句
LIMIT子句是选择语句块的最后一个子句,它选取了行的一个子集,中间结果中的行可以再次减少,表示了最前面的和最后面的多少个行能被选取。
1.选取sal最多的前四个职员的ID和sal:

2.获取薪资最低的三个球员的id,name和sal,如果sal相同,则只显示id最大的那些职员:

SAL最低排名1000,1500各一个,1900的有两个,只能选取前三个,根据“只显示id最大的那些职员”,添加ORDER BY的第二个条件为ID DESC。
3.四个薪资最低的职员的平均薪资是多少:

4.获取最低的四个薪资,并且略去重复的薪资:

5.使用LIMIT子句的子查询
在薪资最高的六个球员的一组中,获取id号最小的三个球员的id和sal:

6.带有偏移量的LIMIT
获取具有最低薪资的5个职员的id和薪资,从sal=1900(最低薪资中排第二)开始:


LIMIT限制的是GROUP BY后面的第一个条件:


ORDER BY先满足第一个条件,第一个条件有满足的结果的重复值再看第二个条件:

7.SQL_CALC_FOUND_ROWS选择选项。
在一条SELECT语句已经执行了LIMIT子句之后,询问一下如果我们没有执行LIMIT子句,在最终结果中将会出现的行的总的数目,通过在执行了LIMIT子句的SELECT语句中指定选择选项SQL_CALC_FOUND_ROWS可以达到这个目的。然后使用查询语句SELECT FOUND_ROWS()进行查询。

