1. 程式人生 > >關於進行條件篩選的SQL關鍵字的一點理解

關於進行條件篩選的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子句與組有關,而不是與單個的行有關。