分組原理(GROUP BY子句)1:GROUP BY子句基本語法規則

分組原理(GROUP BY子句)1:GROUP BY子句基本語法規則

若覺得本文寫得還可以,請多多關注本人所作書籍《C++語法詳解》電子工業出版社出版,作者 黃勇

本文爲原創文章,轉載請註明出處,或註明轉載自“黃邦勇帥(原名:黃勇)

本小節需要使用聚合函數,聚合函數用於對一組值執行計算,並返回單個值,聚合函數只能用於SELECT語句的選擇列表和HAVING子句中作爲表達式使用,通常,聚合函數與GROUP BY子句一起使用。使用聚合函數的表達式被稱爲聚合表達式。比如SUM()用於求合,其用法如下,聚合函數的詳細規則及使用,詳見後文

SELECT SUM(b) FROM T3		--將輸出表T3.b這一列中所有值的和

一、GROUP BY子句基本語法規則
1、GROUP BY用於把該子句之前邏輯階段處理後的查詢結果進行分組,在完整的SELECT語句中,GROUP BY子句在第5階段被處理。
2、GROUP BY子句的基本語法(非完整)如下:

GROUP BY column-expression [ ,...n ]   --column-expression表示分組列

3、column-expression(分組列)的要求如下(詳見示例):
 分組列必須是列或列上的非聚合計算,也就是說,分組列可以是表達式,但該表達式必須引用列(比如,不能引用常量),並且不能是聚合表達式(即,使用聚合函數)。
 分組列不能是子查詢,也不能是索引視圖中的列。
 分組列必須出現在SELECT語句的FROM子句中,但不需要出現在SELECT的選擇列表中。也就是說,分組列必須是FROM子句中指定的表的列名,不能是來自外部引用的列名。
4、使用GROUP BY子句時的其他重要規則
 若使用了GROUP BY子句,則邏輯處理順序在GROUP BY階段之後的所有子句(包括、HAVING、SELECT、ORDER BY等)的操作對象都將是組,而不再是單獨的行,SELECT語句的查詢結果也只會爲每個組返回一行。也就是說,在GROUP BY階段之後的子句中的所有表達式務必保證爲每個組只返回一個標量值(即單值)。
 SELECT選擇列表中的列必須包含在GROUP BY子句的分組列表中,除非選擇列是聚合表達式(因爲聚合函數可保證返回的值是單一的),比如選擇列使用聚合函數,或者把未在分組列表中的列作爲聚合函數的參數。
 若分組列包含NULL值,則所有的 NULL 值都被視爲相等,並置入同一個組中。
 另外,還應注意各子句的邏輯處理順序,比如,分組列不能是SELECT選擇列表中定義的列別名(因爲SELECT子句位於GROUP BY子句之後執行),但可以是FROM子句中定義的派生表的列別名(因爲FROM子句先於GROUP BY子句執行)。
 下面以示例講解分組的原理及SELECT語句的輸出規則,語句如下,輸出結果及表T3的內容見圖XXX

SELECT a FROM T3 GROUP BY a

由於SELECT選擇列表的列必須包含在分組列表之中(聚合表達式除外),因此SELECT語句只能輸出由GROUP BY子句分組列表中指定的列的內容(含聚合表達式的列除外),若某一組包含多行(如圖XXX的分組4),由於SELECT選擇列表中的列是參與了分組的(如圖XXX,選擇列表中的列只能是列a),因此只能輸出這些參與了分組的列,但因爲這些列所在行的值是相同的且位於同一組(如圖XXX,分組4列a的兩行的值是相同的,並位於同一組),因此,SELECT語句只需輸出其中的一行即可,這樣就保證了SELECT語句只輸出分組中的一行,輸出結果如圖XXX所示,其中分組4將只會輸出一行(值爲4的行),不會輸出兩行。注意,若語句修改爲

SELECT a FROM T3 GROUP BY a,b

即,使用列a和列b對錶T3進行分組,則會輸出兩行值爲4的行,因爲此時(4, 44, 444)與(4, 441, 4441)兩行現在被分爲兩組了,他們不在同一組了,因此兩組都會被輸出。
在這裏插入圖片描述

示例5.01:GROUP BY分組列的基本要求(表T3包含a, b, x共三列)
--SELECT a FROM T3 GROUP BY 3+4		--錯誤,分組列沒有引用表的列
--SELECT a FROM T3 GROUP BY SUM(a)		--錯誤,分組列不能是聚合表達式(SUM是聚合函數)
SELECT 3+a as S FROM T3 GROUP BY 3+a	--正確,表達式3+a引用了表的列名
--SELECT b FROM T3 GROUP BY (SELECT b from T3 where a=1)	--錯誤,分組列不能是子查詢
SELECT a FROM T3 GROUP BY a,b			--正確,分組列不必出現在SELECT的選擇列表中

示例5.02:選擇列與分組列的關係(表T3包含a, b, x共三列)
 --重點理解選擇列表中的列包含在分組列表中的意思,以下爲一些示例
--SELECT b FROM T3 GROUP BY a			--錯誤,SELECT選擇列表中的列b未在分組列表中
SELECT a,SUM(3) FROM T3 GROUP BY a 	--正確,選擇列可以是聚合表達式(即SUM(3))
--SELECT * FROM T3 GROUP BY a,b		--錯誤,*表示所有列,其中列x不在分組列表中
SELECT 3+a FROM T3 GROUP BY a			--正確,選擇列3+a使用的列a包含在分組列表中
--SELECT a FROM T3 GROUP BY 3+a		--錯誤,分組列表中的列爲(3+a)
--SELECT a+3 FROM T3 GROUP BY 3+a		--錯誤,同上,注意:這裏3+a與a+3並不相同
SELECT 3+a+4 FROM T3 GROUP BY 3+a		--正確
--SELECT 1+2+a FROM T3 GROUP BY 3+a	--錯誤
--SELECT 4+3+a FROM T3 GROUP BY 3+a	--錯誤,但把3+a加上括號就是正確的,如下
SELECT 4+(3+a) FROM T3 GROUP BY 3+a	--正確
SELECT a+b FROM T3 GROUP BY a,b		--正確
--SELECT a FROM T3 GROUP BY a+b		--錯誤,分組列表中的列爲(a+b),而不是a和b
--SELECT b+a FROM T3 GROUP BY a+b		--錯誤,同上

示例5.03:使用GROUP BY子句分組後的效果(輸出結果見圖)
SELECT sum(b) AS sb FROM T3 				--語句1,SUM是聚合函數,用於對列進行求和
SELECT a,sum(b)AS sb FROM T3 GROUP BY a	--語句2

在這裏插入圖片描述
示例XXX的說明:
1、以上示例運行原理,如圖XXX所示,語句2按照列a的值把表T3的行分成了6組,其中第4組包含兩行內容,其餘的組都只包含一行的內容
2、在未進行分組時(即語句1),對b列進行求和,得到的是列b所有行(共7行)的值的和,當進行分組後(即語句2),對b列進行求和得到的是每個組中(即以組爲對象)b列所有行的值的和。比如,分組4,包含兩行,對b列進行求和,將只對這兩行的值進行求和,但對於該分組,SELECT語句只輸出一行,即列a的值爲4的行。由於其餘分組都只有一行內容,因此對b列求和的結果就是該行的值。

示例5.04:GROUP BY實際應用(求出每年的總銷量,輸出結果見圖XXX)

SELECT YEAR(日期) AS 年分,SUM(銷量) AS 年銷量 FROM T6 GROUP BY YEAR(日期)

在這裏插入圖片描述

作者:黃邦勇帥(原名:黃勇)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章