本教程将向您展示如何使用SQL自连接技术将表连接到自身。
1. SQL自连接简介
有时,将表连接到自身是很有用的。 这种类型的连接称为自连接。
我们将一张表连接到自身来评估同一个表中其他行的行。 要执行自联接,我们使用或子句。
因为同一张表在单个查询中出现两次,所以必须使用表别名。 以下语句说明了如何将表连接到自身。
SELECT column1, column2, column3, ... FROM table1 A INNER JOIN table1 B ON B.column1 = A.column2;
在此语句中,使用INNER JOIN
子句将table1
连接到自身。 A
和B
是table1
的表别名。 B.column1 = A.column2
是连接条件。
除了INNER JOIN
子句,还可以使用LEFT JOIN
子句。
下面举几个使用自连接技术的例子。
2. SQL自联接示例
请参阅以下employees
表的结构。
mysql> DESC employees; +---------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+----------------+ | employee_id | int(11) | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | YES | | NULL | | | last_name | varchar(25) | NO | | NULL | | | email | varchar(100) | NO | | NULL | | | phone_number | varchar(20) | YES | | NULL | | | hire_date | date | NO | | NULL | | | job_id | int(11) | NO | MUL | NULL | | | salary | decimal(8,2) | NO | | NULL | | | manager_id | int(11) | YES | MUL | NULL | | | department_id | int(11) | YES | MUL | NULL | | +---------------+--------------+------+-----+---------+----------------+ 10 rows in set
在employees
表中,manager_id
列指定员工的经理。 以下语句将employees
表连接到自身,以查询每位员工的上级经理信息。
SELECT CONCAT(e.first_name, ' ', e.last_name) as employee, CONCAT(m.first_name, ' ', m.last_name) as manager FROM employees e INNER JOIN employees m ON m.employee_id = e.manager_id ORDER BY manager;
执行上面查询语句,得到以下结果 –
+----------------+---------------+ | employee | manager | +----------------+---------------+ | Bruce Wong | Alexander Lee | | David Liang | Alexander Lee | | Valli Chen | Alexander Lee | | Diana Chen | Alexander Lee | | Karen Zhang | Avg Su | | Alexander Su | Avg Su | | Shelli Zhang | Avg Su | | Sigal Zhang | Avg Su | | Guy Zhang | Avg Su | | Alexander Lee | Lex Liang | | Irene Liu | Matthew Han | ... ... | Avg Su | Steven Lee | | John Liu | Steven Lee | | Karen Liu | Steven Lee | | Jonathon Yang | Steven Lee | | Jack Yang | Steven Lee | +----------------+---------------+ 39 rows in set
由于内部联接子句仅包括在另一个表中具有匹配行的行,因此主席未显示在上述查询的结果集中。主席(president
)没有任何经理。 在employees
表中,包含主席的行的manager_id
为NULL
。要在结果集中包含主席,使用LEFT JOIN
子句而不是INNER JOIN
子句作为以下查询。
SELECT CONCAT(e.first_name, ' ', e.last_name) as employee, CONCAT(m.first_name, ' ', m.last_name) as manager FROM employees e LEFT JOIN employees m ON m.employee_id = e.manager_id ORDER BY manager;
执行上面查询语句,得到以下结果 –
+----------------+---------------+ | employee | manager | +----------------+---------------+ | Steven Lee | NULL | | Diana Chen | Alexander Lee | | Bruce Wong | Alexander Lee | | David Liang | Alexander Lee | | Valli Chen | Alexander Lee | | Guy Zhang | Avg Su | ... ... | John Liu | Steven Lee | | Karen Liu | Steven Lee | | Jonathon Yang | Steven Lee | +----------------+---------------+ 40 rows in set
在本教程中,演示了如何使用INNER JOIN
或LEFT JOIN
子句将表连接到自身。