關於進行條件篩選的SQL關鍵字的一點理解
概述
一般能夠用於條件篩選的有三種:
- ON: 聯結(join)篩選
- WHERE: 一般條件篩選
- HAVING: 分組後的條件篩選
ON
JOIN – ON 語句的執行順序:
例句:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID AND A<>0 WHERE A.name = ‘x’
注意在作on 連線後 的and 子句 和where 子句 。 他們有什麼不同?
邏輯上解釋:(不考慮執行計劃中執行步驟和作巢狀連線等具體方式,這裡只討論如何思考邏輯上的步驟)
執行順序是: FROM –> JOIN –> ON –>AND–> LEFT–> WHERE –>SELECT
- A步驟. 先將兩張表根據ON 條件 作連線(邏輯上,相等於將兩張表笛卡爾集後根據ID相等條件篩選資料,實際情況後面分析)
- B步驟. 根據ON 後面,WHERE 之前 的 AND 條件篩選資料
- C步驟. 跟據LEFT 無論如何,要保證A表的資料完整性。所以在上一步驟產生的結果集中補齊A表因無法比與B表匹配而被AND 條件篩選的掉的資料;
- D步驟. 再根據WHERE篩選結果集。
Having
講到Having一定要先講講Group By
GROUP BY 子句 :
建立分組
SELECT column, SUM(column) FROM table GROUP BY column
說明:GROUP BY子句依據column列裡的資料對行進行分組,即具有相同的值的行被劃為一組。它一般與聚合函式同時使用。當然,這裡的SUM()函式也可以是其他聚合函式。所有的組合列(GROUP BY子句中列出的列)必須是來自FROM子句列出的表,不能根據實際值、聚合函式結果或者其他表示式計算的值來對行分組。
GROUP BY子句根據多列組合行
SELECT DNAME,TSEX, COUNT(*) AS TOTAL_NUM
FROM TEACHER
GROUP BY DNAME,TSEX
HAVING子句
GROUP BY子句分組,只是簡單地依據所選列的資料進行分組,將該列具有相同值的行劃為一組。而實際應用中,往往還需要刪除那些不能滿足條件的行組,為了實現這個功能,SQL提供了HAVING子句。語法如下。
SELECT column, SUM(column)
FROM table
GROUP BY column
HAVING SUM(column) condition value
說明:HAVING通常與GROUP BY子句同時使用。當然,語法中的SUM()函式也可以是其他任何聚合函式。DBMS將HAVING子句中的搜尋條件應用於GROUP BY子句產生的行組,如果行組不滿足搜尋條件,就將其從結果表中刪除。
Where
HAVING子句和WHERE子句的相似之處在於,它也定義搜尋條件。但與WHERE子句不同,HAVING子句與組有關,而不是與單個的行有關。