sql中的group by 和 having 用法解析
-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子句中可以。
相關文章
- SQL中 where 子句和having子句中的區別SQL
- [原始碼解析] GroupReduce,GroupCombine 和 Flink SQL group by原始碼SQL
- group by,having查詢 ”每**“的查詢
- SQL函式Group_concat用法SQL函式
- sql中union和union all的用法SQL
- SQL中Merge的用法SQL
- SQL -去重Group by 和Distinct的效率SQL
- sql devloper 用法的和SQL 編寫SQLdev
- SQL Server中GROUP BY(連結)SQLServer
- having和where
- 聚合函式及分組與過濾(GROUP BY … HAVING)函式
- SQL中的遞迴用法SQL遞迴
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- 帶你瞭解資料庫中group by的用法資料庫
- 神奇的 SQL 之 HAVING → 容易被輕視的主角SQL
- Mysql系列第九講 分組查詢詳解(group by & having)MySql
- SQL資料庫中Truncate的用法SQL資料庫
- SQL AS 的用法SQL
- 正規表示式以及group的用法
- MySQL之Where和Having的區別MySql
- sql中的left切割 與 group by後的兩次分組SQL
- oracle中distinct和group by的區別Oracle
- ORACLE SQL解析之硬解析和軟解析OracleSQL
- 深入解析Vue中watch的高階用法Vue
- PostgreSQL DBA(186) - SQL Group BySQL
- RecyclerView用法和原始碼深度解析View原始碼
- having
- SQL改寫的方法,select group by sumSQL
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 爬蟲智慧解析庫 Readability 和 Newspaper 的用法爬蟲
- Laravel 中 sql 查詢 使用 group by 報錯問題。LaravelSQL
- SQL語句IN的用法SQL
- SQL-Hive中的Select From解析SQLHive
- HAVING子句的力量
- mysql的having和where有什麼區別MySql
- SQL語句中不同的連線JOIN及SQL中join的各種用法SQL
- 資料庫的sort group by和hash group by資料庫
- sql case when, Exist ,group by ,聚合SQL
- [SQL]group by和order by是否能寫欄位別名SQL