为聚合结果指定条件
HAVING子句
HAVING子句可以让我们筛选分组之后的各种数据,其语法结构如下:
SELECT <列名1>,<列名2>,<列名3>
FROM <表名>
GROUP BY <列名1>,<列名2>,<列名3>
HAVING <分组结果对应的条件>
例:
使用HAVING子句前:
使用HAVING子句后:
例:
HAVING子句的构成要素
HAVING子句中能够使用的3种要素,如下:
- 常数
- 聚合函数
- GROUP BY子句中指定的列名(即聚合键)
例:HAVING子句的错误范例
product_name列并不包含在GROUP BY子句中,因此不允许写在HAVING子句中,可以理解为GROUP BY子句汇总后得到的表中并不存在product_name这一列。
例:正确示范
对查询结果进行排序
ORDER BY子句
ORDER BY子句可以用来指定排列的顺序,其语法结构如下:
SELECT <列名1>,<列名2>,<列名3>
FROM <表名>
ORDER BY <排序基准点1>,<排序基准点2>,<排序基准点3>,...;
ORDER BY子句中书写的列名称为排序键。
例:
注意:如果有多个排序键的话,优先按照第一个排序键排序,如果该列存在相同值的话,再接着参考右侧的键,如下图所示:
子句书写顺序:
1.SELECT子句→2.FROM子句→3.WHERE子句→4.GROUP BY子句→5.HAVING子句→6.ORDER BY子句
ORDER BY子句子句通常写在SELECT语句的末尾。
指定升序或降序
想要降序排列时,我们可以在列名后面加上DESC关键字。
例:
注:其实使用升序排序时,正式的书写方式应该是使用ASC关键字,但是省略该关键字时会默认使用升序排序。
由于ASC和DESC这两个关键字是以列为单位指定的,因此可以同时指定一个列为升序,指定其他列为降序,例:
NULL的顺序
默认情况下,MySQL将null算作最小值。
例:
在排序键中使用别名
在讲别名的使用之前我们先梳理一下MySQL的子句语法顺序和执行顺序
MySQL中子句的语法顺序:
SELECT[DISTINCT] →FROM→JOIN→ON→WHERE→GROUP BY→HAVING→UNION→ORDER BY→LIMIT
MySQL中子句的执行顺序,即在执行时SQL按照下面的顺序进行执行:
FROM→JOIN→ON→WHERE→GROUP BY(开始使用SELECT中的别名,后面的语句中都可以使用别名)→AVG,SUM,…→HAVING→SELECT→DISTINCT→ORDER BY
由此我们可以在OEDER BY子句中使用别名。
ORDER BY子句中可以使用的列
ORDER BY子句中也可以使用存在于表中、但并不包含在SELECT子句中的列,如下图:
除此以外,还可以使用聚合函数,如下图:
不要使用列编号
列编号是指SELECT子句中的列按照从左到右的顺序进行排列时所对应的编号(1,2,3…)。
例:
以上两个例子的执行结果是一样的,也就是说我们可以使用列编号来执行ORDER BY语句,但是使用列编号可能会造成一些问题。
不要使用列编号理由如下:
- 代码阅读起来比较困难;
- 该功能将来会被删除(SQL-92中明确指出了该排序功能未来会被删除)。