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