5.4 自连接
在本教程中,您将了解如何使用连接语句将表连接到表自身,即,在同一张表上自己连接自己。
在之前的教程中,已经学习了如何使用INNER JOIN,LEFT JOIN 或 CROSS JOIN子句将表连接到其他表。 但是,有一个特殊情况,需要将表自身连接,这被称为自连接。
当您想将表中行与同一表中的其他行组合时,可以使用自连接。要执行自联接操作必须使用表别名来帮助MySQL在单个查询中区分左表与同一张表的右表。
MySQL自连接的例子
我们来看看示例数据库(yiibaidb)中的employees表,其表结构如下所示 -
要获得整个组织结构,可以使用employeeNumber和reportsTo列将employees表连接自身。employees表有两个角色:一个是经理,另一个是直接报告者(即,下属员工)。
SELECT
CONCAT(m.lastname, ', ', m.firstname) AS 'Manager',
CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report'
FROM
employees e
INNER JOIN
employees m ON m.employeeNumber = e.reportsto
ORDER BY manager;执行上面查询,得到以下结果 -
+--------------------+--------------------+
| Manager | Direct report |
+--------------------+--------------------+
| Bondur, Gerard | Jones, Barry |
| Bondur, Gerard | Castillo, Pamela |
| Bondur, Gerard | Bondur, Loui |
| Bondur, Gerard | Bott, Larry |
| Bondur, Gerard | Gerard, Martin |
| Bondur, Gerard | Hernandez, Gerard |
| Bow, Anthony | Vanauf, George |
| Bow, Anthony | Patterson, Steve |
| Bow, Anthony | Thompson, Leslie |
| Bow, Anthony | Tseng, Foon Yue |
| Bow, Anthony | Firrelli, Julie |
| Bow, Anthony | Jennings, Leslie |
| Murphy, Diane | Firrelli, Jeff |
| Murphy, Diane | Patterson, Mary |
| Nishi, Mami | Kato, Yoshimi |
| Patterson, Mary | Bow, Anthony |
| Patterson, Mary | Patterson, William |
| Patterson, Mary | Bondur, Gerard |
| Patterson, Mary | Nishi, Mami |
| Patterson, William | Marsh, Peter |
| Patterson, William | King, Tom |
| Patterson, William | Fixter, Andy |
+--------------------+--------------------+
22 rows in set在上述输出中,只能看到有经理的员工。 但是,由于INNER JOIN子句,所以看不到总经理。总经理是没有任何经理的员工,或者他的经理人是NULL。
我们将上述查询中的INNER JOIN子句更改为LEFT JOIN子句,以包括总经理。 如果管理员名称为NULL,则还需要使用IFNULL函数来显示总经理。
执行上面查询,得到以下结果 -
通过使用MySQL自连接,可以通过将customers表连接自身来显示位于同一个城市的客户列表。参考以下查询语句 -
执行上面查询语句,得到以下结果 -
我们通过以下连接条件连接了customers表:
指定
c1.city = c2.city以确保两个表的客户都是来自相同的城市。c.customerName> c2.customerName以确保不要得到相同的客户。
在本教程中,我们向您介绍了MySQL自连接,可以通过使用INNER JOIN或LEFT JOIN子句将一个表连接到自身。
Last updated
Was this helpful?