返回

数据珍藏家:左外连接的秘密——让右表缺失数据的左表列现身

后端

左外连接:深入解析右表缺失数据查询的秘密

什么是左外连接?

左外连接是一种神奇的数据库连接方式,它允许你从右表中查询到左表中缺失的数据。不同于内连接会过滤掉右表中没有匹配数据的左表行,左外连接会保留这些行,并用 NULL 值填充右表中的缺失数据。

左外连接的语法

使用左外连接的语法很简单,就像这样:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

其中,table1table2 是要连接的两个表,column_name 是连接的列,= 是连接条件。

左外连接的示例

为了更好地理解左外连接,我们举个例子。假设我们有两个表,letter_databranch,如下所示:

letter_data
+----+------------+----------+
| id | branch_id | letter_id |
+----+------------+----------+
| 1  | 1          | 100      |
| 2  | 2          | 200      |
| 3  | 3          | 300      |
| 4  | 4          | 400      |
| 5  | NULL       | 500      |

branch
+----+---------+
| id | name    |
+----+---------+
| 1  | Branch A |
| 2  | Branch B |
| 3  | Branch C |

现在,我们想要查询 letter_data 中每个分支机构收到的信件数量,并通过 branch 表连接查询分支机构的名称。我们可以使用左外连接来完成这个查询,如下所示:

SELECT ld.branch_id, b.name, COUNT(ld.letter_id) AS letter_count
FROM letter_data ld
LEFT JOIN branch b
ON ld.branch_id = b.id
GROUP BY ld.branch_id, b.name;

查询结果如下:

+------------+---------+-------------+
| branch_id | name    | letter_count |
+------------+---------+-------------+
| 1          | Branch A | 1            |
| 2          | Branch B | 1            |
| 3          | Branch C | 1            |
| NULL       | NULL    | 1            |
+------------+---------+-------------+

可以看到,即使 letter_data 表中 branch_id 为 NULL 的行没有与 branch 表中的任何行匹配,它仍然显示在结果集中,并用 NULL 值填充 name 列。

左外连接的应用场景

左外连接在实际应用中十分常见,这里列出一些常见的场景:

  • 查找右表中缺失数据的左表记录
  • 汇总左表和右表中的数据
  • 在左表和右表之间建立一对多的关系
  • 查询左表和右表中的交集或差集

常见问题解答

  1. 左外连接和内连接有什么区别?
    内连接只返回两个表中都有匹配数据的行,而左外连接返回左表中的所有行,即使右表中没有匹配数据。

  2. 左外连接可以返回哪些值?
    左外连接可以返回左表和右表中的值,如果右表中没有匹配数据,则返回 NULL 值。

  3. 什么时候应该使用左外连接?
    当你想查询左表中的所有记录,即使右表中没有匹配数据时,可以使用左外连接。

  4. 左外连接的语法是什么?
    左外连接的语法是:

    SELECT column_name(s)
    FROM table1
    LEFT JOIN table2
    ON table1.column_name = table2.column_name;
    
  5. 左外连接有什么优势?
    左外连接的一个主要优势是可以查询右表中缺失数据的左表记录。