查询成绩比该课程平均成绩低的同学的成绩表

select*fromscoreawheredegree<(selectavg(degree)fromscorebwherea.cno=b.cno)为什么可以这么写能解释... select * from score a where degree<(select avg(degree)
from score b where a.cno=b.cno)
为什么可以这么写能解释一下吗??
展开
 我来答
tjrmgs
2015-07-24 · TA获得超过5764个赞
知道大有可为答主
回答量:2161
采纳率:94%
帮助的人:993万
展开全部
这是一种特殊形式的父子表连接(自连接)SQL选择查询写法。对于这种特殊的写法,数据库引擎会以特殊的方式检索父查询表里的数据。如果搞不清楚这种特殊的检索方式,我们很难从该SQL语句的表面逻辑理出个中道理。

现在我们来分拆该SQL语句里的父查询和子查询
1)语句中的父查询
select * from score a where degree<”子查询获得的一个数据值“

2)语句中的子查询
select avg(degree) from score b where a.cno=b.cno
请注意这个子查询的from子句里只有一张表 b ,但是where子句里却出现了第二张表 a ,
如果单独运行这个子查询,因为子查询没有列出表a,系统会要求输入a.cno或者直接报错,反正无法顺利执行,但是表a可以在父查询里的from子句中找到,面对这种情况数据库引擎会采取逐条取主查询记录与子查询实施比对以确定是否检出该条记录,最后汇总各次检索的结果输出整个记录集。

这个特殊的SQL语句检索过程大致如下:
取出首条记录的a.cno用作过滤,子查询里以avg函数得到该课程的平均分,主查询以分数比对平均分,满足条件保留否则抛弃(degree小于平均分的留下);
跟着判断父查询表下一条记录,处理过程相同,最后合并各次判断结果从而的到最终结果。

这种特殊的写法可以规避输出包含非分组字段,而分组不得输出非分组字段的矛盾。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式