exists与in

学生表: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.

posted @ 2012-04-12 16:52  pantherbean  阅读(147)  评论(0编辑  收藏  举报