Database-Design
左連接子句
我認為我最好只問為什麼我們將
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 和價格。