首页 > 数据库技术 > 详细

mysql学习笔记:自连接的3道例题和总结

时间:2020-03-11 12:33:55      阅读:108      评论:0      收藏:0      [点我收藏+]

自连接的应用和生命力是蛮广泛和深刻的,也是我考试时候的十分要注意的地方!

关系代数,和SQL中都有着自连接的身影。

1.先来一个前导引入哈哈:

查询:查询选修1号同学选修的课程的学生学号

分析:这个查询语句的含义是:选修1号同学他所选修的课程的一门,两门,多门甚至所有全部都是可以的,这里是只要有就行了

这里这个语句的选修的词后面有隐含的从1门到所有的意思.  (between 1 and all)

先用关系代数语言来解决:

技术分享图片

 

 

有不完善的地方希望大佬门或未来的我自己再来指正修改哒2333

 

 

 

SQL语言实现:

 

 

 

 

select * from sc;

 

  技术分享图片

 

第一种方案就是我们讲的自连接啦:

select  distinct sc1.sno/*去重*/
from sc as sc1,sc as sc2
where sc2.sno=‘1‘ 
and sc1.cno=sc2.cno;/*可能会出现重复,没有去重,so*/

  

 效果如下:

技术分享图片

 

 

 

 

当然,也可以进一步规范化2333

 

技术分享图片

 

 

 

 

第二种方法就是我不前还不多熟练地嵌套查询:

 

 

/*选修1号学生选的课程的学生的学号,没加所有哦所以不是除法*/
select distinct sno
from sc 
where cno in
(select cno
from sc
where sno=‘1‘
);/*嵌套不熟练*/

 

  技术分享图片

 

 

2.查询:查询同时选修1号和2号课程的学生学号

方法:自连接,除法,交运算。

自连接方法:

select sc1.sno
from sc as sc1,sc as sc2
where sc1.sno=sc2.sno 
and sc1.cno=1 and sc2.cno=2;

  技术分享图片

 

或者:

技术分享图片嘿嘿

 

 

 

 

3.

技术分享图片

 

 

 

 

自连接方法解决之:

 

 

/*间接先修课程号*/
select c1.cno,c2.cpre as cppre
from c as c1,c as c2
where c1.cpre=c2.cno;

 

  技术分享图片

拓展:

 

select c1.cno,c2.cpre as cppre,c3.cname
from c as c1,c as c2,c as c3
where c1.cpre=c2.cno and c2.cpre=c3.cno;/*间接先修课课程名*/

 

 

技术分享图片

 

补充一下哈:cpre or cpno是课程表c的外码,Cno是C的主码

设置cpre成为c的外码的语句格式如下:

alter table c
add constraint FK_c 
foreign key(cpre)
references c(cno);/*将课程表c的cpre字段设置为c的外码,参照关系也是c*/

技术分享图片

 

 

 

4.小结:写到这一地步,今天上课的3道自连接题目有了一定程度上的总结!勤奋奋斗,冲鸭,龙龙!多多实践之,冲冲冲!

技术分享图片

 

 

技术分享图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mysql学习笔记:自连接的3道例题和总结

原文:https://www.cnblogs.com/dragondragon/p/12461077.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!