继昨天的问题后,新的问题出现了。在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还是生效了?
-------------------------------------
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还是生效了?
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 表中有存在那么就不显示,反之则显示这条记录,终上,有那样的结果