SQL中的连接(Join)是查询多个表之间数据的常用操作。通过使用连接,可以将两个或多个表中的相关数据行结合起来进行查询。SQL提供了几种类型的连接,包括 INNER JOINLEFT JOINRIGHT JOINFULL 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;

输出:

NameProduct
AliceLaptop
BobPhone

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;

输出:

NameProduct
AliceLaptop
BobPhone
CharlieNULL

在 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;

输出:

NameProduct
AliceLaptop
BobPhone
NULLTablet

在 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;

输出:

NameProduct
AliceLaptop
BobPhone
CharlieNULL
NULLTablet

在 FULL JOIN 中,所有来自 Customers 和 Orders 表的记录都会显示出来,即使某些记录没有匹配项。Charlie没有订单,Product 列为 NULLTablet 订单没有客户,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;

输出:

ColorShape
RedCircle
RedSquare
GreenCircle
GreenSquare

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;

输出:

EmployeeManager
AliceNULL
BobAlice
CharlieAlice
DavidBob

在这个例子中,SELF JOIN 用来查找每个员工及其经理。通过连接 Employees 表的两个不同实例(e 和 m),实现了自连接。


总结:

  • INNER JOIN:返回两个表中匹配的记录。
  • LEFT JOIN:返回左表的所有记录和右表的匹配记录。
  • RIGHT JOIN:返回右表的所有记录和左表的匹配记录。
  • FULL JOIN:返回两个表中的所有记录。
  • CROSS JOIN:返回两个表的笛卡尔积,所有组合。
  • SELF JOIN:将表与自身连接,通常用于查找层级数据。

掌握这些基本的连接类型,能够帮助你更灵活地查询多个表的数据,是 SQL 查询中非常重要的技能!