SQL數據庫關鍵字之group by 小結


1、解釋:Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表

2、常見用法:

       創建客戶信息庫(customers)

create table customers(
	customersid int identity(1,1) not null,
	name nvarchar(50),
	city nvarchar(50),
	customerstype nvarchar(50),
	addtime date,
	adddepartment  nvarchar(10),
	quantity int 
)

 插入數據語句

insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張三','中國','普通客戶','2010-10-23','財務部',3)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('李四','法國','主要客戶','2012-11-1','銷售部',2)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('王五','中國','普通客戶','2011-1-12','編輯部',12)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('王六','德國','特殊客戶','2011-1-12','編輯部',5)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('馬七','中國','主要客戶','2012-2-29','財務部',3)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('趙八','德國','特殊客戶','2010-4-23','財務部',6)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('錢九','美國','特殊客戶','2011-6-16','編輯部',2)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('孫十','中國','主要客戶','2012-12-2','銷售部',7)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張四','法國','特殊客戶','2010-11-2','編輯部',2)
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張五','中國','普通客戶','2012-11-23','銷售部',1)

表查詢結果如下

 

customersid    name       city  customerstype addtime adddepartment        quantity

1     張三       中國       普通客戶       2010-10-23     財務部    3

2     李四       法國       主要客戶       2012-11-01     銷售部    2

3     王五       中國       普通客戶       2011-01-12     編輯部    12

4     王六       德國       特殊客戶       2011-01-12     編輯部    5

5     馬七       中國       主要客戶       2012-02-29     財務部    3

6     趙八       德國       特殊客戶       2010-04-23     財務部    6

7     錢九       美國       特殊客戶       2011-06-16     編輯部    2

8     孫十       中國       主要客戶       2012-12-02     銷售部    7

9     張四       法國       特殊客戶       2010-11-02     編輯部    2

10    張五       中國       普通客戶       2012-11-23     銷售部    1

2.1 group by [ ]

       這個是 group by 最常見的用法 ,group by [分組的字段1,分組字段2….]

       例如:對customers 根據 customerstype 進行分組

語句:
select customerstype 
from customers 
group by customerstype
運行結果如下 
customerstype
普通客戶
特殊客戶
主要客戶

 解釋:1、SELECT子句中的列名必須為分組列或列函數

    2、列函數對於GROUP BY子句定義的每個組各返回一個結果”,根據customerstype分組,對每個類型返回一個結果

2.2 group by 常和 sum,max,min ,count 等聚合函數一起使用

例如:對 customers根據 customerstype 進行分組 統計每個類別中的客戶個

語句:
select customerstype,COUNT(*) 
from customers 
group by customerstype
運行結果如下
customerstype	number
普通客戶	              3
特殊客戶	              4
主要客戶	              3

 例如:對 customers根據 customerstype 進行分組 獲取每組的最大customersid

語句:
select customerstype,MAX(customersid) as number 
from customers 
group by customerstype
運行結果如下
customerstype	number
普通客戶	              10
特殊客戶	               9
主要客戶	               8

 2.3 group by 字句和where 字句一起使用

       在SQL中where字句的運行順序是先於 group by 字句的,where 字句會會在形成組和計算列函數之前消除不符合條件的行

例如:查詢由財務部門添加的用戶各個類型的最大customersid

語句:
select customerstype,MAX(customersid) as number 
from customers 
where adddepartment='財務部' 
group by customerstype
運行結果如下
customerstype	number
普通客戶	                1
特殊客戶	                6
主要客戶	                5

 解釋:where 字句過濾掉了不是 財務部 添加的用戶信息,再對之后的結果進行 group by 操作

2.4 group by 字句和having() 字句一起使用

       在SQL 中 having() 字句的運行順序是后於 group by 字句的, having() 字句的的作用是篩選滿足條件的組

例如:查詢客戶數超過1個的國家和客戶數量

語句:
select city, count(*) number 
from customers  
GROUP by  city 
having count(*)>1
運行結果如下
city	number
德國	  2
法國	  2
中國	  5

 解釋:系統會先對customers 根據 city 分組,生產虛擬表,之后having 生產的虛擬表進行篩選,將數量不大於1的剔除

2.5 group by 字句和ROLLUP()一起使用

 可方便的生成"合計"、"小計"、"總計" 等混合統計的報表

例如語句
SELECT city,customerstype, sum(quantity) quantity
FROM customers
GROUP BY ROLLUP (city,customerstype)
運行結果如下
city    customerstype	quantity
德國	特殊客戶	              11
德國	NULL	            11
法國	特殊客戶	               2
法國	主要客戶	               2
法國	NULL	             4
美國	特殊客戶	             2
美國	NULL	             2
中國	普通客戶	              16
中國	主要客戶	              10
中國	NULL	            26
NULL	NULL	            43

 解釋:①ROLLUP會為 (city,customerstype)、和 (city) 值的每個唯一組合生成一個帶有小計的行。還將計算一個總計行

       ②列是按照從右到左的順序匯總的。列的順序會影響 ROLLUP 的輸出分組,而且可能會影響結果集內的行數

2.6 group by 字句和CUBE()一起使用

生成簡單的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。

CUBE 針對表達式的所有排列輸出一個分組。

例如語句
SELECT city,customerstype, SUM (quantity) quantity
FROM customers
GROUP BY CUBE (city,customerstype)
運行結果如下
city	customerstype	quantity
中國	普通客戶	16
NULL	普通客戶	16
德國	特殊客戶	11
法國	特殊客戶	2
美國	特殊客戶	2
NULL	特殊客戶	15
法國	主要客戶	2
中國	主要客戶	10
NULL	主要客戶	12
NULL	NULL	43
德國	NULL	11
法國	NULL	4
美國	NULL	2
中國	NULL	26

 解釋:①CUBE會為 (city,customerstype)、(city) 和 (customerstype) 值的每個唯一組合生成一個帶有小計的行,還會生成一個總計行。

     ②CUBE中列的順序不影響 CUBE 的輸出。

2.7 group by all

group by all 需和 where 一起使用,否則all 不起作用,查詢結果中包含又 group by 字句產生的所有分組,即使這些組沒有符合 where 字句的條件 ,這些沒有符合條件的結果會以 null  顯示

例如:
select city,SUM(quantity) quantity 
from customers 
where quantity>5 
group by all city
運行的結果為
city	quantity
德國	6
法國	NULL
美國	NULL
中國	19
解釋:其中 法國和美國 quantity 的和值不符合 where 條件,分別為 4 和2,單仍然在查詢的結果中顯示
以上語句,將all 去掉后,運行的結果如下
德國	6
中國	19

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM