2010-08-23 126 views
4

在訪談中,我被問到了下面的SQL問題。請解釋它是如何工作的以及它是如何加入的。需要幫助理解SQL中的JOINS

問:有兩個表:表emp包含10行,表部門包含12行。

Select * from emp,department; 

結果是什麼,它是什麼樣的結合?

+6

如果我們通過面試,我們能得到這份工作嗎? – 2010-08-23 13:11:10

+0

這是功課還是面試後? – 2010-08-23 13:12:14

+0

我希望我有更多像這樣的面試問題! – 2010-08-23 13:13:49

回答

0

您指定的加入是cross join。它將爲正在連接的表中的每個記錄組合生成一行。

我會讓你從那裏做數學。

0

這將做一個交叉連接我相信,返回120行。一行用於每個表格中各行的成對組合。

大多數情況下,一切都是無用的。

0

您將從兩個表中獲取所有行,並將每行連接在一起。

這被稱爲笛卡爾連接,非常糟糕。

您將總共獲得120行。

0

這也是舊的隱含語法(18歲過時),意外交叉連接是這種語法的常見問題。一個人不應該使用它。顯式連接是更好的選擇。我也會在採訪中提到這一點,並解釋了原因。如果他們真的使用這樣糟糕的語法,我也不會採取這項工作,因爲它非常有用,這表明數據庫很可能設計得不好。

3

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

我相信,下一個問題是: 大段引用

如何顯示爲每個員工正確的部門?

也就是說,展現empdepartment在僱員所屬的部門只有組合。

這可以這樣做:

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行,具體取決於匹配部門標識的數量。