我在接受采访时被问到以下SQL问题。请解释一下它是如何工作的以及它的加入方式。
问:有两个表:table emp包含10行,table department包含12行。
Select * from emp,department;
结果是什么,加入的是什么?
答案 0 :(得分:3)
它将返回两个表的笛卡尔积,这意味着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行,具体取决于匹配的部门ID的数量。
答案 1 :(得分:0)
您指定的加入是cross join。它将为要连接的表中的每个记录组合生成一行。
我会让你从那里做数学。
答案 2 :(得分:0)
这将做一个交叉连接我相信,返回120行。两个表中每个表的每对成对组合的一行。
总而言之,大部分时间都是无用的加入。答案 3 :(得分:0)
您将从两个表中获取所有行,每行连接在一起。
这被称为笛卡尔联合,非常糟糕。
您将获得总共120行。
答案 4 :(得分:0)
这也是旧的隐含语法(18年过期),偶然的交叉连接是这种语法的常见问题。一个人永远不应该使用它。 Explict连接是更好的选择。我也会在一次采访中提到这一点并解释原因。如果他们真的使用这样糟糕的语法,我也不会接受这个工作,因为它非常有用,这表明数据库很可能设计得很差。