SQL?JOIN?子句合并多個表中相關(guān)行全面指南
SQL JOIN
JOIN子句用于基于它們之間的相關(guān)列合并來自兩個或更多表的行。
讓我們看一下“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”。上述兩個表之間的關(guān)系是“CustomerID”列。
然后,我們可以創(chuàng)建以下SQL語句(包含INNER JOIN),選擇在兩個表中具有匹配值的記錄:
示例
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
它將產(chǎn)生類似于以下的結(jié)果:
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類型可以根據(jù)您的需求選擇,以確保檢索到所需的數(shù)據(jù)。希望這能幫助你理解SQL中JOIN的概念。如果有其他問題,請隨時告訴我。
SQL INNER JOIN
INNER JOIN關(guān)鍵字選擇在兩個表中具有匹配值的記錄。
讓我們看一下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關(guān)鍵字連接Products
和Categories
:
SELECT ProductID, ProductName, CategoryName FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;
SQL INNER JOIN
注意:INNER JOIN關(guān)鍵字僅返回兩個表中具有匹配值的行。這意味著如果您有一個沒有CategoryID
的產(chǎn)品,或者CategoryID
在Categories
表中不存在的記錄,該記錄將不會在結(jié)果中返回。
語法
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
,則如果不指定表名,將會出現(xiàn)錯誤(因為CategoryID
在兩個表中都存在)。
JOIN或INNER JOIN
JOIN和INNER JOIN將返回相同的結(jié)果。
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用于將多個表中的數(shù)據(jù)連接在一起,以便根據(jù)關(guān)聯(lián)列的匹配情況檢索相應的數(shù)據(jù)。希望這幫助你理解INNER JOIN的使用方式。如果有其他問題,請隨時提出。
SQL LEFT JOIN關(guān)鍵字
SQL LEFT JOIN關(guān)鍵字返回左表(table1)中的所有記錄以及右表(table2)中的匹配記錄。如果沒有匹配,則右側(cè)的結(jié)果為0條記錄。
LEFT JOIN語法
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
注意:在某些數(shù)據(jù)庫中,LEFT JOIN被稱為LEFT OUTER JOIN。
SQL LEFT JOIN
演示數(shù)據(jù)庫
在本教程中,我們將使用著名的Northwind示例數(shù)據(jù)庫。
以下是“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 |
示例
假設(shè)我們想要檢索所有客戶以及他們的訂單(如果有的話)。我們可以使用LEFT JOIN將兩個表連接在一起,以便即使某些客戶沒有訂單,它們?nèi)匀粫诮Y(jié)果中顯示。
SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderDate FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
在這個例子中,LEFT JOIN確保了所有的客戶都會出現(xiàn)在結(jié)果中,而與之關(guān)聯(lián)的訂單信息(如果存在的話)也會被檢索出來。如果某個客戶沒有訂單,相應的OrderID和OrderDate列將顯示為NULL。
希望這能幫助你理解SQL中LEFT JOIN的使用方式。
以上就是SQL JOIN 子句合并多個表中相關(guān)行全面指南的詳細內(nèi)容,更多關(guān)于SQL JOIN 子句多表合并的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析
這篇文章主要介紹了mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法,結(jié)合實例形式分析了mysql存儲過程循環(huán)語句WHILE,REPEAT和LOOP的原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-12-12windows?64位下mysql8.0.25安裝配置教程(最詳細!)
之前一直在用 5.7 版本,竟然一下子跳到 8.0了,下面這篇文章主要給大家介紹了關(guān)于在windows?64位下mysql8.0.25安裝配置教程,文章通過圖文介紹的非常詳細,需要的朋友可以參考下2022-03-03InnoDB的關(guān)鍵特性-插入緩存,兩次寫,自適應hash索引詳解
下面小編就為大家?guī)硪黄狪nnoDB的關(guān)鍵特性-插入緩存,兩次寫,自適應hash索引詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03保證MySQL與Redis數(shù)據(jù)一致性的6種實現(xiàn)方案
這篇文章將聚焦在一個非常重要且復雜的問題上:MySQL與Redis數(shù)據(jù)的一致性,當我們在應用中同時使用MySQL和Redis時,如何保證兩者的數(shù)據(jù)一致性呢?下面就來分享幾種實用的解決方案,需要的朋友可以參考下2024-03-03