[SQL] Join 的 WHERE 條件式位置


假設有三個表,表1、表2、表3,用下列方式 Join 起來:

SELECT * FROM 表1
INNER JOIN 表2 ON 表1.K1=表2.K2
LEFT JOIN 表3 ON 表1.K1=表3.K3

在此例中有三種放 WHERE 條件式的位置:

1.

SELECT * FROM 表1
INNER JOIN 表2 ON 表1.K1=表2.K2
LEFT JOIN 表3 ON 表1.K1=表3.K3
WHERE 所有條件

2.

SELECT * FROM 表1
INNER JOIN 表2 ON (表1.K1=表2.K2 AND 表1及表2條件)
LEFT JOIN 表3 ON (表1.K1=表3.K3 AND 表1及表3條件)

3.

SELECT * FROM (SELECT * FROM 表1 WHERE 表1條件) AS 表1
INNER JOIN (SELECT * FROM 表2 WHERE 表2條件) AS 表2 ON 表1.K1=表2.K2
LEFT JOIN (SELECT * FROM 表3 WHERE 表3條件) AS 表3 ON 表1.K1=表3.K3

法1 是相容度最高的用法,也是效能最差的方法,非簡單表格或必要下,不要使用,否則會嚴重造成資料庫查詢負擔,間接造成系統負擔。法1的作法是將所有內容先查詢出來,再逐步依條件過濾出要的內容。

法2 可提高一定的效能,但是可加在紅色的條件就要看資料庫支援的能力,有些允許Key放在後方,有些不允許,甚至有些 WHERE 條件必須放在法1的位置,條件與 WHERE 條件相同,過濾資料多的放前面,過濾資料少的條件放後面。查詢時,一般是先做表1表2連結,過濾完條件後,再做表3連結,再過濾條件。

法3 有點類似 View 的作法,每個查詢都建立類似 View 的概念,每個表僅查詢出需要連結的部分進行連結。

法2 適用在重複資料少的情形下,或是查詢基本上都是整張表,法3因為會建立子查詢,所以適用在大量重複資料的擷取,或是從巨型資料表中抽出少部分資料做 JOIN,比如說查詢的若是屬性表這類,大部分是1對1,法2會比較快,若是查詢類似事件紀錄這類1對多,或是事件紀錄太多只抽出最近的紀錄,可能法3會比較快。

Categories: 資料庫, 工作點滴, 技術分享 | 5 則迴響

文章分頁導航

5 thoughts on “[SQL] Join 的 WHERE 條件式位置

  1. 關於這篇我自己的心得是:
    SQL 語法很簡單,簡單到一學完就以為自己會了,隨著不斷使用、熟練、測試、改善,讓我有深深的感觸 —
    真是他媽的魔鬼隱藏在細節中

    這篇就是細節沒處理好就會影響到效能,當資料庫不斷膨脹後,差個幾十幾百幾千倍都有可能,就看你資料庫有多龐大,時間差就會以次方倍的快速遞增。

    Liked by 4 people

  2. 這篇解了我卡好久的難關~謝謝您的分享~

  3. Arnold

    有幸拜讀到這篇,解決了我的問題,謝謝你!

  4. p633

    感謝您的教學! thx

發表留言

在 WordPress.com 建立免費網站或網誌.