在訪談中,我被問到了下面的SQL問題。請解釋它是如何工作的以及它是如何加入的。需要幫助理解SQL中的JOINS
問:有兩個表:表emp包含10行,表部門包含12行。
Select * from emp,department;
結果是什麼,它是什麼樣的結合?
在訪談中,我被問到了下面的SQL問題。請解釋它是如何工作的以及它是如何加入的。需要幫助理解SQL中的JOINS
問:有兩個表:表emp包含10行,表部門包含12行。
Select * from emp,department;
結果是什麼,它是什麼樣的結合?
您指定的加入是cross join。它將爲正在連接的表中的每個記錄組合生成一行。
我會讓你從那裏做數學。
這將做一個交叉連接我相信,返回120行。一行用於每個表格中各行的成對組合。
大多數情況下,一切都是無用的。
您將從兩個表中獲取所有行,並將每行連接在一起。
這被稱爲笛卡爾連接,非常糟糕。
您將總共獲得120行。
這也是舊的隱含語法(18歲過時),意外交叉連接是這種語法的常見問題。一個人不應該使用它。顯式連接是更好的選擇。我也會在採訪中提到這一點,並解釋了原因。如果他們真的使用這樣糟糕的語法,我也不會採取這項工作,因爲它非常有用,這表明數據庫很可能設計得不好。
它將返回兩個表的笛卡爾乘積,這意味着每個組合emp
和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行,具體取決於匹配部門標識的數量。
如果我們通過面試,我們能得到這份工作嗎? – 2010-08-23 13:11:10
這是功課還是面試後? – 2010-08-23 13:12:14
我希望我有更多像這樣的面試問題! – 2010-08-23 13:13:49