outer - sql同時查詢兩個資料表




Left,Right,Outer和Inner Joins之間有什麼區別? (7)

我想知道如何區分所有這些不同的連接...


SQL JOINS的區別:

非常簡單的記住:

INNER JOIN只顯示兩個表INNER JOIN記錄。

OUTER JOIN兩個表的所有內容都合併在一起,不管它們是否匹配。

LEFT JOINLEFT OUTER JOIN相同 - (從第一個(最左邊)表中選擇具有匹配右表記錄的記錄。)

RIGHT JOINRIGHT OUTER JOIN相同 - (從第二個(最右邊)表中選擇具有匹配左表記錄的記錄。)


LEFT JOINRIGHT JOINOUTER JOIN的類型。

INNER JOIN是缺省值 - 兩個表中的行必須匹配連接條件。


簡單的例子 :假設你有一個Students表和一個Lockers表。 在SQL中,您在聯接中指定的第一個表“ Students ”是LEFT表,而第二個表是Lockers ,它是RIGHT表。

每個學生都可以分配到一個儲物櫃,所以Student表中有一個LockerNumber列。 不止一個學生可能會在一個單一的儲物櫃中,但特別是在學年開始時,您可能會有一些沒有儲物櫃的入學學生和一些沒有分配學生的儲物櫃。

為了這個例子,假設你有100個學生 ,其中70個有儲物櫃。 你總共有50個儲物櫃 ,其中40個至少有1個學生,10個儲物櫃沒有學生。

INNER JOIN相當於“ 向所有學生展示儲物櫃 ”。
任何沒有儲物櫃的學生或沒有學生的儲物櫃都會丟失。
返回70行

LEFT OUTER JOIN將“ 向我展示所有學生,如果他們有相應的儲物櫃,請給我看看 ”。
這可能是一個普通的學生名單,或者可以用來識別沒有儲物櫃的學生。
返回100行

RIGHT OUTER JOIN將會“ 向我展示所有的儲物櫃,並且如果有任何儲物櫃,將給予他們的學生 ”。
這可以用來識別沒有分配學生的儲物櫃,或者有太多學生的儲物櫃。
返回80行 (40個儲物櫃中的70名學生列表,以及10個沒有學生的儲物櫃)

FULL OUTER JOIN會很愚蠢,可能用處不大。
就像“ 向我展示所有學生和所有儲物櫃,並在可以的地方將它們匹配起來
返回110行 (全部100名學生,包括沒有儲物櫃的學生,加上沒有學生的10個儲物櫃)

在這種情況下, CROSS JOIN也相當愚蠢。
它不使用學生表中的鏈接lockernumber字段,所以你基本上最終會列出每個可能的學生對鎖對配對的巨大列表,不管它是否真的存在。
返回5000行 (100個學生x 50個儲物櫃)。 可以用(過濾)作為起點,將新學生與空的儲物櫃相匹配。



只有4種:

  1. 內部連接 :最常見的類型。 為連接條件匹配的每對輸入行生成一個輸出行。
  2. 左外連接 :與內連接相同,不同之處在於,如果有任何行可以找到右側表中沒有匹配的行,則會輸出一行,其中包含左側表中的值,其中NULL為右表中的每個值都在右邊。 這意味著左邊表格的每一行在輸出中至少會出現一次。
  3. 右外連接 :與左外連接相同,但表格的角色相反。
  4. 完全外連接 :左外連接和右外連接的組合。 來自兩個表格的每一行都將至少出現在輸出中一次。

“交叉連接”或“笛卡爾連接”只是一個沒有指定連接條件的內部連接,導致輸出所有行對。

感謝RusselH指出FULL連接,這是我省略的。


有三種基本的連接類型:

  • INNER連接比較兩個表,並僅在存在匹配的情況下返回結果。 當第一張表中的記錄與第二張中的多個結果相匹配時,將重複記錄。 INNER聯接傾向於使結果集更小,但由於記錄可以重複,因此不能保證。
  • CROSS連接比較兩個表並返回兩個表中各行的所有可能組合。 你可以從這種連接中獲得很多結果,這些結果可能甚至沒有意義,所以請謹慎使用。
  • OUTER連接比較兩個表,並在匹配可用時返回數據,否則返回NULL值。 與INNER連接一樣,當它與另一個表中的多個記錄相匹配時,這將在一個表中重複行。 OUTER連接往往會使結果集變大,因為它們本身不會從集合中刪除任何記錄。 您還必須限定OUTER連接以確定何時以及在哪裡添加NULL值:
    • LEFT表示無論如何保留來自第一個表的所有記錄,並在第二個表不匹配時插入NULL值。
    • RIGHT意味著相反:無論如何保留第二個表中的所有記錄,並在第一個表不匹配時插入NULL值。
    • FULL表示保留兩個表中的所有記錄,如果不匹配,則在任一表中插入NULL值。

通常你會發現語法中省略了OUTER關鍵字。 相反,它只會是“左連接”,“右連接”或“全連接”。 這樣做是因為INNER和CROSS聯接對於左,右或全部沒有意義,所以這些就足以明確地指示一個OUTER聯接。

以下是您可能想要使用每種類型的示例:

  • INNER :您想要返回“發票”表中的所有記錄以及相應的“發票行”。 這假定每個有效的發票至少有一行。
  • OUTER :您想要返回特定發票的所有“InvoiceLines”記錄及其相應的“InventoryItem”記錄。 這是一種也銷售服務的業務,因此並非所有InvoiceLines都有IventoryItem。
  • CROSS :你有一個有10行的數字表,每個數字的值都是'0'到'9'。 您希望創建一個日期範圍表來加入,以便在範圍內的每一天結束一個記錄。 通過將此表與自己重複交叉連接,您可以根據需要創建盡可能多的連續整數(假設您以10到1的次方開始,每個連接都將1加到指數上)。 然後使用DATEADD()函數將這些值添加到該範圍的基準日期。

起初你必須了解連接做什麼? 我們連接多個表並從連接表中獲取特定結果。 最簡單的方法是交叉連接

假設tableA有兩列A和B.而tableB有三列C和D.如果我們應用交叉連接,它會產生很多無意義的行。 然後我們必須使用主鍵匹配來獲取實際數據。

左:它將返回左表中的所有記錄和右表中的匹配記錄。

右:它將返回與左連接相反。 它將從右表中返回所有記錄,並從左表中返回匹配的記錄。

內在:這就像交集。 它將只返回來自兩個表的匹配記錄。

外:這就像聯盟。 它將從這兩個表中返回所有可用的記錄。

有時候我們不需要所有的數據,而且我們也只需要通用數據或記錄。 我們可以使用這些連接方法輕鬆獲得它。 記住左右連接也是外連接。

您可以使用交叉連接來獲取所有記錄。 但涉及數百萬條記錄可能會很昂貴。 所以通過使用左,右,內部或外部聯接來簡化它。

謝謝





join