sql中的group by 用法解析: -- Group By語句從英文的字面意義上理解就是「根據(by)必定的規則進行分組(Group)」。 --它的做用是經過必定的規則將一個數據集劃分紅若干個小的區域,而後針對若干個小區域進行數據處理。 --注意:group by 是先排序後分組; --舉例子說明:若是要用到group by 通常用到的就是「每這個字」 例如說明如今有一個這樣的表:每一個部門有多少人 就要用到分組的技術 select DepartmentID as '部門名稱', COUNT(*) as '個數' from BasicDepartment group by DepartmentID --這個就是使用了group by +字段進行了分組,其中咱們就能夠理解爲咱們按照了部門的名稱ID --DepartmentID將數據集進行了分組;而後再進行各個組的統計數據分別有多少; --若是不用count(*) 而用相似下面的語法 select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID --將會出現錯誤 --消息 8120,級別 16,狀態 1,第 1 行 --選擇列表中的列 'BasicDepartment.DepartmentName' 無效,由於該列沒有包含在聚合函數或 GROUP BY 子句中。 --這就是咱們須要注意的一點,若是在返回集字段中,這些字段要麼就要包含在Group By語句的後面, --做爲分組的依據;要麼就要被包含在聚合函數中。 --出現的錯誤詳解:我們看看group by 的執行的過程,先執行select 的操做返回一個程序集, --而後去執行分組的操做,這時候他將根據group by 後面的字段 --進行分組,而且將相同的字段並稱一列數據,若是group by 後面沒有這個字段的話就要分紅好多的數據。 --可是分組就只能將相同的數據分紅兩列數據,而一列中又只能放入一個字段,因此那些沒有進行分組的 --數據系統不知道將數據放入哪裏,因此就出現此錯誤 --目前一種分組狀況只有一條記錄,一個數據格是沒法放入多個數值的, --因此這裏就須要經過必定的處理將這些多值的列轉化成單值,而後將其放在對應的 --數據格中,那麼完成這個步驟的就是聚合函數。這就是爲何這些函數叫聚合函數(aggregate functions)了 --group by all語法解析: --若是使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的全部組,即便某些組沒有符合搜索條件的行。 --沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。 select DepartmentID,DepartmentName as '部門名稱', COUNT(*) as '個數' from BasicDepartment group by all DepartmentID,DepartmentName --group by 和having 解釋:前提必須瞭解sql語言中一種特殊的函數:聚合函數, --例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們通常做用在多條記錄上。 --WHERE關鍵字在使用集合函數時不能使用,因此在集合函數中加上了HAVING來起到測試查詢結果是否符合條件的做用。 create TABLE Table1 ( ID int identity(1,1) primary key NOT NULL, classid int, sex varchar(10), age int, ) --添加測試數據 Insert into Table1 values(1,'男',20) Insert into Table1 values(2,'女',22) Insert into Table1 values(3,'男',23) Insert into Table1 values(4,'男',22) Insert into Table1 values(1,'男',24) Insert into Table1 values(2,'女',19) Insert into Table1 values(4,'男',26) Insert into Table1 values(1,'男',24) Insert into Table1 values(1,'男',20) Insert into Table1 values(2,'女',22) Insert into Table1 values(3,'男',23) Insert into Table1 values(4,'男',22) Insert into Table1 values(1,'男',24) Insert into Table1 values(2,'女',19 --舉例子說明:查詢table表查詢每個班級中年齡大於20,性別爲男的人數 select COUNT(*)as '>20歲人數',classid from Table1 where sex='男' group by classid,age having age>20 --須要注意說明:當同時含有where子句、group by 子句 、having子句及彙集函數時,執行順序以下: --執行where子句查找符合條件的數據; --使用group by 子句對數據進行分組;對group by 子句造成的組運行彙集函數計算每一組的值;最後用having 子句去掉不符合條件的組。 --having 子句中的每個元素也必須出如今select列表中。有些數據庫例外,如oracle. --having子句和where子句均可以用來設定限制條件以使查詢結果知足必定的條件限制。 --having子句限制的是組,而不是行。where子句中不能使用匯集函數,而having子句中能夠。