在 SQL 中,JOIN 操作允许你将多个表中的数据结合在一起。不同类型的 JOIN 执行不同的匹配策略,返回不同的结果。以下是对 INNER JOIN 和其他常见 JOIN 类型的详细比较和区别:
1. INNER JOIN(内连接)
INNER JOIN 是最常见的连接类型。它只返回两个表中匹配的记录。如果两个表中某个表的记录没有对应的匹配记录,则这行数据将不被包含在查询结果中。
语法:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
示例:
假设有两个表:
- Customers(客户表)
| CustomerID | Name |
|————|——-|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie | - Orders(订单表)
| OrderID | CustomerID | Product |
|———|————|———-|
| 101 | 1 | Laptop |
| 102 | 2 | Phone |
| 103 | 4 | Tablet |
查询所有有订单的客户:
SELECT Customers.Name, Orders.Product
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
输出:
| Name | Product |
|---|---|
| Alice | Laptop |
| Bob | Phone |
解释:
INNER JOIN只返回 Customers 和 Orders 表中CustomerID匹配的记录。因此,Charlie因为没有订单而不会出现在结果中。- 如果一个
CustomerID在 Orders 表中找不到匹配,或者在 Customers 表中没有对应的记录,这些行会被丢弃。
2. LEFT JOIN(左连接)
LEFT JOIN(或 LEFT OUTER JOIN)返回左表(第一个表)中的所有记录,并且返回右表(第二个表)中匹配的记录。如果右表中没有匹配的记录,结果中对应的字段会包含 NULL。
语法:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例:
查询所有客户及其订单:
SELECT Customers.Name, Orders.Product
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
输出:
| Name | Product |
|---|---|
| Alice | Laptop |
| Bob | Phone |
| Charlie | NULL |
解释:
LEFT JOIN会返回 Customers 表中的所有记录,Charlie也会出现在查询结果中,虽然 Orders 表中没有相关记录。因此,Product列显示为NULL。
3. RIGHT JOIN(右连接)
RIGHT JOIN(或 RIGHT OUTER JOIN)与 LEFT JOIN 相反,它返回右表(第二个表)中的所有记录,并且返回左表(第一个表)中匹配的记录。如果左表中没有匹配的记录,结果中对应的字段会包含 NULL。
语法:
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
示例:
查询所有订单及其客户:
SELECT Customers.Name, Orders.Product
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
输出:
| Name | Product |
|---|---|
| Alice | Laptop |
| Bob | Phone |
| NULL | Tablet |
解释:
RIGHT JOIN会返回 Orders 表中的所有记录。如果左表(Customers 表)没有匹配的记录,结果中会显示为NULL。比如Tablet订单没有客户,Name列显示为NULL。
4. FULL JOIN(全连接)
FULL JOIN(或 FULL OUTER JOIN)返回两个表中的所有记录。对于没有匹配项的行,返回的结果中会包含 NULL。
语法:
SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
示例:
查询所有客户和订单:
SELECT Customers.Name, Orders.Product
FROM Customers
FULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
输出:
| Name | Product |
|---|---|
| Alice | Laptop |
| Bob | Phone |
| Charlie | NULL |
| NULL | Tablet |
解释:
FULL JOIN会返回 Customers 和 Orders 表中的所有记录,即使它们没有匹配项。对于没有匹配项的行,结果会显示NULL,例如Charlie没有订单,Product显示为NULL,Tablet没有客户,Name显示为NULL。
5. CROSS JOIN(交叉连接)
CROSS JOIN 返回两个表的 笛卡尔积,即返回每个表中每一行的所有组合。
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
示例:
假设有两个表:
- Colors(颜色表)
| Color |
|——–|
| Red |
| Green | - Shapes(形状表)
| Shape |
|——–|
| Circle |
| Square |
使用 CROSS JOIN 查询颜色和形状的所有组合:
SELECT Colors.Color, Shapes.Shape
FROM Colors
CROSS JOIN Shapes;
输出:
| Color | Shape |
|---|---|
| Red | Circle |
| Red | Square |
| Green | Circle |
| Green | Square |
解释:
CROSS JOIN返回 Colors 和 Shapes 表中每个元素的组合。总共会生成2 × 2 = 4条记录。
6. SELF JOIN(自连接)
SELF JOIN 是将表与其自身连接,用于查找表中与其他记录相关联的行。自连接通常用于查找层级关系或父子关系。
语法:
SELECT a.column, b.column
FROM table a, table b
WHERE a.column = b.column;
示例:
假设有一个 Employees(员工表):
| EmpID | EmpName | ManagerID |
|---|---|---|
| 1 | Alice | NULL |
| 2 | Bob | 1 |
| 3 | Charlie | 1 |
| 4 | David | 2 |
使用 SELF JOIN 查询每个员工及其经理:
SELECT e.EmpName AS Employee, m.EmpName AS Manager
FROM Employees e
LEFT JOIN Employees m ON e.ManagerID = m.EmpID;
输出:
| Employee | Manager |
|---|---|
| Alice | NULL |
| Bob | Alice |
| Charlie | Alice |
| David | Bob |
解释:
SELF JOIN使得一个表与自身连接,e表示员工,m表示经理。通过e.ManagerID = m.EmpID连接员工和经理。
总结:
- INNER JOIN:返回两个表中匹配的记录。
- LEFT JOIN:返回左表的所有记录和右表的匹配记录,右表没有匹配时返回
NULL。 - RIGHT JOIN:返回右表的所有记录和左表的匹配记录,左表没有匹配时返回
NULL。 - FULL JOIN:返回两个表的所有记录,匹配的记录返回,未匹配的记录显示
NULL。 - CROSS JOIN:返回两个表的所有可能组合(笛卡尔积)。
- SELF JOIN:表与自身连接,用于查找层级关系。
掌握这些不同类型的 JOIN,能够帮助你在 SQL 查询中灵活地处理多表数据。
发表回复