五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > mysql中的group by 和 having 用法詳解

mysql中的group by 和 having 用法詳解

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):710    更新時(shí)間:2017-12-28 11:28   參與評(píng)論

HAVING語(yǔ)句通常與GROUP BY語(yǔ)句聯(lián)合使用,用來(lái)過(guò)濾由GROUP BY語(yǔ)句返回的記錄集。

HAVING語(yǔ)句的存在彌補(bǔ)了WHERE關(guān)鍵字不能與聚合函數(shù)聯(lián)合使用的不足。

語(yǔ)法:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;


同樣使用本文中的學(xué)生表格,如果想查詢平均分高于80分的學(xué)生記錄可以這樣寫(xiě):

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id

HAVING AVG(score)>=80;


在這里,如果用WHERE代替HAVING就會(huì)出錯(cuò)

--sql中的group by 用法解析:
-- Group By語(yǔ)句從英文的字面意義上理解就是“根據(jù)(by)一定的規(guī)則進(jìn)行分組(Group)”。
--它的作用是通過(guò)一定的規(guī)則將一個(gè)數(shù)據(jù)集劃分成若干個(gè)小的區(qū)域,然后針對(duì)若干個(gè)小區(qū)域進(jìn)行數(shù)據(jù)處理。
--注意:group by 是先排序后分組;
--舉例子說(shuō)明:如果要用到group by 一般用到的就是“每這個(gè)字” 例如說(shuō)明現(xiàn)在有一個(gè)這樣的表:每個(gè)部門(mén)有多少人 就要用到分組的技術(shù)
select DepartmentID as '部門(mén)名稱',
COUNT(*) as '個(gè)數(shù)' from BasicDepartment group by DepartmentID

--這個(gè)就是使用了group by +字段進(jìn)行了分組,其中我們就可以理解為我們按照了部門(mén)的名稱ID
--DepartmentID將數(shù)據(jù)集進(jìn)行了分組;然后再進(jìn)行各個(gè)組的統(tǒng)計(jì)數(shù)據(jù)分別有多少;
--如果不用count(*) 而用類似下面的語(yǔ)法
select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID

--將會(huì)出現(xiàn)錯(cuò)誤
--消息 8120,級(jí)別 16,狀態(tài) 1,第 1 行
--選擇列表中的列 'BasicDepartment.DepartmentName' 無(wú)效,因?yàn)樵摿袥](méi)有包含在聚合函數(shù)或 GROUP BY 子句中。
--這就是我們需要注意的一點(diǎn),如果在返回集字段中,這些字段要么就要包含在Group By語(yǔ)句的后面,
--作為分組的依據(jù);要么就要被包含在聚合函數(shù)中。
--出現(xiàn)的錯(cuò)誤詳解:咱們看看group by 的執(zhí)行的過(guò)程,先執(zhí)行select 的操作返回一個(gè)程序集,
--然后去執(zhí)行分組的操作,這時(shí)候他將根據(jù)group by 后面的字段
--進(jìn)行分組,并且將相同的字段并稱一列數(shù)據(jù),如果group by 后面沒(méi)有這個(gè)字段的話就要分成好多的數(shù)據(jù)。
--但是分組就只能將相同的數(shù)據(jù)分成兩列數(shù)據(jù),而一列中又只能放入一個(gè)字段,所以那些沒(méi)有進(jìn)行分組的
--數(shù)據(jù)系統(tǒng)不知道將數(shù)據(jù)放入哪里,所以就出現(xiàn)此錯(cuò)誤
--目前一種分組情況只有一條記錄,一個(gè)數(shù)據(jù)格是無(wú)法放入多個(gè)數(shù)值的,
--所以這里就需要通過(guò)一定的處理將這些多值的列轉(zhuǎn)化成單值,然后將其放在對(duì)應(yīng)的
--數(shù)據(jù)格中,那么完成這個(gè)步驟的就是聚合函數(shù)。這就是為什么這些函數(shù)叫聚合函數(shù)(aggregate functions)了

--group by all語(yǔ)法解析:
--如果使用 ALL 關(guān)鍵字,那么查詢結(jié)果將包括由 GROUP BY 子句產(chǎn)生的所有組,即使某些組沒(méi)有符合搜索條件的行。
--沒(méi)有 ALL 關(guān)鍵字,包含 GROUP BY 子句的 SELECT 語(yǔ)句將不顯示沒(méi)有符合條件的行的組。
select DepartmentID,DepartmentName as '部門(mén)名稱',
COUNT(*) as '個(gè)數(shù)' from BasicDepartment group by all  DepartmentID,DepartmentName


--group by 和having 解釋:前提必須了解sql語(yǔ)言中一種特殊的函數(shù):聚合函數(shù),
--例如SUM, COUNT, MAX, AVG等。這些函數(shù)和其它函數(shù)的根本區(qū)別就是它們一般作用在多條記錄上。 
--WHERE關(guān)鍵字在使用集合函數(shù)時(shí)不能使用,所以在集合函數(shù)中加上了HAVING來(lái)起到測(cè)試查詢結(jié)果是否符合條件的作用。
 create TABLE Table1
    (
        ID int identity(1,1) primary key NOT NULL,   
        classid int, 
        sex varchar(10),
        age int, 
    ) 
    
--添加測(cè)試數(shù)據(jù)
    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


--舉例子說(shuō)明:查詢table表查詢每一個(gè)班級(jí)中年齡大于20,性別為男的人數(shù)
select COUNT(*)as '>20歲人數(shù)',classid  from Table1 where sex='男' group by classid,age having age>20 
--需要注意說(shuō)明:當(dāng)同時(shí)含有where子句、group by 子句 、having子句及聚集函數(shù)時(shí),執(zhí)行順序如下:
--執(zhí)行where子句查找符合條件的數(shù)據(jù);
--使用group by 子句對(duì)數(shù)據(jù)進(jìn)行分組;對(duì)group by 子句形成的組運(yùn)行聚集函數(shù)計(jì)算每一組的值;最后用having 子句去掉不符合條件的組。
--having 子句中的每一個(gè)元素也必須出現(xiàn)在select列表中。有些數(shù)據(jù)庫(kù)例外,如oracle.
--having子句和where子句都可以用來(lái)設(shè)定限制條件以使查詢結(jié)果滿足一定的條件限制。
--having子句限制的是組,而不是行。where子句中不能使用聚集函數(shù),而having子句中可以。
 

   group by 一般和聚合函數(shù)一起使用才有意義,比如 count sum avg等,使用group by的兩個(gè)要素:
   (1) 出現(xiàn)在select后面的字段 要么是是聚合函數(shù)中的,要么就是group by 中的.
   (2) 要篩選結(jié)果 可以先使用where 再用group by 或者先用group by 再用having

下面看下 group by多個(gè)條件的分析:

在SQL查詢器輸入以下語(yǔ)句
create table test
(
a varchar(20),
b varchar(20),
c varchar(20)
)

insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','乙')
insert into test values(1,'b','乙')
insert into test values(1,'b','乙')
insert into test values(1,'b','乙')

第一次查詢

select * from test; 結(jié)果如下圖:

 

結(jié)果中 按照b列來(lái)分:則是 5個(gè)a 3個(gè)b.


按照c列來(lái)分:則是 4個(gè)甲 4個(gè)乙.


第二次 按照 b列來(lái)分組 代碼如下
select   count(a),b from test group by b

第三次 按照 c列來(lái)分組 代碼如下
select count(a),c from test group by c


第四次 按照 b c兩個(gè)條件來(lái)分組
select count(a),b,c from test group by b,c

第五次 按照 c b 順序分組
select count(a),b,c from test group by c,b

可以看出 group by 兩個(gè)條件的工作過(guò)程:

先對(duì)第一個(gè)條件b列的值 進(jìn)行分組,分為 第一組:1-5, 第二組6-8,然后又對(duì)已經(jīng)存在的兩個(gè)分組用條件二 c列的值進(jìn)行分組,發(fā)現(xiàn)第一組又可以分為兩組 1-4,5

如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (710人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)