返回

SQL联接妙招:左连接、内连接和 ON/WHERE 语句大 PK

后端

左连接和内连接的强强联合:携手探索 SQL 数据世界

引子

在数据分析和管理的广阔领域中,SQL(结构化查询语言)扮演着至关重要的角色。作为一门功能强大的语言,SQL 允许我们从数据库中检索、管理和操纵数据。其中,左连接和内连接是 SQL 联合的两大支柱,它们携手并进,帮助我们探索数据世界的错综复杂。

左连接:包罗万象的东道主

想象一下一场盛大的宴会,左连接就像一位热情好客的东道主,将所有被驱动表(从属表)中的数据悉数迎入。即使这些数据在驱动表(主表)中没有对应的匹配项,它们也受到热情的款待。

左连接使用 "LEFT JOIN" ,并在 "ON" 子句中指定驱动表和被驱动表之间的连接条件。当条件不满足时,被驱动表中的数据仍然保留,只是在与驱动表匹配的列中显示为 NULL。这种包罗万象的特性确保了所有被驱动表中的数据都能被看到。

代码示例:

SELECT *
FROM Employee e
LEFT JOIN Department d
ON e.department_id = d.department_id;

内连接:严谨的守门人

内连接则是一位严谨的守门人,它只允许那些在驱动表和被驱动表中都存在匹配项的数据进入查询结果。如果某条数据在驱动表中没有对应的匹配项,它将被无情地拒之门外。

内连接使用 "INNER JOIN" 关键字,同样在 "ON" 子句中指定连接条件。当条件不满足时,无论是在驱动表还是被驱动表中的数据都会被排除在外。这种严谨性确保了查询结果只包含真正相关的数据。

代码示例:

SELECT *
FROM Employee e
INNER JOIN Department d
ON e.department_id = d.department_id;

ON 和 WHERE 语句的微妙差别

在 SQL 联合中,ON 和 WHERE 语句就像一对孪生兄弟,但它们在过滤数据的方式上却截然不同。

ON 语句:

  • 专属于左连接和内连接。
  • 只过滤被驱动表中的数据。
  • 当 ON 语句中的条件不满足时,被驱动表中的那条数据将被排除在外,但驱动表中的数据仍然保留。

WHERE 语句:

  • 可用于任何类型的联合。
  • 可以过滤驱动表和被驱动表中的数据。
  • 当 WHERE 语句中的条件不满足时,无论是在驱动表还是被驱动表中的数据都会被排除在外。

举个例子:

我们有两张表:员工表(Employee)和部门表(Department)。要查询所有员工的姓名和部门名称,可以使用以下两种方法:

左连接 + ON 语句:

SELECT e.name, d.department_name
FROM Employee e
LEFT JOIN Department d
ON e.department_id = d.department_id;

内连接 + WHERE 语句:

SELECT e.name, d.department_name
FROM Employee e
INNER JOIN Department d
WHERE e.department_id = d.department_id;

第一种方法会查询出所有员工的姓名,即使有些员工没有对应的部门,这些员工在 "department_name" 列中会显示为 NULL。

第二种方法只查询出那些在员工表和部门表中都有对应数据的员工,如果某位员工没有对应的部门,那么他/她将不会出现在查询结果中。

总结:ON 和 WHERE,各有千秋

通过上面的例子,我们可以看到 ON 语句和 WHERE 语句在 SQL 联合中的作用是不同的。ON 语句只负责过滤被驱动表中的数据,而 WHERE 语句则可以过滤驱动表和被驱动表中的数据。

在实际应用中,ON 语句和 WHERE 语句各有千秋。当我们需要查询所有被驱动表中的数据时,可以使用 LEFT JOIN 和 ON 语句。当我们需要查询那些在驱动表和被驱动表中都有对应数据的记录时,可以使用 INNER JOIN 和 WHERE 语句。

常见问题解答

  1. 什么时候使用左连接?

    • 当我们需要查询所有被驱动表中的数据时,即使这些数据在驱动表中没有对应的匹配项。
  2. 什么时候使用内连接?

    • 当我们需要查询那些在驱动表和被驱动表中都有对应数据的记录时。
  3. ON 和 WHERE 语句有什么区别?

    • ON 语句只过滤被驱动表中的数据,而 WHERE 语句可以过滤驱动表和被驱动表中的数据。
  4. 如何使用 ON 语句?

    • 在 LEFT JOIN 或 INNER JOIN 联合中,使用 "ON" 子句指定驱动表和被驱动表之间的连接条件。
  5. 如何使用 WHERE 语句?

    • WHERE 语句可以在任何类型的联合中使用,在 WHERE 子句中指定过滤条件。