这篇文章来源于我的一个疑惑:
我们现在有两个表:
SC
Student
现在我们要执行一个查询:找出张三学生最低分的课程号
本来我是打算这么写的:
SELECT Cno FROM sc,student
WHERE Score <= all(SELECT Score FROM sc,student
WHERE sc.Sno = student.Sno AND Sname = '张三') AND Sname = '张三' ;
结果发现执行结果是这个:
分析了一下,其实我个人的思维是比较适应非相关子查询的,所以写出了上面这种SQL,但是在最后面忘记加上AND sc.Sno = student.Sno,所以导致了错误,看了哈工大战德臣老师的公开课,发现他是这么写的:
SELECT Cno FROM sc,student
WHERE Sname = '张三' AND student.Sno = sc.Sno
AND Score <= all(SELECT Score FROM sc
WHERE Sno = student.Sno);
按照我这个思维哈,括号中的子查询,是从sc中将score提取出来,但我一直不知道这个Sno=student.Sno这个条件的作用,很显然这句话的作用将sc中不是张三的成绩自动排除考虑范围了,但是我不知道咋做到的,所以我特意查了一下相关子查询的执行流程,参考的博客:https://www.jianshu.com/p/91a6f20e3c49
总结这篇博客就是,先从父查询中取出一条记录,子查询中不是用到了student.Sno嘛,这个指的就是刚才从父查询中取出的这条记录的Sno,由于我们还有条件:‘’张三',所以这条记录还得是张三,还有一个条件就是这个课得是张三选的课,进入子查询中,取出的成绩也得是张三的成绩,这样这条记录就算经过重重考验了,我们就可以把这条记录的Cno放心提出来了