赞
踩
select *
from student
where Sdept in(
select Sdept
from student
where Sname='李勇');
也可以用自身连接
select *
from student s1,Student s2
where s1.Sdept=s2.Sdept and s2.Sname='李勇'
select Sno,Sname
from student
where Sno in(
select Sno
from sc
where Cno in(
select Cno
from course
where Cname='数据库'));
这个语句的执行顺序是
本例子也可以有等值连接完成。
select student.Sno,Sname
from course,student,sc
where sc.Sno=Student.Sno and
sc.cno=course.cno and
course.cname='数据库'
select Sno,Cno
from SC x
where Grade>=(
select AVG(Grade)
from SC y
where x.Sno=y.Sno
);
这里就是因为子查询与父查询相关,这是相关子查询。相关子查询类似c语言中的二重循环。
1.将表sc(一个x,一个为y)x中的第一个元组,红色箭头所示,将他的sno传递给内层循环
select AVG(Grade)
from SC
where sno=‘201215121’
2.然后执行内层相当于求该学生的平均成绩。
((92+85+88)/3=88(grade为整数这里取整数))
3.在返回外层x的成绩与内层循环求出来的平均成绩作比较。(即92与88作比较)然后进行下一个元组(黑色箭头)重复执行1.
就是相当于这样的格式两列相比较。
select Sname,Sage
from student
where Sdept!='cs' AND Sage < ANY(
select Sage
from student
where Sdept='CS'
);
就是再找计算机系中的年龄最大值。
select Sname,Sage
from student
where Sdept!='cs' AND Sage < ALL(
select Sage
from student
where Sdept='CS'
);
就是找最小值。
1.只返回true或者false;
2.当内层查询里有数据时,为true,否则为false;
3.一般内层查询的列只用*,因为无论写什么,他只返回一个true 或者 false。给出列名无意义。
4.not exists 相当于exist取反。
select Sname,Sno
from student
where EXISTS(
select *
from SC
where Sno=student.Sno AND Cno='1'
)
select Sname,Sno
from student
where NOT EXISTS(
select *
from SC
where Sno=student.Sno AND Cno='1'
)
用存在量词实现全称量词(sql中没有全称量词)
select Sname
from student
where NOT EXISTS (
select *
from course
where NOT EXISTS(
select *
from sc
where sc.Cno=course.cno AND student.Sno=sc.Sno))
我这是创建了一个学生选修了全部课程。例子里并没有这样的学生。
这就是一个三重循环,最外层遍历学生,次外层遍历学生所选的课程,内层判断。当一个学生选择了全部的课程,那么他内层给外层的返回值全是f然后次外层给外层返回一个t。当有课没选时,内层给外层的返回值就有了t,这是或的关系,即次外层的整体值为t,返回给最外层的值就为f。
select Sno
from student
where NOT EXISTS(
select *
from course,sc
where sc.Sno='201215121' AND NOT EXISTS(
select *
from sc sc2
where sc2.Sno=student.Sno AND sc2.Cno=sc.Cno));
这个全称量词和蕴涵转换有一点绕,但是多看,多体会还是可以的。前面的in,any,all还是比较简单的,多思考过程,过程搞清楚了,就明白了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。