SQL 中各種連接 JOIN

来源:https://www.cnblogs.com/wandaren/archive/2022/12/19/16992515.html
-Advertisement-
Play Games

多表連接查詢中的「多表」,可以是同一張表,自己和自己連接查詢。相當於(可以理解為) A 表自己先複製自己後再和自己連接,如此稱為「 自連接 」也可以在不同張表中連接查詢,可分為「內連接」、「交叉連接」、「外連接」。 內連接根據所使用的比較方式不同,又分為「等值連接」、「自然連接」和「不等連接」三種, ...


image.png

  • 多表連接查詢中的「多表」,可以是同一張表自己和自己連接查詢。相當於(可以理解為) A 表自己先複製自己後再和自己連接,如此稱為「 自連接 」也可以在不同張表中連接查詢,可分為「內連接」、「交叉連接」、「外連接」。
  • 內連接根據所使用的比較方式不同,又分為「等值連接」、「自然連接」和「不等連接」三種,連接的結果列出這些表中與連接條件相匹配的數據行。
  • 與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。外連接分為「左外連接」或「左連接」( OUTER JOIN 或 LEFT JOIN)、「右外連接」或「右連接」(RIGHT OUTER JOIN 或 RIGHT JOIN)和「全外連接」或「全連接」(FULL OUTER JOIN 或 FULL JOIN)三種。

數據模擬

mysql版本

select version();

image.png

sql語句

CREATE TABLE `bus_sche` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `lastStation` varchar(100) NOT NULL,
  `nextStation` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


INSERT INTO test.bus_sche (lastStation,nextStation) VALUES
	 ('武漢','南昌'),
	 ('武漢','廣西'),
	 ('南昌','廈門'),
	 ('廣西','上海');

CREATE TABLE `Table_A` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO test.Table_A (name) VALUES
	 ('A1'),
	 ('A3'),
	 ('A4'),
	 ('A8');

CREATE TABLE `Table_B` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `names` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO test.Table_B (names) VALUES
	 ('B1'),
	 ('B2'),
	 ('B3'),
	 ('B5'),
	 ('B6');

自連接

  • 一張表中,假如有兩個以上的欄位,且這些欄位有一定的關係,我們又剛好想摸清這些關係欄位的數據,就可以在這上面做文章,俗稱「自連接」。
  • 一張表 bus_sche,為了簡單,表中只有上一站地點和下一站地點及唯一標識
SELECT b.lastStation,b.nextStation,a.lastStation,a.nextStation 
FROM bus_sche a, bus_sche b 
WHERE b.nextStation = a.lastStation;
  • 只在一張表中查詢,表 bus_sche 使用了兩個別名 bus_sche a, bus_sche b,因此相當於有兩張表,用 WHERE條件連接查詢,「 實際只有一張表在自我連接查詢」。
  • 結果

image.png

內連接

  • 在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。(內連接查詢操作只列出與連接條件匹配的數據行,使用 INNER JOIN 或者直接使用 **JOIN **進行連接)。
  • 兩張表的 id ,A中有1、3、4、8,B中有1、2、3、5、6,還有一個欄位分別是 name 和names,該欄位數據都是按順序的小寫字母,前面再加個 A 或 B 為了方便區分屬於哪個表。

image.pngimage.png

SELECT * from Table_A JOIN Table_B;
SELECT * from Table_A INNER JOIN Table_B;
  • 內連接可以沒有連接條件,沒有條件之後的查詢結果,會保留所有結果(笛卡爾集),與交叉連接差不多。

image.png

等值連接

  • 在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重覆列
SELECT * from Table_A A JOIN Table_B B ON A.id = B.id;
  • 查詢結果,列數是 4 列,兩張表的欄位直接拼接在一起,重覆的欄位在後面添加數字序列以做區分

image.png

  • 通俗講就是根據條件,找到表 A 和 表 B 的數據的交集(包含重覆列)

image.png

不等連接

  • 不等連接跟等值連接僅僅是連接條件中使用的運算符不一樣,其餘一致。不等連接使用的是除等於號運算符以外的其它比較運算符,如>、>=、<=、<、!>、!<和<> 等。
SELECT * from Table_A A JOIN Table_B B ON A.id < B.id;  
  • 根據條件,一個個做比較,滿足條件的所有結果

image.png

自然連接

  • 在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重覆列
SELECT * from Table_A NATURAL JOIN Table_B ; 
SELECT * from Table_A A NATURAL JOIN Table_B B WHERE A.id = B.id;
  • 查詢結果,註意是已經刪除了重覆列,列數只有 3,這也是和等值連接的區別

image.png

  • 根據條件,找到表 A 和 表 B 的數據的交集,但欄位已經去重(不包含重覆列)

image.png

交叉連接

  • 交叉連接不帶 WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積。從一張表中迴圈取出每一條記錄,每條記錄都會去另一張表中匹配每一條記錄,匹配結果一定保留(因為無條件,如果有條件,則只保留滿足條件的結果)。
  • 假設 A 表有 n 條記錄,B 表有 m 條記錄,則結果為 n * m 條記錄。

image.png

SELECT * from Table_A CROSS JOIN Table_B;
  • 因為 A 表數據有 4 條,B 表數據有 5 條,4 x 5 = 20,因此交叉查詢結果有 20 條,如下

image.png

外連接

  • 外連接不只列出與連接條件相匹配的行,而且還加上左表(左外連接時)或右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。

左連接(左外連接)

  • LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
SELECT * from Table_A A LEFT JOIN Table_B B ON A.id = B.id;
SELECT * from Table_A A LEFT OUTER JOIN Table_B B ON A.id = B.id;

image.png

  • 根據條件,用右表(B)匹配左表(A),能匹配,正確保留,不能匹配其他表的欄位都置空 Null。也就是,根據條件找到表 A 和 表 B 的數據的交集,再加上左表的數據集

image.png

左表唯一

SELECT * from Table_A A LEFT JOIN Table_B B ON A.id = B.id where B.id is null

image.png
image.png

右連接(右外連接)

  • RIGHT JOIN 關鍵字會右表 (table_name2) 那裡返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。
SELECT * from Table_A A RIGHT JOIN Table_B B ON A.id=B.id;
SELECT * from Table_A A RIGHT OUTER JOIN Table_B B ON A.id=B.id;

image.png

  • 根據條件,用左表(A)匹配右表(B),能匹配,正確保留,不能匹配其他表的欄位都置空 Null。也就是,根據條件找到表 A 和 表 B 的數據的交集,再加上右表的數據集

image.png

右表唯一

SELECT * from Table_A A RIGHT OUTER JOIN Table_B B ON A.id=B.id 
where A.id is null

image.png
image.png

多錶鏈接語句語法

 -- 連接兩個數據表的用法:
 FROM t1 INNER JOIN t2 ON t1.id=t2.id
 -- 語法格式可以概括為:
 FROM 表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號

 -- 連接三個數據表的用法:
 FROM (t1 INNER JOIN t2 ON t1.id=t2.id) INNER JOIN t3 ON t1.name=t3.name
 -- 語法格式可以概括為:
 FROM (表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) INNER JOIN 表3 ON 表1.欄位號=表3.欄位號

 -- 連接四個數據表的用法:
 FROM ((t1 INNER JOIN t2 ON t1.id=t2.id) INNER JOIN t3 ON t1.name=t3.name) INNER JOIN t4 ON t1.city=t4.city
 -- 語法格式可以概括為:
 FROM ((表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) INNER JOIN 表3 ON 表1.欄位號=表3.欄位號) INNER JOIN 表4 ON 表1.欄位號=表4.欄位號

 -- 連接五個數據表的用法:
 FROM (((t1 INNER JOIN t2 ON t1.id=t2.id) INNER JOIN t3 ON t1.name=t3.name) INNER JOIN t4 ON t1.city=t4.city) INNER JOIN t5 ON t1.country=t5.country
 -- 語法格式可以概括為:
 FROM (((表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) INNER JOIN 表3 ON 表1.欄位號=表3.欄位號) INNER JOIN 表4 ON 表1.欄位號=表4.欄位號) INNER JOIN 表5 ON 表1.欄位號=表5.欄位號

全鏈接(全外連接)

  • 根據條件找到表 A 和 表 B 的數據的交集,再加上左右表的數據集

SQL Server版本

image.png

SELECT * FROM Table_A A FULL OUTER JOIN Table_B B ON A.id = B.id;

image.png
image.png

  • 此查詢將返回左表(表A)中的所有記錄和右表(表B)中所有不匹配的記錄
SELECT * FROM Table_A A FULL OUTER JOIN Table_B B ON A.id = B.id 
WHERE A.id IS NULL OR B.id IS NULL;

image.png
image.png
參考(圖片來源)地址


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 假設,我們有這樣一張 Gif 圖: 利用 CSS,我們嘗試來搞一些事情。 圖片的 Glitch Art 風 在這篇文章中 --CSS 故障藝術,我們介紹了利用混合模式製作一種暈眩感覺的視覺效果。有點類似於抖音的 LOGO。 像是這樣: 假設,我們有這樣一張圖: 只需要一個標簽即可 <div clas ...
  • 案例介紹 歡迎來到我的小院,我是霍大俠,恭喜你今天又要進步一點點了!我們來用JavaScript編程實戰案例,做一個表情評價程式。用戶打星進行評價,表情會根據具體星星數量發生變化。 案例演示 點擊星星可以進行滿意程度評價,星星數量變換表情也會隨之變換。 源碼學習 進入核心代碼學習,我們先來看HTML ...
  • 2015 年 HTTP/2 標準發表後,大多數主流瀏覽器也於當年年底支持該標準。此後,憑藉著多路復用、頭部壓縮、伺服器推送等優勢,HTTP/2 得到了越來越多開發者的青睞。不知不覺的 HTTP 已經發展到了第三代,鵝廠也緊跟技術潮流,很多項目也在逐漸使用 HTTP/3。本文基於興趣部落接入 HTTP... ...
  • 1)寫用例 TestCase 2)執行用例 1:TestSuite存儲用例,2:TestLoader找用例,存儲用例,存放指定的TestSuite 3)對比實際結果/期望結果,判定用例是否通過#斷言Assert 4)出局測試報告TextTestRunner 1.測試類 import requests ...
  • 1.get/post介紹 get和post是最常用的http/htttps請求方式,一定要掌握好二者各自特點以及區別。 2.get/post特點 get請求 請求參數在請求地址後面,提交的數據量較小,安全性較差,不建議用來提交敏感信息(地址欄中會顯示,並且有可能被保存請求地址)。 post請求 請求 ...
  • 家居網購項目實現04 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 10.功能09-後臺管理 刪除家居 10.1需求分析/圖解 需求如下: 管理員進入到家居管理頁面 點擊刪除家居連接,彈出確認視窗,確認刪除,取消放棄 10.2 ...
  • 訓練模型過程中,經常需要追蹤一些性能指標的變化情況,以便瞭解模型的實時動態,例如:回歸任務中的MSE、分類任務中的Accuracy、生成對抗網路中的圖片、網路模型結構可視化…… 除了追蹤外,我們還希望能夠將這些指標以動態圖表的形式可視化顯示出來。 TensorFlow的附加工具Tensorboar... ...
  • 1 final基本用法 final:“這是無法改變的" final可以修飾:變數、參數、方法、類 1.1 final修飾變數 修飾變數(變數、局部變數),當變數類型為: 基本類型,一旦被賦值,該值不能被改變。 引用類型,一旦引用被初始化指向一個對象,就不能指向別的對象,但對象內容可以被修改 數據類型 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...