SQL中的连接(Join)是查询多个表之间数据的常用操作。通过使用连接,可以将两个或多个表中的相关数据行结合起来进行查询。SQL提供了几种类型的连接,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 等。每种连接类型有不同的行为和用途。
下面是对 SQL 中各种连接类型的详细解释,帮助你熟练掌握:
1. INNER JOIN(内连接)
内连接返回两个表中匹配的记录,且只返回那些在两个表中都有对应记录的行。
语法:
SELECT column_names
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 |
使用 INNER JOIN
查询有订单的客户:
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
表中都有的匹配记录。
2. LEFT JOIN(左连接)
左连接(或称左外连接)返回左表(第一个表)中的所有记录,以及右表(第二个表)中匹配的记录。如果右表中没有匹配的记录,结果中相应的字段会包含 NULL
。
语法:
SELECT column_names
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例:
使用 LEFT JOIN
查询所有客户及其订单:
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
表的记录都会显示出来,即使 Orders
表中没有匹配项。例如,Charlie
没有订单,Product
列显示为 NULL
。
3. RIGHT JOIN(右连接)
右连接(或称右外连接)返回右表(第二个表)中的所有记录,以及左表(第一个表)中匹配的记录。如果左表中没有匹配的记录,结果中相应的字段会包含 NULL
。
语法:
SELECT column_names
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
示例:
使用 RIGHT JOIN
查询所有订单及其客户:
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
表中没有匹配项。比如,Tablet
订单没有找到客户,因此 Name
列为 NULL
。
4. FULL JOIN(全连接)
全连接(或称全外连接)返回两个表中的所有记录。当某个表中没有匹配项时,结果中相应的字段会显示 NULL
。这意味着即使在两个表中没有匹配项,也会返回记录。
语法:
SELECT column_names
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
示例:
使用 FULL JOIN
查询所有客户和所有订单:
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
表的记录都会显示出来,即使某些记录没有匹配项。Charlie
没有订单,Product
列为 NULL
,Tablet
订单没有客户,Name
列为 NULL
。
5. CROSS JOIN(交叉连接)
交叉连接返回两个表的所有组合(笛卡尔积)。即使两个表没有任何匹配条件,它也会返回每一行的组合。
语法:
SELECT column_names
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
返回每一行的组合,形成了一个包含4行结果的笛卡尔积。
6. 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
用来查找每个员工及其经理。通过连接 Employees
表的两个不同实例(e
和 m
),实现了自连接。
总结:
- INNER JOIN:返回两个表中匹配的记录。
- LEFT JOIN:返回左表的所有记录和右表的匹配记录。
- RIGHT JOIN:返回右表的所有记录和左表的匹配记录。
- FULL JOIN:返回两个表中的所有记录。
- CROSS JOIN:返回两个表的笛卡尔积,所有组合。
- SELF JOIN:将表与自身连接,通常用于查找层级数据。
掌握这些基本的连接类型,能够帮助你更灵活地查询多个表的数据,是 SQL 查询中非常重要的技能!
发表回复