Database-Design

左連接子句

  • March 25, 2021

我認為我最好只問為什麼我們將LEFT JOIN子句用於以下任務?

列出所有銷量不佳的製造商名稱和電話號碼……他們生產的任何型號的銷量都少於 3 次。注意,有些廠家可能沒有任何銷售!他們應該被包括在內!

以下是我們的表格:

訂單

  • 訂單號(主鍵)
  • 訂購日期
  • 客戶 ID(客戶表的主鍵)
  • 序列號(機器表的主鍵)

顧客

  • ID(主鍵)
  • Name
  • 電話號碼
  • 街道(即拉馬波谷路 505 號)
  • 城市(即莫瓦)
  • 狀態
  • 壓縮

機器

  • 序列號(主鍵)
  • 型號(型號表的主鍵)
  • 模型
  • ID(主鍵)
  • 速度
  • 記憶體
  • 高畫質
  • 價格
  • 製造商 ID(製造商表的主鍵)

製造商

  • ID(主鍵)
  • Name
  • 電話號碼
  • 電子郵件地址

以下是我們針對這個問題的整個 SQL 語句:

SELECT Manufacturer.Name, Manufacturer.PhoneNo, COUNT(Orders.OrderNo) as NoOfOrders
FROM Manufacturer
LEFT JOIN Model 
   ON Manufacturer.ID = Model.ManufacturerID
LEFT JOIN Machines 
   ON Model.ID = Machines.ModelNo
LEFT JOIN Orders 
   ON Machines.SerialNo = Orders.SerialNo
GROUP BY Orders.OrderNo
HAVING COUNT(*) < 3;

LEFT JOIN本質上不排除任何內容,而是包括子句左側表中的所有JOIN,並且還將包括右側表中的所有匹配行(根據您的內容從兩個表中包含的所有列在您的SELECT列表中指定,在這種情況下,您使用*的是所有列)。對於左側沒有右側匹配的任何行,右側表的列的值將是NULL值。

請參閱LEFT JOIN本文的部分以獲得數據視覺化和對其工作原理的良好解釋。

LEFT JOIN 不會輸出列列表中包含或排除某些內容。它只定義了左表和右表的行是如何相關的,並且必須合併。

在您的特定程式碼中

SELECT * 
FROM Manufacturer 
LEFT JOIN Model ON Model.ManufacturerID = Manufacturer.ID;

LEFT JOIN為表中的每個單獨行定義- 如果表Manufacturer中至少存在一個值等於value 的行,則每個匹配的行都附加到表中的這一行。結果 -表中行的組合行數將等於表中匹配行的數量。如果表中沒有一行與表中的行匹配,則形成最後一行,並且將創建並附加所有列中具有 NULL 值的偽行,而不是表中的真實行。Model``ManufacturerID``Manufacturer.ID``Model``Manufacturer``Manufacturer``Model``Model``Manufacturer``Model

SELECT *``Manufacturer定義表和表中所有列的值Model必須包含在輸出數據中。在這裡定義了從模型表中選擇屬性 ID、速度、RAM、HD 和價格。

引用自:https://dba.stackexchange.com/questions/286710