在關系型數據庫中,所有信息應該只出現一次。但是因為數據庫設計的問題,有些信息可能會被分成彼此相關的不同表。當我們想要將這些相關信息放在一起以分析其數據的時候,我們就需要將所有數據(或其中一些)連接在一起。在這種情況下,您需要使用 SQL 的JOIN語句。SQL連接類型有內連接,外連接(又分為左外和右外連接兩種,這里我們把它們當做一種)和全連接三種,讓我們了解它們是如何工作的。
SQL 中的 JOIN 是什么?
JOIN 運算符允許您以各種方式組合相關信息,正如我在上面簡要解釋的那樣。連接有多種類型,分為兩大類 - 內部連接和外部連接。
INNER JOIN 和 OUTER JOIN 之間的最大區(qū)別在于,內連接將僅保留來自彼此相關的兩個表(在結果表中)的信息。另一方面,外部聯(lián)接還將保留與結果表中的另一個表無關的信息。
讓我們詳細了解 INNER JOIN 和 OUTER JOIN 如何工作以更好地理解它們。
如何在 SQL 中使用 INNER JOIN
內部聯(lián)接將僅保留來自兩個相關聯(lián)的表的信息。如果您將這兩個表想象為維恩圖,則由 INNER JOIN 生成的表將是下面它們重疊的綠色突出顯示部分:
內連接的維恩圖表示這是內部聯(lián)接的語法:
SELECT * FROM table1
JOIN table2
ON relation;
內連接語法我們將在下面通過一個例子來了解它是如何工作的。
如何在 SQL 中使用 OUTER JOIN
如果要保留所有數據,而不僅僅是相互關聯(lián)的數據,則可以使用 OUTER 聯(lián)接。
有三種類型的外部聯(lián)接:LEFT JOIN,RIGHT JOIN,和FULL JOIN。它們之間的差異涉及它們保留哪些不相關的數據——它可以來自第一個表、第二個表或兩者。沒有要填充的數據的單元格的值為NULL。
注意:LEFT JOIN是所有版本的 SQL 中最普遍實現的。但是對于RIGHT JOIN和FULL JOIN就不是這樣了,在早期的各種SQL版本中都沒有實現(但oracle數據庫在數據表連接方面實現得比較充分)。
讓我們看看每個人是如何單獨工作的。然后我們將通過下面的示例了解它們是如何工作的。
SQL中的左外連接
LEFT OUTER JOIN,或簡稱Left Join,將保留左(第一個)表中的不相關數據。
您可以用帶有兩個圓圈的維恩圖來想象它,結果表是綠色突出顯示的部分,其中包括公共/重疊部分和左側圓圈的其余部分。
左外連接的維恩圖表示語法如下所示。您會看到它類似于 Inner Join 語法,但添加了LEFT關鍵字。
SELECT columns
FROM table1
LEFT JOIN table2
ON relation;
左外連接SQL 中的右外部聯(lián)接
RIGHT OUTER JOIN,或簡稱為Right Join,將保留與第一個表無關的第二個表中的數據。
您可以用帶有兩個圓圈的維恩圖來想象它,結果表是綠色突出顯示的部分,其中包括重疊部分和右側圓圈的其余部分。
右外連接的維恩圖表示語法如下,唯一的區(qū)別是RIGHT關鍵字。
SELECT columns
FROM table1
RIGHT JOIN table2
ON relation;
右外連接SQL 中的完全外部聯(lián)接
您可以將 FULL OUTER JOIN 視為左連接和右連接的組合。它將保留兩個表中的所有行,缺失的數據將用NULL.
您可以用帶有兩個圓圈的維恩圖來想象它,結果表是綠色突出顯示的部分,其中包括所有內容:重疊部分、左圓和右圓。
完全外連接的維恩圖表示語法如下,使用FULL關鍵字。
SELECT columns
FROM table1
FULL JOIN table2
ON relation;
全外連接SQL JOIN 運算符示例
獸醫(yī)診所可能的數據庫可以有一張用于寵物的表和一張用于主人的表。由于一個所有者可能有多個寵物,因此 pets 表將有一owner_id列指向所有者表。
身份證 | 姓名 | 年齡 | 所有者_ID |
---|---|---|---|
1 | 菲多 | 7 | 1 |
2 | 小姐 | 3 | 1 |
3 | 娘娘腔 | 10 | 2 |
4 | 銅 | 1 | 3 |
5 | 料斗 | 2 | 0 |
身份證 | 姓名 | 電話號碼 |
---|---|---|
1 | 約翰尼 | 4567823 |
2 | 奧利 | 7486513 |
3 | 伊萊尼亞 | 3481365 |
4 | 路易絲 | 1685364 |
您可以使用簡單的查詢來獲取一個帶有彼此相鄰的寵物名稱和所有者名稱的表。讓我們用所有不同的 JOIN 運算符來做。
SQL 內部聯(lián)接示例
讓我們首先使用JOIN.
在這種情況下,你會SELECT選擇在pets表中的列name(并將其重命名pet_name)。然后從owners表中選擇列name,并將其重命名為owner.。這將是這樣的:?SELECT pets.name AS pet_name, owners.name AS owner
?。
接著,可以使用FROM關鍵字聲明列來自pets表,并使用JOIN關鍵字聲明想與owners表進行連接:?FROM pets JOIN owner
?。
最后,當需要加入的兩列一一對應時,使用ON關鍵字將pets表的owner_id與owners表的id使用等號連接起來: ?pets.owner_id = owners.id
?。
這是全部:
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
JOIN owners
ON pets.owner_id = owners.id;
您將得到如下表格,其中僅包括與主人有關的寵物和與寵物有關的主人。
寵物名稱 | 所有者 |
---|---|
菲多 | 約翰尼 |
小姐 | 約翰尼 |
娘娘腔 | 奧利 |
銅 | 伊萊尼亞 |
SQL LEFT JOIN 示例
讓我們執(zhí)行相同的查詢,LEFT JOIN以便您可以看到不同之處。除了添加LEFT關鍵字之外,查詢是相同的。
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
LEFT JOIN owners
ON pets.owner_id = owners.id;
在這種情況下,左表中的行pets, 全部保留,當owners表中缺少數據時,用 填充NULL。
寵物名稱 | 所有者 |
---|---|
菲多 | 約翰尼 |
小姐 | 約翰尼 |
娘娘腔 | 奧利 |
銅 | 伊萊尼亞 |
料斗 | 空 |
似乎有一只寵物沒有在主人那里注冊。
SQL 右連接示例
如果您使用 using 執(zhí)行相同的查詢RIGHT JOIN,則會得到不同的結果。
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
RIGHT JOIN owners
ON pets.owner_id = owners.id;
在這種情況下,右表中的所有行owners, 都被保留,如果有缺失值,則用 填充NULL。
寵物名稱 | 所有者 |
---|---|
菲多 | 約翰尼 |
小姐 | 約翰尼 |
娘娘腔 | 奧利 |
銅 | 伊萊尼亞 |
空 | 路易絲 |
似乎有一個沒有注冊寵物的主人。
SQL 全連接示例
您可以再次執(zhí)行相同的查詢,使用FULL JOIN.
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
FULL JOIN owners
ON pets.owner_id = owners.id;
結果表再次不同——在這種情況下,兩個表中的所有行都被保留。
寵物名稱 | 所有者 |
---|---|
菲多 | 約翰尼 |
小姐 | 約翰尼 |
娘娘腔 | 奧利 |
銅 | 伊萊尼亞 |
料斗 | 空 |
空 | 路易絲 |
在我們的數據庫中似乎有沒有主人的寵物和沒有寵物的主人。
結論
在關系數據庫中,所有數據都應該只寫入一次。然后要分析這些數據,您需要將相關數據連接在一起。
以上就是關于sql連接的全部內容了,更多sql的學習知識可以關注W3Cschool。