Posted on 2008-08-12 15:49
Prayer 閱讀(859)
評論(0) 編輯 收藏 引用 所屬分類:
數(shù)據(jù)庫,SQL
*************************************************************************************
分組查詢
*************************************************************************************
在select 語句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個組的匯總信息,另外,可以使用having子句限制返回的結(jié)果集。group by 子句可以將查詢結(jié)果分組,并返回行的匯總信息SQLServer 按照group by 子句中指定的表達(dá)式的值分組查詢結(jié)果。
-------------------------------------------------------------------------------------
分組查詢一般是用來進(jìn)行統(tǒng)計需求的,要進(jìn)行分組查詢必須使用group by子句或having子句,在分組統(tǒng)計時要用到SQL的多行存儲函數(shù)。在where條件中不能使用多行存儲函數(shù).
查詢語句的select 和group by ,having 子句是聚組函數(shù)唯一出現(xiàn)的地方,在where 子句中不能使用聚組函數(shù)。
在帶有g(shù)roup by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數(shù).
------------------------------------------------------------------------------------
部門表department:
department_id department_name
10 開發(fā)部
20 測試部
30 用服部
40 財務(wù)部
50 培訓(xùn)部
雇員表employees:(department_id為外鍵)
id employees_name department_id
1 cheng 10
2 zhou 50
3 liguo 10
4 wang 20
5 feng 30
6 ling 30
7 wu 20
8 tang 20
9 yang 40
10 tan 50
------------------------------------------------------------------------------------
按部門編號統(tǒng)計出表employees中的每個部門的人數(shù)(group by分組查詢)
select department_id, count(*) from employees
group by department_id;
顯示出部門人數(shù)少于5人的部門編號以及人數(shù)( 按照department_id來分組,having count(*)<5做為限制條件 )
select department_id 部門號, count(*) 部門人數(shù) from employees
group by department_id
having count(*)<5;
--------------------------------------
(注意:having必須在group by子句的后面)
--------------------------------------
圖:
部門號 部門人數(shù)
------------------------------
10 2
20 3
30 2
40 1
50 2
-------------------------------------------------------------------------------------
where子句和having子句可以同時使用,where子句是對要分組的行進(jìn)行過濾,即選擇要分組的行;
而having子句是對分組后的數(shù)據(jù)進(jìn)行過濾。此時where子句必須在group by...having子句之前
-------------------------------------------------------------------------------------
顯示出所有工資大于5000,且部門人數(shù)大于5個的部門號,部門最低工資和部門人數(shù)
select department_id 部門號(記住department_id 和部門號之間要空格), min(salary) 最低工資,count(*) 部門人數(shù) from employees
where salary >5000
group by department_id
having count(*)>5;
圖:
--------------------------------------
部門號 最低工資 部門人數(shù)
80 6100 34
100 6800 6
group by 按照哪個字段來排序查詢,一般的group by和having一起使用,注意在查詢中只能查詢與group by和having有關(guān)的字段。
--------------------------------------
where 子句的作用是在對查詢結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個分組標(biāo)準(zhǔn)進(jìn)行分組。
查詢每個部門的每種職位的雇員數(shù)(待測試...)
select deptno,job,count(*) from emp group by deptno,job;