零基础自学SQL课程 | 相关子查询

大家好,我是宁一。

今天是我们的第19课:相关子查询。

上节课我们讲的子查询,都是先一次性得出子查询的结果,再返回给主查询使用。这种子查询与主查询之间是没有关联,互不影响的。

但在相关子查询中,子查询是在主查询每一条记录层面上依次进行的,子查询依赖主查询。

相关子查询比非关联查询执行起来慢一些。但是有很多实际的应用。

实例:选出Scores成绩表中,学生编号在1~6之间的记录,找出那些超过相同科目平均成绩的学生成绩。

实例解析:要注意的是,这里我们需要知道是当前科目的平均成绩。所以使用子查询计算当前科目平均成绩的时候,要知道此时主查询的课程编号Cid是什么。


我们给主查询Scores表设置别名s,这样在子查询当前科目平均成绩的时候,加上WHERE Cid = s.Cid ,就能获得当前课程的平均成绩。

SELECT *
FROM Scores s  -- 将主查询的字段加上别名
WHERE score > (
    SELECT AVG(score)
    FROM Scores
    WHERE Cid = s.Cid  -- 获取当前主查询的的课程编号Cid
)
AND Sid BETWEEN 1 AND 6;

作业:通过SId连接Scores表和Students表,Cid连接Scores表和Courses表,选出学生编号在1~6之间,那些成绩超过相同科目平均成绩的学生。

最终得到Students表的Sname列,Courses表的Cname列以及Scores表中的score列。

示例结果:

作业解析:其实就是在我们课程实例中,加上两个JOIN连接,需要注意的是,加上JOIN连接后,使用字段时要加上表的别名。比如Sid BETWEEN 1 AND 6中的Sid,要写成s.Sid。

SELECT st.Sname,c.Cname,s.score
FROM Scores s 
JOIN Students st
ON s.Sid = st.Sid
JOIN Courses c
ON s.Cid = c.Cid
WHERE score > (
    SELECT AVG(score)
    FROM Scores
    WHERE Cid = s.Cid 
)
AND s.Sid BETWEEN 1 AND 6;

下节课讲讲SQL数值函数和字符函数。

点击关注,更新课程第一时间通知哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵宁一

点赞是最好的赞赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值