在访谈中,我被问到了下面的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