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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值