SQL JOIN 子句:合併多個表中相關行的完整指南

来源:https://www.cnblogs.com/xiaowange/archive/2023/11/26/17857728.html
-Advertisement-
Play Games

SQL JOIN JOIN子句用於基於它們之間的相關列合併來自兩個或更多表的行。 讓我們看一下“Orders”表的一部分選擇: OrderID CustomerID OrderDate 10308 2 1996-09-18 10309 37 1996-09-19 10310 77 1996-09-2 ...


SQL JOIN

JOIN子句用於基於它們之間的相關列合併來自兩個或更多表的行。

讓我們看一下“Orders”表的一部分選擇:

OrderID CustomerID OrderDate
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20

然後,看一下“Customers”表的一部分選擇:

CustomerID CustomerName ContactName Country
1 Alfreds Futterkiste Maria Anders Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Mexico
3 Antonio Moreno Taquería Antonio Moreno Mexico

註意,“Orders”表中的“CustomerID”列是指“Customers”表中的“CustomerID”。上述兩個表之間的關係是“CustomerID”列。

然後,我們可以創建以下SQL語句(包含INNER JOIN),選擇在兩個表中具有匹配值的記錄:

示例

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

它將產生類似於以下的結果:

OrderID CustomerName OrderDate
10308 Ana Trujillo Emparedados y helados 9/18/1996
10365 Antonio Moreno Taquería 11/27/1996
10383 Around the Horn 12/16/1996
10355 Around the Horn 11/15/1996
10278 Berglunds snabbköp 8/12/1996

不同類型的SQL JOIN

以下是SQL中不同類型的JOIN:

  • (INNER) JOIN:返回在兩個表中具有匹配值的記錄
  • LEFT (OUTER) JOIN:返回左表中的所有記錄以及右表中匹配的記錄
  • RIGHT (OUTER) JOIN:返回右表中的所有記錄以及左表中匹配的記錄
  • FULL (OUTER) JOIN:在左表或右表中有匹配時返回所有記錄

這些JOIN類型可以根據您的需求選擇,以確保檢索到所需的數據。希望這能幫助你理解SQL中JOIN的概念。如果有其他問題,請隨時告訴我。

SQL INNER JOIN

INNER JOIN關鍵字選擇在兩個表中具有匹配值的記錄。

讓我們看一下Products表的一部分選擇:

ProductID ProductName CategoryID Price
1 Chais 1 18
2 Chang 1 19
3 Aniseed Syrup 2 10

以及Categories表的一部分選擇:

CategoryID CategoryName Description
1 Beverages Soft drinks, coffees, teas, beers, and ales
2 Condiments Sweet and savory sauces, relishes, spreads, and seasonings
3 Confections Desserts, candies, and sweet breads

我們將使用兩個表的CategoryID欄位連接Products表和Categories表:

示例

使用INNER JOIN關鍵字連接ProductsCategories

SELECT ProductID, ProductName, CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

SQL INNER JOIN

註意:INNER JOIN關鍵字僅返回兩個表中具有匹配值的行。這意味著如果您有一個沒有CategoryID的產品,或者CategoryIDCategories表中不存在的記錄,該記錄將不會在結果中返回。

語法

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

指定列名

在SQL語句中指定列時,最好在列名前包含表名。

示例

指定表名:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

上面的示例在不指定表名的情況下也可以工作,因為指定的列名在兩個表中都不存在。如果嘗試在SELECT語句中包含CategoryID,則如果不指定表名,將會出現錯誤(因為CategoryID在兩個表中都存在)。

JOIN或INNER JOIN

JOIN和INNER JOIN將返回相同的結果。

INNER是JOIN的預設連接類型,因此當您寫JOIN時,解析器實際上會寫INNER JOIN。

示例

JOIN與INNER JOIN相同:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
JOIN Categories ON Products.CategoryID = Categories.CategoryID;

連接三個表

以下SQL語句選擇具有客戶和承運商信息的所有訂單:

示例

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

INNER JOIN用於將多個表中的數據連接在一起,以便根據關聯列的匹配情況檢索相應的數據。希望這幫助你理解INNER JOIN的使用方式。如果有其他問題,請隨時提出。

SQL LEFT JOIN關鍵字

SQL LEFT JOIN關鍵字返回左表(table1)中的所有記錄以及右表(table2)中的匹配記錄。如果沒有匹配,則右側的結果為0條記錄。

LEFT JOIN語法

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

註意:在某些資料庫中,LEFT JOIN被稱為LEFT OUTER JOIN。

SQL LEFT JOIN

演示資料庫

在本教程中,我們將使用著名的Northwind示例資料庫。

以下是“Customers”表的部分選擇:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

以及“Orders”表的部分選擇:

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

示例

假設我們想要檢索所有客戶以及他們的訂單(如果有的話)。我們可以使用LEFT JOIN將兩個表連接在一起,以便即使某些客戶沒有訂單,它們仍然會在結果中顯示。

SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

在這個例子中,LEFT JOIN確保了所有的客戶都會出現在結果中,而與之關聯的訂單信息(如果存在的話)也會被檢索出來。如果某個客戶沒有訂單,相應的OrderID和OrderDate列將顯示為NULL。

希望這能幫助你理解SQL中LEFT JOIN的使用方式。如果有其他問題,請隨時提出。

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:公眾號搜索Let us Coding,或者掃描下方二維碼,關註公眾號,即可獲取最新文章。

看完如果覺得有幫助,歡迎點贊、收藏關註

image


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

-Advertisement-
Play Games
更多相關文章
  • 學習視頻:孫哥說SpringMVC:結合Thymeleaf,重塑你的MVC世界!|前所未有的Web開發探索之旅 第一章、SpringMVC的引言 1.1什麼是SpringMVC 概念:SpringMVC是基於Spring Framework衍生而來的MVC框架,主要解決了原有MVC框架開發過程中,控 ...
  • ✨前言✨ 本片文章,主要在於瞭解Calendar類,及對它常用方法的運用 🍒歡迎點贊 👍 收藏 ⭐留言評論 📝私信必回喲😁 🍒博主將持續更新學習記錄收穫,友友們有任何問題可以在評論區留言 @目錄🍊 Calendar類🍊 Calendar類常用方法🍊 Calendar類對象欄位類型🍊 ...
  • 一、前言(整個流程除了調整列印模板位子,操作下來還是挺快的 幾分鐘就搞定,文章圖片比較多大家可能感覺操作比較麻煩,其實挺簡單的) 因甲方需求,需要對現項目進行升級,需要增加移動手持終端進行巡檢,巡檢時還需要對商品進行抽檢並列印熱敏不幹膠標簽進行貼到抽樣樣品上。在這樣的背景下便在JD進行了採樣,進行技 ...
  • Mapster是一個開源的.NET對象映射庫,它提供了一種簡單而強大的方式來處理對象之間的映射。在本文中,我將詳細介紹如何在.NET中使用Mapster,並提供一些實例和源代碼。 和其它框架性能對比: Mapster的安裝和配置: 首先,打開Visual Studio並創建一個新的.NET項目。 在 ...
  • .NET Core MVC基礎之頁面傳值方式📃 前言 最近工作太忙了,淺淺更新一下.NET基礎知識。大部分面試官都會問.NET頁面傳值的幾種方式,那麼接下來就來細講與實現一下吧! 頁面傳值分成兩類 第一類:控制器給視圖傳值 第二類:視圖給控制器傳值 本篇文章主要講控制器給視圖傳值 控制器->視圖 ...
  • LINQ(Language-Integrated Query)是C#語言中的一個強大的查詢技術,它提供了一種統一的查詢語法,可以用於查詢和操作各種數據源,包括集合、資料庫、XML等。下麵詳細描述了LINQ的20個功能點,並提供了相應的源代碼。 查詢集合中的所有元素: int[] numbers = ...
  • 「華邦電子(Winbond)」是國際領先的存儲器廠商,其串列 NOR Flash 產品在全球市場占有率穩居前列。 11月23日,華邦電子聯合「恩智浦(NXP)」在上海搞了場主題為“芯智無限,同連共存”線下技術論壇,因為和華邦電子關係密切,痞子衡有幸作為恩智浦方的演講嘉賓之一為大家做了場 i.MX R ...
  • 說明: Redis是一個開源的,由C語言編寫的高性能NoSQL資料庫,因其高性能、可擴展、相容性強,被各大小互聯網公司或個人作為記憶體型存儲組件使用。 但是其中有小部分公司或個人開發者,為了方便調試或忽略了安全風險,直接用root啟動redis,沒有設置密碼並直接對外開放了6379埠,那麼這就是一個 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...