您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

bubuko 2022/1/25 20:06:33 mysql 字数 7022 阅读 847 来源 http://www.bubuko.com/infolist-5-1.html

自连接的应用和生命力是蛮广泛和深刻的,也是我考试时候的十分要注意的地方! 关系代数,和SQL中都有着自连接的身影。 1.先来一个前导引入哈哈: 查询:查询选修1号同学选修的课程的学生学号。 分析:这个查询语句的含义是:选修1号同学他所选修的课程的一门,两门,多门甚至所有全部都是可以的,这里是只要有就 ...

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

关系代数,和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


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶