GROUP BY 和 ORDER BY 都是具有相似功能的子句(或陳述式),也就是排序查詢結果。但是,它們的目的截然不同。實際上差異非常大,以至於它們可以單獨使用或一起使用。如果你不確定要使用哪一個,事情可能會變得有點冒險。在今天的文章中,我們將學習這兩個子句的功能以及如何一起使用它們以最終控制查詢的輸出。為此,我們將使用 Navicat Premium 和 Sakila 範例資料庫。
GROUP BY 和 ORDER BY 的解釋
ORDER BY 子句的目的是以一欄或多欄排序查詢結果。同時,GROUP BY 子句用於借助COUNT()、AVG()、MIN() 和 MAX() 等的彙總函式分組資料。它的工作方式是,如果特定的欄在不同的列中具有相同的值,它會將這些列合併為一組。
讓我們看看每個子句的範例。
以下的顯示資料表 actor 中所有演員的名字(first_name)和姓氏(last_name),並先以姓氏排序,然後再以名字排序:
現在,以下是另一個查詢,根據演員編號分組,得出他們參演的電影數量:
一起使用 GROUP BY 和 ORDER BY
注意,在前面的查詢中,記錄由 actor_id 欄位排序,這是對結果的分組。如果我們想使用不同的欄位(即非分組欄位)排序結果,則必須加入 ORDER BY 子句。以下是相同的查詢,但以每名演員參演的電影數量由多至少排列:
請注意,一旦包含 ORDER BY 子句,預設的組排序就會丟失。如果你想保留它,可以將分組的欄加入 ORDER BY 的欄位清單中:
注意事項
在組合 GROUP BY 和 ORDER BY 子句時,請記住 SELECT 陳述式中放置子句的位置是非常重要:
- GROUP BY 子句放在 WHERE 子句的後面。
- GROUP BY 子句放在 ORDER BY子句的前面。
GROUP BY 是在 ORDER BY 陳述式之前,因為後者會處理查詢的最終結果。
額外部分:HAVING 子句
你可以使用 HAVING 子句進一步篩選分組的資料。HAVING 子句與 WHERE 子句類似,但是它是處理列組而不是單個列。為了說明 HAVING 子句是如何工作,我們可以使用它來將結果限制為參演過十部電影的演員:
Navicat 的 SQL 編輯器具有語法突顯、用於控制流程/DDL/語法陳述式的可重用程式碼片段以及自動完成程式碼功能,大幅地加快撰寫查詢的速度。它的建議包括結構描述、資料表、欄、預存程序和函式的所有內容。以下是 HAVING 關鍵字:
HAVING 子句應放在 GROUP BY 子句的後面,ORDER BY 子句的前面。
總結
在今天的文章中,我們了解了這兩個子句的功能,以及如何在 Navicat Premium 中一起使用它們對查詢輸出進行最終控制。
如果你對 Navicat Premium 感興趣,可以免費試用 14 天!
Rob Gravelle 居住於加拿大渥太華,是一名有 20 多年經驗的 IT 專家。過住,Rob 曾為情報相關的組織(如加拿大邊境服務局和各種商業組織)建置系統。如果你想僱用 Rob,可以傳送電子郵件到 rgconsulting(AT)robgravelle(DOT)com。在業餘時間,Rob 是一名出色的吉他演奏家,並發行了幾張 CD。