一、概念
自联结是MySQL中描述表关系的一种方式,它是自己join自己的一种形式,常用于结果(中间数据)与条件在同一表中的情形。
二、实例
【案例1】抽查中发现产品prod_id='DTNTR'的产品质量有问题,于是举一反三查询该供应商vend_id供的其他产品是否合格,请筛选出该供应商提供的所有商品
【分析】解法用的方法是采用p1 join p2,用到的是自联结,p1、p2这两张表都是products的别名
【步骤】
1 select p1.vend_id,p1.prod_id,p1.prod_name 2 from products as p1 3 join products as p2 on p1.vend_id=p2.vend_id 4 where p2.prod_id='DTNTR';
【案例2】查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
【分析】因为要查的结果是SId,SId的需要满足的条件:学的课和01学的完全一致,和条件都在存储课程的表sc中,所以采用自联结。
【步骤1】首先先找必要条件:其它同学和01学的单门课程一致的所有情况
1 --笛卡尔积中筛选出其它同学和01学的单门课程一致的所有情况 2 select s1.*,s2.* 3 from sc as s1 4 join sc as s2 5 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01';
【步骤2】再添加其他同学学的课程数等于01的课程数,作为充要条件
1 select s2.sid,count(s2.cid) 2 from sc as s1 3 join sc as s2 4 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01' 5 group by s2.sid 6 having count(s2.cid) = (select count(*) from sc where sid='01');
【步骤3】再join student表补全其它信息:
1 --join student表 2 select s2.sid,student.Sname,count(s2.cid),count(s1.cid) 3 from sc as s1 4 join sc as s2 5 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01' 6 join student on s2.sid = student.sid 7 group by s2.sid,student.Sname 8 having count(s2.cid) = (select count(*) from sc where sid='01');
三、总结
自联结的适用场合是结果和条件都在同一张表中,我们就可以自联结这张表