详解在group by分组查询中where 和 having的用法和区别。
生活随笔
收集整理的這篇文章主要介紹了
详解在group by分组查询中where 和 having的用法和区别。
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我地都知道sql 中 where 和 having 都是用來篩選條件的關(guān)鍵字。
而且having 一般和group by 一齊使用,?? 但是where 也可以用group by 一齊使用的。
下面用個(gè)簡(jiǎn)單例子講解下:
有一張分?jǐn)?shù)表Grade_1, ? 3個(gè)column 分別是 dep, name 和 grade,? 如下圖,好明顯可以用部門dep來分組. 表中總共9條數(shù)據(jù)
下面語句是用來列出所有部門的總分。 并沒有用到where 和 having 字句。
可以見到3個(gè)組的總分都列出來了。 呢個(gè)唔難理解。
where 子句:
下面用1個(gè)where字句, 意思是列出所有部門分?jǐn)?shù)大于或等于60分的人的總分
可以見到, 部門1 和 部門2的總分 都比上面的總分?jǐn)?shù)減少了
是因?yàn)?where字句的作用,? 語句在分組前 把第1組的? Allen(40分)
和 第二組的piero (45分) 排除掉了。
第一組和第二組實(shí)際上都是其余兩個(gè)人的總分,
所以可總結(jié)出:
1. where字句用在group by之前。
2. where 作用于單個(gè)記錄(行)
3. where 作用生效后(篩選后), group by分組才生效, 也就是where字句作用于 group by 之前。
Having 子句:
下面用1個(gè)Having字句, 意思是列出最低分?jǐn)?shù)大于40的部門的總分
可以見到 結(jié)果把整個(gè)第一組排除出去了, 是因?yàn)?br />第一組有個(gè)人Allen的分?jǐn)?shù)不大于40? 也就是說? 第一組的最低分是40, 不符合條件。
所以可總結(jié)出:
1. having 字句用在group by之后。
2. having 字句 作用于單個(gè)組(1行或多行)
3. group by 分組后,? 才用having 子句來分組, 所以having字句作用在分組之后。
where 和 having 子句一齊使用:
下面語句就是上面兩個(gè)條件一齊使用,
可以見到第一組又出來了,? 之前不是說第一組的最低分是40嗎?
答案都好簡(jiǎn)單,因?yàn)榉纸M前 where字句先起作用, 把分?jǐn)?shù)小于60的數(shù)據(jù)都排除出去了,
分組后
當(dāng)having子句起作用時(shí),? 第一分組已經(jīng)不包含小于60的數(shù)據(jù)(Allen), 所以第一分組這是的最低分是60(Jason),符合條件拉!
而且having 一般和group by 一齊使用,?? 但是where 也可以用group by 一齊使用的。
下面用個(gè)簡(jiǎn)單例子講解下:
有一張分?jǐn)?shù)表Grade_1, ? 3個(gè)column 分別是 dep, name 和 grade,? 如下圖,好明顯可以用部門dep來分組. 表中總共9條數(shù)據(jù)
下面語句是用來列出所有部門的總分。 并沒有用到where 和 having 字句。
select dep as Dep,sum(grade) as Sum_grade
from Grade_1
group by dep
可以見到3個(gè)組的總分都列出來了。 呢個(gè)唔難理解。
where 子句:
下面用1個(gè)where字句, 意思是列出所有部門分?jǐn)?shù)大于或等于60分的人的總分
select dep as Dep,sum(grade) as Sum_grade
from Grade_1
where grade >= 60
group by dep
可以見到, 部門1 和 部門2的總分 都比上面的總分?jǐn)?shù)減少了
是因?yàn)?where字句的作用,? 語句在分組前 把第1組的? Allen(40分)
和 第二組的piero (45分) 排除掉了。
第一組和第二組實(shí)際上都是其余兩個(gè)人的總分,
所以可總結(jié)出:
1. where字句用在group by之前。
2. where 作用于單個(gè)記錄(行)
3. where 作用生效后(篩選后), group by分組才生效, 也就是where字句作用于 group by 之前。
Having 子句:
下面用1個(gè)Having字句, 意思是列出最低分?jǐn)?shù)大于40的部門的總分
select dep as Dep,sum(grade)? as Sum_grade
from Grade_1
group by dep
having min(grade) > 40
可以見到 結(jié)果把整個(gè)第一組排除出去了, 是因?yàn)?br />第一組有個(gè)人Allen的分?jǐn)?shù)不大于40? 也就是說? 第一組的最低分是40, 不符合條件。
所以可總結(jié)出:
1. having 字句用在group by之后。
2. having 字句 作用于單個(gè)組(1行或多行)
3. group by 分組后,? 才用having 子句來分組, 所以having字句作用在分組之后。
where 和 having 子句一齊使用:
下面語句就是上面兩個(gè)條件一齊使用,
select dep as Dep,sum(grade)? as Sum_grade
from Grade_1
where grade >= 60
group by dep
having min(grade) > 40
可以見到第一組又出來了,? 之前不是說第一組的最低分是40嗎?
答案都好簡(jiǎn)單,因?yàn)榉纸M前 where字句先起作用, 把分?jǐn)?shù)小于60的數(shù)據(jù)都排除出去了,
分組后
當(dāng)having子句起作用時(shí),? 第一分組已經(jīng)不包含小于60的數(shù)據(jù)(Allen), 所以第一分組這是的最低分是60(Jason),符合條件拉!
總結(jié)
以上是生活随笔為你收集整理的详解在group by分组查询中where 和 having的用法和区别。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql 外连接的写法。
- 下一篇: 子查询中的空值导致的问题。