首先我們思考這幾個問題
- 在撰寫sql陳述句的時候,他們的作用都是一樣的,后面接判斷條件,where和having到底怎么區別?
- group by 陳述句怎么用?他有什么作用?
- where后面可以使用聚合函式嗎?
- 聚合函式可以在哪使用?
這里先給出答案(結論):
-
having只能對group by的結果進行操作,必須接在group by的后面,而where不能接在group by的后面,
-
where執行的程序是:根據條件,從from的表中取出一條一條的元組(一條資料)組成一個元組集合,
where子句可以獨立完成
-
group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函式的列,必須出現在 group by 后面,
-
聚集函式也叫列函式,它們都是基于整列資料進行計算的,聚集函式要對全列資料時行計算,因而使用它的前提是:結果集已經確定!
-
where子句還處于“確定”結果集的程序中,因而不能使用聚集函式,
注:(元組:就是一行資料)
要想了解這些結論,我們來看看sql陳述句執行的原理:
- FROM 子句回傳初始元組集和,
- WHERE 子句排除不滿足搜索條件的行,回傳一個元組集和,
- GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個唯一值的組中,
- HAVING 子句排除不滿足搜索條件的行,后面可以接聚合函式
- ORDER BY 對結果集進行排序,
- SELECT 查找你要搜索的欄位,
我們要注意:group by和聚合函式都只能對where查詢出來的結果集進行操作,
舉例說明:
--選擇數學語文總分大于190的學生,按學號排序
SELECT sno,name,SUM(grade)
from sc
where cno in ('數學','語文')
group by sno
having SUM(grade)>300
order by sno
這個句子的執行程序是這樣的

那么我們不能在where子句中使用這些聚合函式,為什么呢?
聚集函式也叫列函式,它們都是基于整列資料進行計算的,而where子句則是對資料行進行過濾的(這里過濾是在一個記錄里邊過濾的,基于"行"),where 會根據后面的條件進行結果集的確定,而聚合函式是對結果集進行操作,它兩組合在一起是矛盾的,更簡單地說,因為聚集函式要對全列資料時行計算,因而使用它的前提是:結果集已經確定!(要在步驟2結束后才能對where確定的結果集進行操作)
where子句還處于“確定”結果集的程序中,因而不能使用聚集函式,
注意:我們給出的例子有錯誤的地方:
group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函式的列,必須出現在 group by 后面,
這是一個group by陳述句的一個原則,自己寫陳述句的時候一定要注意!!!
例子正確的寫法:
--選擇數學語文總分大于190的學生,按學號排序
SELECT sno,name,SUM(grade)
from sc
where cno in ('數學','語文')
group by sno,name --(這里一定包含全部select 陳述句后不是聚合函式的屬性)
having SUM(grade)>300
order by sno
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/181006.html
標籤:其他
上一篇:MySQL學習之索引入門
