簡體   English   中英

需要幫助理解SQL中的JOINS

[英]Need help in understanding JOINS in SQL

我在接受采訪時被問到以下SQL問題。 請解釋它是如何工作的以及它的加入方式。

問:有兩個表:table emp包含10行,table department包含12行。

 Select * from emp,department;

結果是什么,加入的是什么?

它將返回兩個表的笛卡爾積,這意味着empdepartment每個組合都將包含在結果中。

我相信下一個問題是:Blockquote

您如何為每位員工展示正確的部門?

也就是說,僅顯示員工屬於departmentempdepartment的組合。

這可以通過以下方式完成:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM