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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...