SQL基礎學習總結:5(HAVING子句的使用&&ORDER BY排序子句的使用)

爲聚合結果指定條件

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語句,但是使用列編號可能會造成一些問題。
不要使用列編號理由如下:

  1. 代碼閱讀起來比較困難;
  2. 該功能將來會被刪除(SQL-92中明確指出了該排序功能未來會被刪除)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章