MySQL 自联结 自连接

自联结顾名思义就是把一张表假设为两张一样的表,然后在做“多表查询”

例如想于下方表中找出与在“爱艺奇”公司的客户同名的顾客
第一步:找出在“爱艺奇”的客户的姓名,第二步:从全表中去查询姓名与第一步查询出来一样的客户
在这里插入图片描述

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并不知道你要引用的是哪张表,所以解决这个问题需要用到别名

相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页