在 SQL 中,自 连接 (JOIN) 操作允许我们将表与其自身连接,从而在同一表内的行之间创建关系。
示例
SELECT
A.first_name AS FirstPerson,
B.first_name AS SecondPerson
FROM Customers A, Customers B
WHERE A.last_name = B.last_name AND A.first_name != B.first_name;
在这里,SQL 命令将 Customers 表与自身连接,并找出具有相同姓氏但名字不同的客户对。
自连接(Self JOIN)语法
自 JOIN
操作的基本语法如下:
SELECT columns
FROM table1 T1,
JOIN table1 T2 ON
WHERE condition;
这里,
columns
- 指定我们要检索的列table1 T1
和table1 T2
- 同一个表table1
的两个实例T1
和T2
JOIN
- 连接两个表,通常后跟一个ON
命令,该命令指定用于链接两个表的公共列。condition
- 指定如何连接同一个表的两个实例的条件
示例:SQL 自连接(Self JOIN)
-- retrieve Customers with the Same Country and Different Customer IDs
SELECT
c1.first_name,
c1.country,
c2.first_name
FROM Customers c1
JOIN Customers c2 ON c1.country = c2.country
WHERE c1.customer_id <> c2.customer_id;
在这里,SQL 命令对 Customers 表使用自连接来查找具有相同国家但不同客户 ID 的客户。
WHERE
子句过滤结果并确保来自 Customers 表的两个实例(c1
和 c2
)的客户 ID 不同。
带 AS 别名的 SQL 自连接(Self JOIN)
我们可以将 AS 别名与表名一起使用,使查询简短明了。例如,
-- retrieve Customers with the same Country and Different Customer IDs
-- use AS alias for better code readability
SELECT
c1.first_name,
c1.country,
c2.first_name AS friend_name
FROM Customers c1
JOIN Customers c2 ON c1.country = c2.country
WHERE c1.customer_id <> c2.customer_id;
在这里,SQL 命令使用别名 friend_name
来重命名 Customers 表的第二个实例 c2
中的 first_name
列。
此别名明确表示我们指的是共享同一国家的另一个客户的名字。