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

输出:

NameProduct
AliceLaptop
BobPhone

解释:

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

输出:

NameProduct
AliceLaptop
BobPhone
CharlieNULL

解释:

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

输出:

NameProduct
AliceLaptop
BobPhone
NULLTablet

解释:

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

输出:

NameProduct
AliceLaptop
BobPhone
CharlieNULL
NULLTablet

解释:

  • FULL JOIN 会返回 Customers 和 Orders 表中的所有记录,即使它们没有匹配项。对于没有匹配项的行,结果会显示 NULL,例如 Charlie 没有订单,Product 显示为 NULLTablet 没有客户,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;

输出:

ColorShape
RedCircle
RedSquare
GreenCircle
GreenSquare

解释:

  • 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(员工表):

EmpIDEmpNameManagerID
1AliceNULL
2Bob1
3Charlie1
4David2

使用 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 使得一个表与自身连接,e 表示员工,m 表示经理。通过 e.ManagerID = m.EmpID 连接员工和经理。

总结:

  • INNER JOIN:返回两个表中匹配的记录。
  • LEFT JOIN:返回左表的所有记录和右表的匹配记录,右表没有匹配时返回 NULL
  • RIGHT JOIN:返回右表的所有记录和左表的匹配记录,左表没有匹配时返回 NULL
  • FULL JOIN:返回两个表的所有记录,匹配的记录返回,未匹配的记录显示 NULL
  • CROSS JOIN:返回两个表的所有可能组合(笛卡尔积)。
  • SELF JOIN:表与自身连接,用于查找层级关系。

掌握这些不同类型的 JOIN,能够帮助你在 SQL 查询中灵活地处理多表数据。