佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > sql中的 where 、group by 和 having 用法解析

sql中的 where 、group by 和 having 用法解析

熱門(mén)標(biāo)簽:Linux服務(wù)器 呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 服務(wù)外包 AI電銷(xiāo) 鐵路電話系統(tǒng) 地方門(mén)戶網(wǎng)站 百度競(jìng)價(jià)排名

廢話不多說(shuō)了,直接給大家貼代碼了,具體代碼如下所示:

--sql中的 where 、group by 和 having 用法解析

--如果要用到group by 一般用到的就是“每這個(gè)字” 例如說(shuō)明現(xiàn)在有一個(gè)這樣的表:每個(gè)部門(mén)有多少人 就要用到分組的技術(shù)

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

--將會(huì)出現(xiàn)錯(cuò)誤
--選擇列表中的列 'BasicDepartment.DepartmentName' 無(wú)效,因?yàn)樵摿袥](méi)有包含在聚合函數(shù)或 GROUP BY 子句中。
  這就是我們需要注意的一點(diǎn),如果在返回集字段中,這些字段
  要么就要包含在Group By語(yǔ)句的后面,作為分組的依據(jù);
  要么就要被包含在聚合函數(shù)中,作為分組的依據(jù);
--出現(xiàn)的錯(cuò)誤詳解:咱們看看group by 的執(zhí)行的過(guò)程,先執(zhí)行select 的操作返回一個(gè)程序集,
--然后去執(zhí)行分組的操作,這時(shí)候他將根據(jù)group by 后面的字段
--進(jìn)行分組,并且將相同的字段并稱(chēng)一列數(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)名稱(chēng)',
COUNT(*) as '個(gè)數(shù)' from BasicDepartment group by all DepartmentID,DepartmentName

==========================================================================================================

--group by 和having 解釋?zhuān)呵疤岜仨毩私鈙ql語(yǔ)言中一種特殊的函數(shù):聚合函數(shù),
例如SUM, COUNT, MAX, AVG等。這些函數(shù)和其它函數(shù)的根本區(qū)別就是它們一般作用在多條記錄上。

having是分組(group by)后的篩選條件,分組后的數(shù)據(jù)組內(nèi)再篩選
where則是在分組前篩選

where子句中不能使用聚集函數(shù),而having子句中可以,所以在集合函數(shù)中加上了HAVING來(lái)起到測(cè)試查詢結(jié)果是否符合條件的作用。
即having子句的適用場(chǎng)景是可以使用聚合函數(shù)

having 子句限制的是組,而不是行
having 子句中的每一個(gè)元素也必須出現(xiàn)在select列表中。有些數(shù)據(jù)庫(kù)例外,如oracle

當(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 子句去掉不符合條件的組

  ex:  顯示每個(gè)地區(qū)的總?cè)丝跀?shù)和總面積.僅顯示那些面積超過(guò)1000000的地區(qū)。 
    SELECT region, SUM(population), SUM(area)
    FROM bbc
    GROUP BY region
    HAVING SUM(area)>1000000
    在這里,我們不能用where來(lái)篩選超過(guò)1000000的地區(qū),因?yàn)楸碇胁淮嬖谶@樣一條記錄。(where子句中不能使用聚集函數(shù))
    相反,HAVING子句可以讓我們篩選成組后的各組數(shù)據(jù)

  ex: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)
    ..........
    查詢每一個(gè)班級(jí)中年齡大于20,性別為男的人數(shù)至少為2個(gè)的情況
    select COUNT(age) as '>20歲人數(shù)',classid from Table1 where sex='男' group by classid having COUNT(age)>2

底下這個(gè)例子很好
    SQL> select * from sc;

        SNO PNO    GRADE
      ---------- ----- ----------
YW       95
SX       98
YY       90
YW      89
SX       91
YY       92
YW      85
SX       88
YY       96
YW      95
SX       89
YY       88

    這個(gè)表所描述的是4個(gè)學(xué)生對(duì)應(yīng)每科學(xué)習(xí)成績(jī)的記錄,其中SNO(學(xué)生號(hào))、PNO(課程名)、GRADE(成績(jī))。

    1、顯示90分以上學(xué)生的課程名和成績(jī)

    //這是一個(gè)簡(jiǎn)單的查詢,并沒(méi)有使用分組查詢

    SQL> select sno,pno,grade from sc where grade>=90;

        SNO PNO    GRADE
      ---------- ----- ----------
YW      95
SX       98
YY       90
SX       91
YY       92
YY       96
YW      95

    2、顯示每個(gè)學(xué)生的成績(jī)?cè)?0分以上的各有多少門(mén)

    --進(jìn)行分組顯示,并且按照where條件之后計(jì)數(shù)

    SQL> select sno,count(*) from sc where grade>=90 group by sno;

        SNO  COUNT(*)
    -  --------- ----------
     3
     2
     1
     1

    3、這里我們并沒(méi)有使用having語(yǔ)句,接下來(lái)如果我們要評(píng)選三好學(xué)生,條件是至少有兩門(mén)課程在90分以上才能有資格,
      列出有資格的學(xué)生號(hào)及90分以上的課程數(shù)。

    //進(jìn)行分組顯示,并且按照where條件之后計(jì)數(shù),在根據(jù)having子句篩選分組

    SQL> select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2;

        SNO  COUNT(*)
    ---------- ----------
     3
     2

    這個(gè)結(jié)果是我們想要的,它列出了具有評(píng)選三好學(xué)生資格的學(xué)生號(hào),跟上一個(gè)例子比較之后,發(fā)現(xiàn)這是在分組后進(jìn)行的子查詢。

    4、學(xué)校評(píng)選先進(jìn)學(xué)生,要求平均成績(jī)大于90分的學(xué)生都有資格,并且語(yǔ)文課必須在95分以上,請(qǐng)列出有資格的學(xué)生

    //實(shí)際上,這個(gè)查詢先把語(yǔ)文大于95分的學(xué)生號(hào)提取出來(lái),之后求平均值,分組顯示后根據(jù)having語(yǔ)句選出平均成績(jī)大于90的

    SQL> select sno,avg(grade) from sc where SNO IN (SELECT SNO FROM SC WHERE GRADE>=95 AND PNO='YW') group by sno having avg(grade)>=90;

        SNO AVG(GRADE)
    ---------- ----------
  94.3333333
  90.6666667

    5、查詢比平均成績(jī)至少比學(xué)號(hào)是3的平均成績(jī)高的學(xué)生學(xué)號(hào)以及平均分?jǐn)?shù)

    //having子句中可進(jìn)行比較和子查詢
    SQL> select sno,avg(grade) from sc
         group by sno
         having avg(grade) > (select avg(grade) from sc where sno=3);

您可能感興趣的文章:
  • sql語(yǔ)句中where和having的區(qū)別
  • SQL 中having 和where的區(qū)別分析
  • SQL中where子句與having子句的區(qū)別小結(jié)
  • 數(shù)據(jù)庫(kù)SQL中having和where的用法區(qū)別
  • SQL中Having與Where的區(qū)別
  • SQL中Having與Where的區(qū)別及注意
  • SQL中where和having的區(qū)別詳解

標(biāo)簽:湖南 仙桃 銅川 崇左 黃山 蘭州 湘潭 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sql中的 where 、group by 和 having 用法解析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    进贤县| 无棣县| 广西| 乌拉特中旗| 大新县| 凤山县| 宜州市| 达尔| 商水县| 库车县| 峡江县| 吴忠市| 浑源县| 南乐县| 张家川| 南康市| 平江县| 苍溪县| 汉阴县| 竹北市| 广西| 伊通| 庄浪县| 隆子县| 通江县| 湛江市| 万山特区| 城口县| 嫩江县| 元阳县| 渑池县| 呼和浩特市| 交口县| 平度市| 北海市| 新乐市| 晋州市| 原平市| 牡丹江市| 新乡县| 周口市|