自联结顾名思义就是把一张表假设为两张一样的表,然后在做“多表查询”
例如想于下方表中找出与在“爱艺奇”公司的客户同名的顾客。
第一步:找出在“爱艺奇”的客户的姓名,第二步:从全表中去查询姓名与第一步查询出来一样的客户
1. 第一种解决方案:子查询
where cust_name in ,“in”不能写成“=”,不然容易报错。因为子查询有可能返回的是多条记录。这跟子查询只能返回单列无关,单列与单行。
子查询:https://blog.csdn.net/wsdfym/article/details/90722385
select cust_id ,cust_name ,cust_adress
from customers
where cust_name in (select cust_name
from customers
where cust_company='爱艺奇');
2.第二种解决方案:自联结
一张表假设为 两张一样的表,分别对两张表(一样的两张表)进行联结得到笛卡儿积,再对笛卡尔积中的结果根据where进行 行过滤。
SELECT c1.cust_id ,c1.cust_name ,c1.cust_adress
FROM customers as c1 ,customers as c2
where c2.cust_company = '爱艺奇'
and c1.cust_name = c2.cust_name
可以看出与使用子查询的结果是一样的,但是许多dbms处理联结远比处理子查询快的多
可以把以上sql语句理解为:
- 先复制出两张一样的表
- 在对第二张表进行where过滤,得到在爱艺奇的客户名
- 将表一与表二进行联结得到客户姓名一样的客户的信息
- 再将表一中客户的信息展示出来
别名:此查询中两张表其实是一样的表,DBMS并不知道你要引用的是哪张表,所以解决这个问题需要用到别名