|
前两天一直不是很明白exists的用法..书上写的就几句话.网上的我找到的都是一个样SQL Server里的帮助文档,看的好郁闷,现在弄明白了.拿经验和大家分享一下.
exists(包括not exists)子查询
通过这几天的感觉.exists应该是这样的
select distinct 姓名 from xs
where not exists (
select * from kc
where not exists (
select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
)
)
go
拿这个来说吧:
系统会把最外层的查询xs里的数据一行一行的做里层的子查询.
注意:中间的exists语句只做出对上一层的返回true或false,因为,查询的条件都在where 学号=xs.学号 and 课程号=kc.课程号这句话里.每一个exists都会有一行值.它只是告诉一层,最外层的查询条件在这里成立或都不成立,返回的时候值也一样回返回上去.直到最高层的时候如果是true(真)就返回到结果集.为false(假)丢弃
where not exists
select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
这个exists就是告诉上一层.这一行语句在我这里不成立.因为他不是最高层.所以还要继续向上返回)
select distinct 姓名 from xs
where not exists (这里的exists语句收到上一个为false的值.他在判断一下.结果就是为true(成立),由于是最高层所以就会把这行的结果(这里指的是查询条件)返回到结果集)
我感觉几个重要的点:
1:最里层要用到的醒询条件的表比如:xs.学号、kc.课程号等都要在前面的时候说明一下select * from kc,select distinct 姓名 from xs
2:不要在太注意中间的exists语句.
3:把exists和not exists嵌套时的返回值弄明白
这是我学exists的一点经验.希望可以帮到大家.如果有错误也希望高手帮忙纠正,谢谢了 |
|