学生表:s
sid sname
1 s1
2 s2
3 s3
课程表:c
cid cname
1 c1
2 c2
选课表:sc
sid cid
1 1
2 1
1 2
查询选修了课程的学生:
select * from s where exists(select * from sc where s.sid=sid)
exists查询过程:先执行主查询, select * from s , 然后用主查询的每一条记录的sid与表sc中的sid作相等比较(如果与选课表第一条记录不相等,则继续往下查找,如果找到,就不往下查找了,找到返回true,没有找到则返回false),如果相等,返回真, 就筛选出这条记录. exists(select * from sc where s.sid=sid)返回的是true还是false, 所以*可以是任何字段, 因为它只表示有没有找到. 如表s中学号为1,对应选课表中第一条记录,它就不会再向下比较了,这样就节省了时间.
这条语句还可以写成in形式:
select * from s where sid in (select sid from sc where sid=s.sid)
in查询过程: 先执行子查询, 再执行主查询.
主表数据>子表数据,用in; 反之,主表数据<子表数据, 用exists.