mysql的表面sno大全_mysql学习笔记:自连接的3道例题和总结

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

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

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

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

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

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

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

1a9e6d67256977eed804fd255738b73e.png

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

SQL语言实现:

select * from sc;

80838e0b0dc14bd3db5b6d20183a538d.png

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

select distinct sc1.sno/*去重*/

from sc as sc1,sc as sc2

where sc2.sno='1'

and sc1.cno=sc2.cno;/*可能会出现重复,没有去重,so*/

效果如下:

ec01d6c986b71196f42e82ff19c20dd4.png

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

78870e1655a5ff115ed476e8bb4fefa6.png

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

/*选修1号学生选的课程的学生的学号,没加所有哦所以不是除法*/

select distinct sno

from sc

where cno in

(select cno

from sc

where sno='1'

);/*嵌套不熟练*/

fa1441594ea7ca9e0fc9f368f47a6ac8.png

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;

e5e54a54e397ca1f0a5b39ea151bcd1c.png

或者:

431f0bb154f4b757d6ffa88a426b8381.png嘿嘿

交运算实现:

/*查询同时选修1号和2号课程的学生学号。*/

select sno

from sc

where cno='1'

and sno in

(select sno

from sc

where cno='2');

至于除法运算啦,我目前还没有怎么多多地实现之qwq

cf77bb29f90b25a567fc363da3b7c303.png

3.

3c26bee4c389f4102b7db7924885c77c.png

自连接方法解决之:

/*间接先修课程号*/

select c1.cno,c2.cpre as cppre

from c as c1,c as c2

where c1.cpre=c2.cno;

23c5a2ccd06392529bec831382b51501.png

拓展:

selectc1.cno,c2.cpre as cppre,c3.cnamefrom c as c1,c as c2,c asc3where c1.cpre=c2.cno and c2.cpre=c3.cno;/*间接先修课课程名*/

00a4cdfaffda2ad2e5e34b3b089e182a.png

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

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

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

3a325dec3a17de5194f21face0fc7853.png

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

ce468492236047a05d3e489e8baf3c66.png

90206b480d33e2e86febf40ec5cfbdec.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值