【转】SQL中where, group by, having的用法和区别
group by,where,having 是數(shù)據(jù)庫(kù)查詢(xún)中最常用的幾個(gè)關(guān)鍵字。在工作中,時(shí)常用到,那么,當(dāng)一個(gè)查詢(xún)中使用了where ,group by ,having及聚集函數(shù)時(shí) ,執(zhí)行順序是怎么樣的?為了回答這個(gè)問(wèn)題,將這個(gè)三個(gè)關(guān)鍵字的用法整理一下。
where:數(shù)據(jù)庫(kù)中常用的是where關(guān)鍵字,用于在初始表中篩選查詢(xún)。它是一個(gè)約束聲明,用于約束數(shù)據(jù),在返回結(jié)果集之前起作用。如下面這個(gè)例子,從user表中查詢(xún)出userDepartmentId等于2的數(shù)據(jù)
select * from dbo.user where userDepartmentId=2group by:對(duì)select查詢(xún)出來(lái)的結(jié)果集按照某個(gè)字段或者表達(dá)式進(jìn)行分組,獲得一組組的集合,然后從每組中取出一個(gè)指定字段或者表達(dá)式的值。
在說(shuō)group by的時(shí)候,我們還需要了解聚合函數(shù),聚合函數(shù)是SQL語(yǔ)言中一種特殊的函數(shù)。例如:
- count(*):獲取數(shù)量
- sum():求和(這里要注意求和是忽略null值的,null與其他數(shù)值相加結(jié)果為null,所以可以通過(guò)ifnull(xxx,0)將null的值賦為0)
- avg():求平均數(shù)
- max():求最大值
- min():求最小值
這些函數(shù)和其它函數(shù)的根本區(qū)別就是它們一般作用在多條記錄上。
我們需要注意的是:在使用group by的SQL語(yǔ)句中,select中返回的字段,必須滿(mǎn)足以下兩個(gè)條件之一:
從剛才的那個(gè)例子中,我們查詢(xún)出每個(gè)城市,相同年齡的員工數(shù)量:
select city, count(*),age from dbo.user where departmentID=2 group by city,agehaving:用于對(duì)where和group by查詢(xún)出來(lái)的分組經(jīng)行過(guò)濾,查出滿(mǎn)足條件的分組結(jié)果。它是一個(gè)過(guò)濾聲明,是在查詢(xún)返回結(jié)果集以后對(duì)查詢(xún)結(jié)果進(jìn)行的過(guò)濾操作。
所以having的使用需要注意以下幾點(diǎn):
還是剛才的例子,我們進(jìn)一步整理,查詢(xún)員工數(shù)量大于20的城市和年齡段
select city, count(*),age from dbo.user where departmentID=2 group by city,age having age >40回到開(kāi)頭的那個(gè)問(wèn)題:當(dāng)一個(gè)語(yǔ)句中同時(shí)含有where、group by 、having及聚集函數(shù)時(shí),執(zhí)行順序如下:
需要注意的是,
當(dāng)加上其他sql語(yǔ)句時(shí),執(zhí)行順序如下:
S-F-W-G-H-O 組合
select –>where –> group by–> having–>order by
順序是不能改變的
總結(jié)
以上是生活随笔為你收集整理的【转】SQL中where, group by, having的用法和区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转】c# 命名空间和程序集
- 下一篇: Sharepoint学习笔记—Ribbo