[英]Need help in understanding JOINS in SQL
我在接受采訪時被問到以下SQL問題。 請解釋它是如何工作的以及它的加入方式。
問:有兩個表:table emp包含10行,table department包含12行。
Select * from emp,department;
結果是什么,加入的是什么?
它將返回兩個表的笛卡爾積,這意味着emp
和department
每個組合都將包含在結果中。
我相信下一個問題是:Blockquote
您如何為每位員工展示正確的部門?
也就是說,僅顯示員工屬於department
的emp
和department
的組合。
這可以通過以下方式完成:
SELECT * FROM emp LEFT JOIN department ON emp.department_id=department.id;
假設emp
有一個名為department_id
的字段,而department
有一個匹配的id
字段(這在這些類型的問題中非常標准)。
LEFT JOIN
意味着將包括左側( emp
)的所有項目,並且每個員工將與相應的部門匹配。 如果未找到匹配的部門,則departments
生成的字段將保持為空。 需要注意的是整整 10行的將被退回。
要僅顯示具有有效部門ID的員工,請使用JOIN
而不是LEFT JOIN
。 此查詢將返回0到10行,具體取決於匹配的部門ID的數量。
您指定的聯接是交叉聯接 。 它將為要連接的表中的每個記錄組合生成一行。
我會讓你從那里做數學。
這將做一個交叉連接我相信,返回120行。 每個成對組合兩個表中每個表的行的一行。
總而言之,大部分時間都是無用的。
您將從兩個表中獲取所有行,每行連接在一起。
這被稱為笛卡爾聯合,非常糟糕。
您將獲得總共120行。
這也是舊的隱含語法(18年過期)和偶然的交叉連接是這種語法的常見問題。 一個人永遠不應該使用它。 Explict連接是更好的選擇。 我也會在一次采訪中提到這一點並解釋原因。 如果他們真的使用這樣糟糕的語法,我也不會接受這個工作,因為它非常有用,這表明數據庫很可能設計得很差。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.