在 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 查询中灵活地处理多表数据。
发表回复