首頁 > 後端開發 > php教程 > 3再加入您應該熟悉

3再加入您應該熟悉

Joseph Gordon-Levitt
發布: 2025-02-16 13:06:13
原創
596 人瀏覽過

3再加入您應該熟悉

鑰匙要點

  • >本文解釋了左JOIN,右JOIN,INTER JOIN和外部加入SQL的用法,使用一個簡單的書籍貸款數據庫,帶有兩個表:客戶和書籍。 SQL連接中“左”和“右”的概念
  • 澄清的概念無非是來源順序。聯接關鍵字之前提到的表是“左”表,而後面的表則是“右”表。
  • >文章介紹了與排除的概念,這些概念對於包括“不要”或“不”的查詢很有用。這些連接使用Where子句來排除數據,特別是在尋找null值時。
  • >
  • 具有排除的外部連接被描述為在表之間沒有連接的情況下選擇數據,儘管它在mysql中不支持。
  • >強調,應始終將其子句用於不能將其作為其實際價值的字段使用。另外,注意到Cross Join是一個唯一的聯接,與表A中的每個行與表B中的每個行匹配
  • 有很多方法可以從兩個數據庫表中加入數據並過濾所需的信息。克雷格·巴克勒(Craig Buckler)寫了一篇關於理解加入的流行文章。即內部,左,右和全外部。本文是該文章的擴展。
>

>讓我們快速回顧一下。圖片兩張桌子,一張適合客戶的桌子,一個用於建立圖書貸款數據庫的書籍。 >

>客戶表


id

> firstName > lastname book_id 1 喬 吹 1 2 簡 母鹿 2 3 哈利 烏鴉 2 4 杰弗裡 雪 0 書籍表 id

>標題

1 星際大戰 2 侏羅紀公園 3 小女人 4 湯姆·索耶(Tom Sawyer) 書籍表都有每一本行。 > >客戶的表有每行的一行,他們一次只能藉一本書。如果他們沒有租借書,則book_id是0或一個空字符串。 > 這是一個非常簡單的示例,可以使加入盡可能清楚地理解!

>

在這里左JON會在您想提出一個問題的情況下,例如“

向我展示所有客戶,包括任何借來的書籍。

>您可以在圖像中看到結果集中包含左圓或表中的所有數據。從右表中包含了從書籍表中重疊的數據。這意味著,在左聯接時,右表中的某些數據可能被排除在外。 > 正確的加入就像問“

>向我展示我的圖書館中的所有書籍,以及借用它們的任何客戶。

3再加入您應該熟悉

在此圖像中,您會看到右表中的所有數據都包含在結果集中。僅包括與客戶表重疊的數據。這意味著,通過正確的加入,左表中的某些數據可能被排除在外。

>

一個外部聯盟就像問“

向我展示所有貸款和所有書籍,無論它們之間有什麼聯繫。

在此圖像中,您可以看到將包括兩個表中的所有數據,而不管某些數據是否重疊。完成此類查詢後,您將在結果中有不重疊的數據,這些字段將設置為null。 3再加入您應該熟悉內在的加入就像問“

僅向客戶展示貸款。

>在這裡,您可以看到數據可以從左右表中排除。如果沒有書,您將不會看到任何客戶,如果沒有借錢,您將不會看到任何書! >

>這是最常見的數據類型,是使用關鍵字自身加入時的默認行為。通常不需要添加的“內部”單詞。

> 3再加入您應該熟悉“左”和“右”是什麼意思?

>

>您可以將“左”和“右”視為源訂單。查看此查詢:

請注意,在使用JOIN關鍵字之前,我提到了表客戶。這意味著客戶是我的“左”桌子。考慮它的另一種思考方式是詢問Join關鍵字的哪個表格,哪個是在其右邊。

幾個警告:

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登入後複製
登入後複製
登入後複製
僅僅是因為一個表是“左”,並不意味著您正在選擇其所有記錄。這是左聯接或右鍵的功能,而不是源訂單!

>

左右的表將首先在結果集中列出其列,除非您在選擇部分中專門選擇列。

在關鍵字之後表的順序無關緊要,如果交換了,它將返回相同的結果。
    >
  • >足夠的審查。這些新加入是什麼?
  • 好吧,它們不是“新”,它們只是查詢其他問題的一種方式。您如何在查詢中使用“不要”或“不”一詞的問題找到問題的答案?
  • >
  • >
向我展示所有沒有借書的客戶。

>

>向我展示所有未借出的書籍。

> 左將與排除

看一下此圖形。注意與上述連接在陰影區域中的區別。

>這看起來像是左聯接,但不再包含“重疊”數據。為什麼?這與“向我展示沒有租借書籍的客戶”的詢問一樣。 如果您很聰明,您可能會認為您只需在客戶表中搜索一個book_id的0 book_id即可完成同樣的事情。在此示例中,這將起作用,但是大多數情況下都不會。這取決於您的桌子的設計。 >

查詢看起來像這樣:

>現在我們包含了一個Were子句。每當您有一個子句時,您都將排除

數據或過濾它,幾乎像搜索一樣。那麼,為什麼我們要搜索books.id是無效的?為什麼這是無效的?讓我們運行左鍵的標準並查看其返回的數據,我們將有答案:>
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登入後複製
登入後複製
登入後複製
左加入返回數據

id

> firstName

> lastname book_id > id1 >標題 1 喬 吹 1 1 星際大戰 2 簡 母鹿 2 2 侏羅紀公園 3 哈利 烏鴉 2 2 侏羅紀公園 4 杰弗裡 雪 0 無效的 無效的 您可以看到這個問題嗎?這是一個左聯接,這意味著無論與書籍重疊如何,都包含來自客戶表的所有數據。包括杰弗裡·斯諾(Jeffrey Snow),但他沒有借書的書,這就是為什麼“ ID1”和“標題”列將其設置為Null的原因。加入桌子時,將不會有與他鏈接的書名或書ID。 如果我們問“ 向我展示所有客戶,包括他們擁有的書籍>”,您將需要上述數據,因為杰弗裡(Jeffrey)是客戶,無論他是否有一本書。在這種情況下,那將是左加入的功能。 > 如果我們提出一個問題“

向我展示沒有借書的書籍

的客戶”,那麼現在要尋找的是很有意義。我們只需要選擇“讀取null”的客戶。 ID列(加入後,將標記為ID1,因為有兩個名為“ ID”的列)。如果我們添加books.id為null,我們將使用標準條款來執行此操作。現在,結果被過濾到以下內容:

id

> firstName

> lastname

book_id > id1 >標題 4 杰弗裡 雪 0 無效的 無效的 >您現在有所有沒有借書的客戶。 > 右加入dublufusion >讓我們與正確的聯接一起做同樣的事情。讓我們找到所有沒有借給任何人的書。 >

正常的權利加入將返回每本書,無論其是否借貸,結果集看起來像這樣:

id > firstName > lastname book_id > id1 >標題 1 喬 吹 1 1 星際大戰 2 簡 母鹿 2 2 侏羅紀公園 3 哈利 烏鴉 2 2 侏羅紀公園 無效的 無效的 無效的 無效的 3 小女人 無效的 無效的 無效的 無效的 4 湯姆·索耶(Tom Sawyer) 這看起來有些不同。首先,您可能會注意到侏羅紀公園被列為兩次。這是因為兩個人借來了這本書,並且數據庫正在為每場比賽返回一行。

請注意,來自客戶表的所有相應列對於小女性和湯姆·索耶(Tom Sawyer)來說都是無效的,因為沒有人藉這些標題,因此沒有重疊的數據。

如果我們想選擇所有未借出的書籍,我們只使用Where子句在客戶中找到“ null”。

該結果應該是可以預測的。我們只會得到未借出的書籍。

>

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登入後複製
登入後複製
登入後複製
id

> firstName

> lastname book_id > id1 >標題 無效的 無效的 無效的 無效的 3 小女人 無效的 無效的 無效的 無效的 4 湯姆·索耶(Tom Sawyer) >外部連接 最後的聯接看起來像這樣。

此加入不是很有用,但從本質上講,這兩個客戶都沒有貸款和未借貸的書籍。

>這樣的奇怪加入可能在您需要在表之間沒有連接的情況下選擇數據的情況下可能很有用。也許您正在尋找孤兒數據或在您轉換的某些舊數據庫中尋找不一致之處。

3再加入您應該熟悉實際上,這種加入是如此奇怪,以至於您甚至無法在MySQL中進行,它不支持外部加入。常規SQL確實可以,並且查詢看起來像這樣(MSSQL不是mysql):

>

此查詢的結果將返回像這樣的數據:

>

id

> firstName
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>WHERE books.id IS NULL
登入後複製

> lastname

book_id > id1 >標題 1 杰弗裡 雪 0 無效的 無效的 無效的 無效的 無效的 無效的 3 小女人 無效的 無效的 無效的 無效的 4 湯姆·索耶(Tom Sawyer) >您可以使用Craig Buckler與聯盟解釋的方法實現外部連接,但這並非沒有潛在的問題。模擬MySQL中完整外部連接的頂級Google結果是從2006年開始,可以在此處找到。它可能會變得有些複雜。 >上面代碼中要注意的主要內容是檢查連接兩側的空,因為我們想從兩個表中排除。在沒有檢查雙方的情況下,我們最終只會談論其他一個。 > >不管像這樣的查詢如何奇異或如何支持,我都想包括它,因為它是一種有效的加入類型,如果您可以考慮使用它的理由。

其他想法

>您應該始終將您的Where子句用於無法將其null作為其實際值的字段!我們總是針對無法將其作為值的ID字段進行測試。想像一下,如果我們的書籍桌有一個允許空的ISBN字段。如果我們使用該字段測試了null,則包括我們可能不想要的行! > >還有另一個稱為“十字聯接”的聯接,這也是奇怪而獨特的。想像一下,不僅將一個用戶與一本書匹配,而是每個用戶都與每本書匹配!是的,這意味著,如果您有20本書和30個客戶,交叉加入將產生30*20行數據!有關如何有用的示例,請查看本文。

請注意,在MySQL中,連接,內聯接和交叉連接是句法等效物,可以互相替換。這是因為加入和內連接執行相同的操作,並且必須使用關鍵字與列匹配。使用交叉連接時,關鍵字沒有,因為它將表A中的每個行與表B中的每個行匹配

結論

我希望這些額外的幾加入對您有意義。考慮在您要求在表“不”匹配另一個表格之間的表之間的數據時,請考慮使用它們。

>

“找到所有以前從未訂購過的客戶”。

>

“找到所有不在黑名單中的所有客戶”。
    >
  • “查找所有尚未出售的產品”。
  • >
  • “找到所有客戶都不借書”。
  • “找到最近沒有走路的所有狗”。
  • >
  • “找到從未發送過支持票的員工”。
  • >
  • 總而言之,根據如何定義數據庫和表格,您可能需要使用Where子句來檢查null值為dubl
  • >
indose

以正常的聯接行為。 >所以……您是否需要十字架加入?您想告訴我們或想讓我們覆蓋的其他特定用例嗎?讓我們知道! 經常詢問有關SQL加入

的問題(常見問題解答)

>基於它們之間的相關列,使用了什麼類型的SQL連接,它們彼此之間有何不同? SQL連接的基本類型有四種:內部加入,左連接,右JOIN和FULL JOIN。內部加入返回記錄,這些記錄在兩個表中都具有匹配值。左JOIN從左表返回所有記錄,以及右表的匹配記錄。右JOIN從右表返回所有記錄,以及左表的匹配記錄。左或右表有匹配時,Full Join返回所有記錄。

>

>如何在SQL中使用多個加入?

​​>可以在SQL中使用多個加入,只需在您的SQL查詢中添加更多JOIN語句即可。每個加入語句都必須有自己的條款,以指定加入條件。查詢中的加入語句的順序可能會影響結果,因此在使用多個加入時仔細考慮查詢的邏輯很重要。

什麼是SQL中的三個桌子連接,它如何工作?

>在SQL中的三個桌子連接是一種基於它們之間的相關列組合的連接類型。這是通過在SQL查詢中使用兩個加入語句來完成的。第一個加入語句結合了前兩個表,第二個加入語句結合了第一個聯接的結果與第三個表。 JOIN語句的順序以及ON子句中指定的條件確定表如何組合。

>

>左JOIN與SQL的右JOIN之間有什麼區別?左連接和SQL中的右JOIN之間的區別是將表加入和返回結果的順序。左聯接從左表返回所有記錄,以及右表中匹配的記錄。如果沒有匹配,則結果在右側為無效。另一方面,右連接將返回右表和左表中匹配的記錄的所有記錄。如果沒有匹配,結果在左側為無效。

>如何可視化SQL連接?

可以使用Venn圖可視化SQL結合。圖中的每個圓都代表一個表。圓圈重疊的區域表示聯接返回的記錄。對於內部連接,僅顯示重疊區域。對於左連接,顯示了所有左圓和重疊區域。對於正確的連接,顯示了所有正確的圓和重疊區域。為了完整的聯接,顯示了兩個圓圈的整個區域。

>

什麼是SQL中的完整加入,什麼時候應該使用它?

>在SQL中的完整加入SQL時返回所有記錄是左表或右表中的匹配。如果沒有匹配,則結果在兩側為無效。當您要保留兩個表中的所有記錄時,這種類型的加入也很有用,即使列之間沒有匹配。 🎜>是的,您可以使用SQL連接兩個以上的表。這是通過在您的SQL查詢中使用多個加入語句來完成的。每個加入語句都結合了兩個表,因此要加入三個表,您將使用兩個加入語句,以加入四個表,您將使用三個加入語句,依此類推。

>

>在SQL中使用多個連接的性能影響是什麼?在SQL中使用多個JONINS中的多個連接可以對查詢性能產生重大影響,尤其是在加入的表格上有大量記錄。每個加入操作都需要處理能力和內存,因此您在查詢中擁有的加入越多,執行查詢所需的資源就越多。但是,可以通過使用索引,優化查詢並使用適當的硬件來減輕性能的影響。

>

>如何優化使用加入的SQL查詢?您使用加入的SQL查詢。一種方法是在正在連接的列上使用索引。這可以大大加快聯接操作。另一種方法是限制查詢返回的記錄數量,使用WHERE子句。另外,查詢中的加入語句的順序可能會影響性能,因此仔細考慮查詢的邏輯很重要。

>

>使用SQL JON時,

有什麼常見的錯誤? >使用SQL加入時要避免的一些常見錯誤包括忘記指定“ ON子句”,這可能會導致笛卡爾產品,加入非索引列,這可以減慢查詢性能,並使用錯誤的類型的JOIN類型,可以結果結果不正確。同樣重要的是要記住,查詢中的加入語句的順序可能會影響結果,因此仔細考慮查詢的邏輯很重要。

>

以上是3再加入您應該熟悉的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板