爲聚合結果指定條件
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中明確指出了該排序功能未來會被刪除)。