继昨天的问题后,新的问题出现了。在not exists这反复纠结,不能自已
-------------------------------------
course表如下:
-------------------------------------
课程代号      课程名称       
K01        奥运会主题曲
K02        喜爱的专辑
K03        VB技术大全
K04        经典歌曲
K05        个人单曲
K06        数据结构
K07        最受欢迎的歌曲
------------------------------------
grade表如下:
------------------------------------
学号        课程代号
B003       k03  
B005       K02 
B003       K05 
B004       K04 
B002       K02  
B001       K01 
B001       K06
------------------------------------
现用SQL语句(1)查询:
select * from course where not exists(select * from grade where grade.课程代号=course.课程代号) 
------------------------------------     
得到结果为:
K07          最受欢迎的歌曲
-------------------------------------
问题是:not exists的定义是子查询无返回值时where子句生效,但是为什么此例中的子查询有返回值,not exists还是生效了?

解决方案 »

  1.   


    select * from course where not exists(select * from grade where grade.课程代号=course.课程代号)  你理解清楚 查询语句的执行过程你就明白了1,首先select * from course 这个语句,它是遍历这个表里的没一行,从第一行开始到最后一行,
    2,然后where not exists(select * from grade where grade.课程代号=course.课程代号)   对每一行做一个
    条件判断,这个判断呢是一个字查询
    3,所以这个语句的意思是,判断没一行的记录,如果这个记录的课程代号在grade 表中有存在那么就不显示,反之则显示这条记录,终上,有那样的结果
      

  2.   

    因为K07在course表中存在,而在grade表中不存在,所以条件not exists(select * from grade where grade.课程代号=course.课程代号) 是成立的
      

  3.   

    语句的意思是查询 course 表在 grade 表中不存在的记录
      

  4.   

    你把NOT EXISTS理解为不存在就可以了。
      

  5.   

    谢谢大家,谢谢1楼,原来我是没搞明白执行的顺序。本来以为是先执行子查询,所以才有子查询返回值非空则not exists条件不成立的想法。现在明白了