繁体   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