App下載

SQL 連接類型 – 內(nèi)連接 VS 外連接示例

幼兒園的高材生 2021-08-24 14:07:15 瀏覽數(shù) (4434)
反饋

在關(guān)系型數(shù)據(jù)庫(kù)中,所有信息應(yīng)該只出現(xiàn)一次。但是因?yàn)閿?shù)據(jù)庫(kù)設(shè)計(jì)的問(wèn)題,有些信息可能會(huì)被分成彼此相關(guān)的不同表。當(dāng)我們想要將這些相關(guān)信息放在一起以分析其數(shù)據(jù)的時(shí)候,我們就需要將所有數(shù)據(jù)(或其中一些)連接在一起。在這種情況下,您需要使用 SQL 的JOIN語(yǔ)句。SQL連接類型有內(nèi)連接,外連接(又分為左外和右外連接兩種,這里我們把它們當(dāng)做一種)和全連接三種,讓我們了解它們是如何工作的。

SQL 中的 JOIN 是什么?

JOIN 運(yùn)算符允許您以各種方式組合相關(guān)信息,正如我在上面簡(jiǎn)要解釋的那樣。連接有多種類型,分為兩大類 - 內(nèi)部連接和外部連接。

INNER JOIN 和 OUTER JOIN 之間的最大區(qū)別在于,內(nèi)連接將僅保留來(lái)自彼此相關(guān)的兩個(gè)表(在結(jié)果表中)的信息。另一方面,外部聯(lián)接還將保留與結(jié)果表中的另一個(gè)表無(wú)關(guān)的信息。

讓我們?cè)敿?xì)了解 INNER JOIN 和 OUTER JOIN 如何工作以更好地理解它們。

如何在 SQL 中使用 INNER JOIN

內(nèi)部聯(lián)接將僅保留來(lái)自兩個(gè)相關(guān)聯(lián)的表的信息。如果您將這兩個(gè)表想象為維恩圖,則由 INNER JOIN 生成的表將是下面它們重疊的綠色突出顯示部分:

內(nèi)連接
內(nèi)連接的維恩圖表示

這是內(nèi)部聯(lián)接的語(yǔ)法:

SELECT * FROM table1
    JOIN table2
    ON relation;
內(nèi)連接語(yǔ)法

我們將在下面通過(guò)一個(gè)例子來(lái)了解它是如何工作的。

如何在 SQL 中使用 OUTER JOIN

如果要保留所有數(shù)據(jù),而不僅僅是相互關(guān)聯(lián)的數(shù)據(jù),則可以使用 OUTER 聯(lián)接。

有三種類型的外部聯(lián)接:LEFT JOIN,RIGHT JOIN,和FULL JOIN。它們之間的差異涉及它們保留哪些不相關(guān)的數(shù)據(jù)——它可以來(lái)自第一個(gè)表、第二個(gè)表或兩者。沒(méi)有要填充的數(shù)據(jù)的單元格的值為NULL。

注意:LEFT JOIN是所有版本的 SQL 中最普遍實(shí)現(xiàn)的。但是對(duì)于RIGHT JOIN和FULL JOIN就不是這樣了,在早期的各種SQL版本中都沒(méi)有實(shí)現(xiàn)(但oracle數(shù)據(jù)庫(kù)在數(shù)據(jù)表連接方面實(shí)現(xiàn)得比較充分)。

讓我們看看每個(gè)人是如何單獨(dú)工作的。然后我們將通過(guò)下面的示例了解它們是如何工作的。

SQL中的左外連接

LEFT OUTER JOIN,或簡(jiǎn)稱Left Join,將保留左(第一個(gè))表中的不相關(guān)數(shù)據(jù)。

您可以用帶有兩個(gè)圓圈的維恩圖來(lái)想象它,結(jié)果表是綠色突出顯示的部分,其中包括公共/重疊部分和左側(cè)圓圈的其余部分。

左外連接
左外連接的維恩圖表示

語(yǔ)法如下所示。您會(huì)看到它類似于 Inner Join 語(yǔ)法,但添加了LEFT關(guān)鍵字。

SELECT columns
  FROM table1
  LEFT JOIN table2
  ON relation;
左外連接

SQL 中的右外部聯(lián)接

RIGHT OUTER JOIN,或簡(jiǎn)稱為Right Join,將保留與第一個(gè)表無(wú)關(guān)的第二個(gè)表中的數(shù)據(jù)。

您可以用帶有兩個(gè)圓圈的維恩圖來(lái)想象它,結(jié)果表是綠色突出顯示的部分,其中包括重疊部分和右側(cè)圓圈的其余部分。

帶有重疊部分的兩個(gè)圓圈。 左圈標(biāo)記為表 1,右圈標(biāo)記為表 2。疊加部分和表 2 圈的其余部分為綠色。
右外連接的維恩圖表示

語(yǔ)法如下,唯一的區(qū)別是RIGHT關(guān)鍵字。

SELECT columns
  FROM table1
  RIGHT JOIN table2
  ON relation;
右外連接

SQL 中的完全外部聯(lián)接

您可以將 FULL OUTER JOIN 視為左連接和右連接的組合。它將保留兩個(gè)表中的所有行,缺失的數(shù)據(jù)將用NULL.

您可以用帶有兩個(gè)圓圈的維恩圖來(lái)想象它,結(jié)果表是綠色突出顯示的部分,其中包括所有內(nèi)容:重疊部分、左圓和右圓。

帶有重疊部分的兩個(gè)圓圈。 左邊的圓圈被標(biāo)記為表 1,右邊的圓圈被標(biāo)記為表 2。一切都以綠色著色。
完全外連接的維恩圖表示

語(yǔ)法如下,使用FULL關(guān)鍵字。

SELECT columns
  FROM table1
  FULL JOIN table2
  ON relation;
全外連接

SQL JOIN 運(yùn)算符示例

獸醫(yī)診所可能的數(shù)據(jù)庫(kù)可以有一張用于寵物的表和一張用于主人的表。由于一個(gè)所有者可能有多個(gè)寵物,因此 pets 表將有一owner_id列指向所有者表。

身份證姓名年齡所有者_(dá)ID
1菲多71
2小姐31
3娘娘腔102
413
5料斗20
身份證姓名電話號(hào)碼
1約翰尼4567823
2奧利7486513
3伊萊尼亞3481365
4路易絲1685364

您可以使用簡(jiǎn)單的查詢來(lái)獲取一個(gè)帶有彼此相鄰的寵物名稱和所有者名稱的表。讓我們用所有不同的 JOIN 運(yùn)算符來(lái)做。

SQL 內(nèi)部聯(lián)接示例

讓我們首先使用JOIN.

在這種情況下,你會(huì)SELECT選擇在pets表中的列name(并將其重命名pet_name)。然后從owners表中選擇列name,并將其重命名為owner.。這將是這樣的:?SELECT pets.name AS pet_name, owners.name AS owner?。

接著,可以使用FROM關(guān)鍵字聲明列來(lái)自pets表,并使用JOIN關(guān)鍵字聲明想與owners表進(jìn)行連接:?FROM pets JOIN owner?。

最后,當(dāng)需要加入的兩列一一對(duì)應(yīng)時(shí),使用ON關(guān)鍵字將pets表的owner_id與owners表的id使用等號(hào)連接起來(lái): ?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;

您將得到如下表格,其中僅包括與主人有關(guān)的寵物和與寵物有關(guān)的主人。

寵物名稱所有者
菲多約翰尼
小姐約翰尼
娘娘腔奧利
伊萊尼亞

SQL LEFT JOIN 示例

讓我們執(zhí)行相同的查詢,LEFT JOIN以便您可以看到不同之處。除了添加LEFT關(guān)鍵字之外,查詢是相同的。

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  LEFT JOIN owners
  ON pets.owner_id = owners.id;

在這種情況下,左表中的行pets, 全部保留,當(dāng)owners表中缺少數(shù)據(jù)時(shí),用 填充NULL。

寵物名稱所有者
菲多約翰尼
小姐約翰尼
娘娘腔奧利
伊萊尼亞
料斗

似乎有一只寵物沒(méi)有在主人那里注冊(cè)。

SQL 右連接示例

如果您使用 using 執(zhí)行相同的查詢RIGHT JOIN,則會(huì)得到不同的結(jié)果。

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  RIGHT JOIN owners
  ON pets.owner_id = owners.id;

在這種情況下,右表中的所有行owners, 都被保留,如果有缺失值,則用 填充NULL。

寵物名稱所有者
菲多約翰尼
小姐約翰尼
娘娘腔奧利
伊萊尼亞
路易絲

似乎有一個(gè)沒(méi)有注冊(cè)寵物的主人。

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;

結(jié)果表再次不同——在這種情況下,兩個(gè)表中的所有行都被保留。

寵物名稱所有者
菲多約翰尼
小姐約翰尼
娘娘腔奧利
伊萊尼亞
料斗
路易絲

在我們的數(shù)據(jù)庫(kù)中似乎有沒(méi)有主人的寵物和沒(méi)有寵物的主人。

結(jié)論

在關(guān)系數(shù)據(jù)庫(kù)中,所有數(shù)據(jù)都應(yīng)該只寫(xiě)入一次。然后要分析這些數(shù)據(jù),您需要將相關(guān)數(shù)據(jù)連接在一起。

以上就是關(guān)于sql連接的全部?jī)?nèi)容了,更多sql的學(xué)習(xí)知識(shí)可以關(guān)注W3Cschool


SQL

0 人點(diǎn)贊