日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SQL的JOIN用法总结

發(fā)布時間:2024/1/3 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 SQL的JOIN用法总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


為了便于理解,本文將關(guān)鍵字全大寫,非關(guān)鍵字全小寫。實際使用沒有這個要求。

SQL的JOIN會用,用得好,能使SQL準確取到想取的數(shù)據(jù),同時SQL語句還結(jié)構(gòu)清晰易維護。它的通常形式為:

SELECT <結(jié)果字段集>
  FROM <左表>
  JOIN <右表> ON <連接條件>
 WHERE <篩選條件>

其中的JOIN可以換成以下的這些

JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL JOIN, FULL OUTER JOIN, CROSS JOIN
但上面有些是等價的,一些是另一些的簡寫,整理如下:

全寫 簡寫
INNER JOIN JOIN
LEFT OUTER JOIN LEFT JOIN
RIGHT OUTER JOIN RIGHT JOIN
FULL OUTER JOIN FULL JOIN
CROSS JOIN (無)

除了CROSS JOIN無須有、也不能有ON之外,其它的JOIN都必須有ON。

關(guān)于這些JOIN的基本用法,網(wǎng)上已經(jīng)不少文章介紹,可以先看看 這個,這個 或者百度一下“SQL連接JOIN”。

下文假設(shè)你已經(jīng)明白這些JOIN的基本用法。

哪個表算左,哪個表算右?

如果是兩表,則XX JOIN左邊的表算左,右邊的表算右,與ON后面的條件的寫法無關(guān)。比如ON后面是等于號,等于號兩邊互換,不影響左右表的認定,也不影響查詢結(jié)果。
如果是多表,則XX JOIN左邊的全部表算左,右邊緊跟的那一個表算右,與ON后面的條件寫法無關(guān)。

ON后面如果有多個條件,會如何影響查詢的結(jié)果?

如果有多個條件,只看整個表達式的結(jié)果是True還是False,與部分表達式是否成立無關(guān)。比如 ON a.f1 = b.f1 AND a.f2 = b.f2,假如a.f1不等于b.f1,則不管a.f2是否等于b.f2,整個ON表達式都對查詢的結(jié)果無影響。ON后面不管多復雜,只看表達式整體運算的結(jié)果。

容易犯的一個誤區(qū)(重點來啦!)

以LEFT JOIN舉例,一些人認為LEFT JOIN從左表出發(fā)得到的結(jié)果,(假設(shè)沒有WHERE語句),左表的一行在結(jié)果中有且只有一行。
基于ON的關(guān)聯(lián)條件,結(jié)果分成3種情況:

1. 左表的1行,對應右表0行,則結(jié)果是1行,其中右表字段都為NULL

2. 左表的1行,對應右表1行,則結(jié)果是1行。

3. 左表的1行,對應右表n行(n>1),則結(jié)果是n行,其中左表字段被復制到結(jié)果中的n行中。

結(jié)論:

對于LEFT JOIN,左表的一行,在結(jié)果中也可能出現(xiàn)多行
RIGHT JOIN同理:對于RIGHT JOIN,右表的一行,在結(jié)果中也可能出現(xiàn)多行!
其它的JOIN都會在對面(左的對面是右)的表有多條數(shù)據(jù)符合ON條件時在結(jié)果中出現(xiàn)多次。
沒有ON的CROSS JOIN,天生就會出現(xiàn)多行,左右表在結(jié)果中都可能出現(xiàn)多行!

當需要用FULL JOIN,但當前的數(shù)據(jù)庫又不支持怎么辦?

比如MySQL就不支持FULL JOIN。
這個網(wǎng)上有通用的解法,即是把FULL JOIN轉(zhuǎn)化成(LEFT JOIN) UNION (RIGHT JOIN)的結(jié)構(gòu)。
支持FULL JOIN的寫法:

SELECT *
  FROM table_a AS a
  FULL JOIN table_b AS b ON a.a_id = b.a_id

不支持FULL JOIN的寫法:

SELECT *
  FROM table_a AS a
  LEFT JOIN table_b AS b ON a.a_id = b.a_id
 UNION
SELECT *
  FROM table_a AS a
 RIGHT JOIN table_b AS b ON a.a_id = b.a_id

但是實際SQL往往不會這么簡單。當table_a或table_b是一個子查詢(可能SQL很長)時,被寫成兩處,就會帶來維護的不便和兩處修改可能不一致的風險。

SELECT *
  FROM (
    SELECT * FROM table_a   -- 想象這是這是一個語句很長、很復雜的子查詢
  ) AS a
  LEFT JOIN (
    SELECT * FROM table_b   -- 想象這是這是另一個語句很長、很復雜的子查詢
  ) AS b ON a.a_id = b.a_id
 UNION
SELECT *
  FROM (
    SELECT * FROM table_a   -- 想象這是這是一個語句很長、很復雜的子查詢
  ) AS a
  LEFT JOIN (
    SELECT * FROM table_b   -- 想象這是這是另一個語句很長、很復雜的子查詢
  ) AS b ON a.a_id = b.a_id

改成下面這樣的寫法就能避免這個問題:

WITH a AS (
  SELECT * FROM table_a -- 想象這是這是一個語句很長、很復雜的子查詢
), b AS (
  SELECT * FROM table_b -- 想象這是這是另一個語句很長、很復雜的子查詢
)
SELECT *
  FROM a
  LEFT JOIN b ON a.a_id = b.a_id
 UNION
SELECT *
  FROM a
 RIGHT JOIN b ON a.a_id = b.a_id

現(xiàn)在你是不是對JOIN的認知加深了一些?有不清楚歡迎留言。


博主簡介:佘煥敏(shé),洋名 Billy Sir。

關(guān)注編程基礎(chǔ)技術(shù),并致力于研究軟件的自動化生成。
對編程規(guī)范化、面向?qū)ο蟮臉O致使用也有著濃厚的興趣。
同時非常希望能夠?qū)懗绦虻?5歲。

只有工匠精神,才能把常人覺得單調(diào)乏味的代碼,當作作品雕刻成藝術(shù)品。

總結(jié)

以上是生活随笔為你收集整理的SQL的JOIN用法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。