SQL联结表
在关系型数据库中,数据通常分散在多个表中。为了从这些表中提取有意义的信息,我们需要使用SQL的联结(JOIN)功能。联结允许我们将多个表中的数据组合在一起,基于某些条件进行匹配。本文将详细介绍SQL中的联结类型及其使用方法。
什么是SQL联结?
SQL联结是一种将两个或多个表中的行基于相关列进行组合的操作。通过联结,我们可以从多个表中提取数据,并将它们合并成一个结果集。联结的核心是条件匹配,即基于某些列的值是否相等来决定是否将行组合在一起。
联结的类型
SQL支持多种类型的联结,主要包括:
- 内联结(INNER JOIN)
- 左联结(LEFT JOIN)
- 右联结(RIGHT JOIN)
- 全联结(FULL JOIN)
接下来,我们将逐一介绍这些联结类型。
内联结(INNER JOIN)
内联结是最常用的联结类型。它返回两个表中匹配的行。如果某一行在其中一 个表中没有匹配的行,则该行不会出现在结果集中。
语法
SELECT 列名
FROM 表1
INNER JOIN 表2
ON 表1.列名 = 表2.列名;
示例
假设我们有两个表:Customers
和 Orders
。
-- Customers 表
+----+----------+
| id | name |
+----+----------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+----------+
-- Orders 表
+----+------------+-------+
| id | order_date | amount|
+----+------------+-------+
| 1 | 2023-01-01 | 100 |
| 2 | 2023-01-02 | 200 |
| 3 | 2023-01-03 | 300 |
+----+------------+-------+
我们想要获取每个客户的订单信息:
SELECT Customers.name, Orders.order_date, Orders.amount
FROM Customers
INNER JOIN Orders
ON Customers.id = Orders.id;
输出
+-------+------------+--------+
| name | order_date | amount |
+-------+------------+--------+
| Alice | 2023-01-01 | 100 |
| Bob | 2023-01-02 | 200 |
| Charlie| 2023-01-03 | 300 |
+-------+------------+--------+
备注
内联结只返回两个表中都有匹配的行。如果某个客户没有订单,或者某个订单没有对应的客户,这些行将不会出现在结果集中。
左联结(LEFT JOIN)
左联结返回左表中的所有行,即使右表中没有匹配的行。如果右表中没有匹配的行,则结果集中右表的列将包含 NULL
。
语法
SELECT 列名
FROM 表1
LEFT JOIN 表2
ON 表1.列名 = 表2.列名;
示例
继续使用 Customers
和 Orders
表,假设我们想要获取所有客户的订单信息,即使他们没有订单:
SELECT Customers.name, Orders.order_date, Orders.amount
FROM Customers
LEFT JOIN Orders
ON Customers.id = Orders.id;
输出
+-------+------------+--------+
| name | order_date | amount |
+-------+------------+--------+
| Alice | 2023-01-01 | 100 |
| Bob | 2023-01-02 | 200 |
| Charlie| 2023-01-03 | 300 |
| Dave | NULL | NULL |
+-------+------------+--------+
提示
左联结非常适合用于查找“所有客户及其订单,即使他们没有订单”这样的场景。
右联结(RIGHT JOIN)
右联结与左联结相反,它返回右表中的所有行,即使左表中没有匹配的行 。如果左表中没有匹配的行,则结果集中左表的列将包含 NULL
。
语法
SELECT 列名
FROM 表1
RIGHT JOIN 表2
ON 表1.列名 = 表2.列名;