>讓我們快速回顧一下。圖片兩張桌子,一張適合客戶的桌子,一個用於建立圖書貸款數據庫的書籍。
>客戶表
id
>標題
1 星際大戰 2 侏羅紀公園 3 小女人 4 湯姆·索耶(Tom Sawyer)>
在這里左JON會在您想提出一個問題的情況下,例如“向我展示所有客戶,包括任何借來的書籍。
>您可以在圖像中看到結果集中包含左圓或表中的所有數據。從右表中包含了從書籍表中重疊的數據。這意味著,在左聯接時,右表中的某些數據可能被排除在外。 > 正確的加入就像問“
>向我展示我的圖書館中的所有書籍,以及借用它們的任何客戶。
>
一個外部聯盟就像問“向我展示所有貸款和所有書籍,無論它們之間有什麼聯繫。
在此圖像中,您可以看到將包括兩個表中的所有數據,而不管某些數據是否重疊。完成此類查詢後,您將在結果中有不重疊的數據,這些字段將設置為null。
內在的加入就像問“
>在這裡,您可以看到數據可以從左右表中排除。如果沒有書,您將不會看到任何客戶,如果沒有借錢,您將不會看到任何書! >
>這是最常見的數據類型,是使用關鍵字自身加入時的默認行為。通常不需要添加的“內部”單詞。>
“左”和“右”是什麼意思?
>您可以將“左”和“右”視為源訂單。查看此查詢:
請注意,在使用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
> lastname
向我展示沒有借書的書籍
的客戶”,那麼現在要尋找的是很有意義。我們只需要選擇“讀取null”的客戶。 ID列(加入後,將標記為ID1,因為有兩個名為“ ID”的列)。如果我們添加books.id為null,我們將使用標準條款來執行此操作。現在,結果被過濾到以下內容:
id
> lastname
book_id正常的權利加入將返回每本書,無論其是否借貸,結果集看起來像這樣:
請注意,來自客戶表的所有相應列對於小女性和湯姆·索耶(Tom Sawyer)來說都是無效的,因為沒有人藉這些標題,因此沒有重疊的數據。
如果我們想選擇所有未借出的書籍,我們只使用Where子句在客戶中找到“ null”。該結果應該是可以預測的。我們只會得到未借出的書籍。
>
<span>SELECT * </span><span>FROM customers </span><span>LEFT JOIN books </span><span>ON customers.book_id = books.id </span>
> firstName
> lastname此加入不是很有用,但從本質上講,這兩個客戶都沒有貸款和未借貸的書籍。
>這樣的奇怪加入可能在您需要在表之間沒有連接的情況下選擇數據的情況下可能很有用。也許您正在尋找孤兒數據或在您轉換的某些舊數據庫中尋找不一致之處。
實際上,這種加入是如此奇怪,以至於您甚至無法在MySQL中進行,它不支持外部加入。常規SQL確實可以,並且查詢看起來像這樣(MSSQL不是mysql):
此查詢的結果將返回像這樣的數據:
>
id
<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>您應該始終將您的Where子句用於無法將其null作為其實際值的字段!我們總是針對無法將其作為值的ID字段進行測試。想像一下,如果我們的書籍桌有一個允許空的ISBN字段。如果我們使用該字段測試了null,則包括我們可能不想要的行! >
>還有另一個稱為“十字聯接”的聯接,這也是奇怪而獨特的。想像一下,不僅將一個用戶與一本書匹配,而是每個用戶都與每本書匹配!是的,這意味著,如果您有20本書和30個客戶,交叉加入將產生30*20行數據!有關如何有用的示例,請查看本文。
結論
我希望這些額外的幾加入對您有意義。考慮在您要求在表“不”匹配另一個表格之間的表之間的數據時,請考慮使用它們。
>>
“找到所有不在黑名單中的所有客戶”。以正常的聯接行為。 >所以……您是否需要十字架加入?您想告訴我們或想讓我們覆蓋的其他特定用例嗎?讓我們知道! 經常詢問有關SQL加入
的問題(常見問題解答)>基於它們之間的相關列,使用了什麼類型的SQL連接,它們彼此之間有何不同? SQL連接的基本類型有四種:內部加入,左連接,右JOIN和FULL JOIN。內部加入返回記錄,這些記錄在兩個表中都具有匹配值。左JOIN從左表返回所有記錄,以及右表的匹配記錄。右JOIN從右表返回所有記錄,以及左表的匹配記錄。左或右表有匹配時,Full Join返回所有記錄。
>什麼是SQL中的三個桌子連接,它如何工作? >在SQL中的三個桌子連接是一種基於它們之間的相關列組合的連接類型。這是通過在SQL查詢中使用兩個加入語句來完成的。第一個加入語句結合了前兩個表,第二個加入語句結合了第一個聯接的結果與第三個表。 JOIN語句的順序以及ON子句中指定的條件確定表如何組合。
>
>左JOIN與SQL的右JOIN之間有什麼區別?左連接和SQL中的右JOIN之間的區別是將表加入和返回結果的順序。左聯接從左表返回所有記錄,以及右表中匹配的記錄。如果沒有匹配,則結果在右側為無效。另一方面,右連接將返回右表和左表中匹配的記錄的所有記錄。如果沒有匹配,結果在左側為無效。 >如何可視化SQL連接? 可以使用Venn圖可視化SQL結合。圖中的每個圓都代表一個表。圓圈重疊的區域表示聯接返回的記錄。對於內部連接,僅顯示重疊區域。對於左連接,顯示了所有左圓和重疊區域。對於正確的連接,顯示了所有正確的圓和重疊區域。為了完整的聯接,顯示了兩個圓圈的整個區域。什麼是SQL中的完整加入,什麼時候應該使用它?
>如何優化使用加入的SQL查詢?您使用加入的SQL查詢。一種方法是在正在連接的列上使用索引。這可以大大加快聯接操作。另一種方法是限制查詢返回的記錄數量,使用WHERE子句。另外,查詢中的加入語句的順序可能會影響性能,因此仔細考慮查詢的邏輯很重要。
>有什麼常見的錯誤? >使用SQL加入時要避免的一些常見錯誤包括忘記指定“ ON子句”,這可能會導致笛卡爾產品,加入非索引列,這可以減慢查詢性能,並使用錯誤的類型的JOIN類型,可以結果結果不正確。同樣重要的是要記住,查詢中的加入語句的順序可能會影響結果,因此仔細考慮查詢的邏輯很重要。
>以上是3再加入您應該熟悉的詳細內容。更多資訊請關注PHP中文網其他相關文章!