您的位置:首页 > 其它

相关子查询中exists后select 加数字的理解

2010-08-20 10:12 274 查看
查看文章
相关子查询中exists后select 加数字的理解
2010-07-23 17:16
前提:两个基础表
SQL> select * from courses;

COURSE_ID COURSE_NAME CREDIT_HOUR
---------- ------------------------------ -----------
10101 计算机组成原理 4
10201 自动化控制原理 4
10301 工程制图 3
10102 c++程序设计 3
10202 模拟电子技术 4
10302 理论力学 3
10103 离散数学 3
10203 数字电子技术 4
10303 材料力学 3

已选择9行。

SQL> select * from students_grade;

STUDENT_ID COURSE_ID SCORE
---------- ---------- ----------
10101 10101 87
10101 10301 79
10101 10201 100
10101 10201 100

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

下面执行相关子查询:
SQL> select course_id ,course_name from courses c
where exists
(select 2 from students_grade sg
where sg.course_id =c.course_id);

分析执行步骤:
1) 先执行外部查询
SQL> select course_id ,course_name from courses c;

COURSE_ID COURSE_NAME
---------- ------------------------------
10101 计算机组成原理
10201 自动化控制原理
10301 工程制图
10102 c++程序设计
10202 模拟电子技术
10302 理论力学
10103 离散数学
10203 数字电子技术
10303 材料力学

2) 外部查询的每一条数据对比一次子查询



第一次比较
10101 计算机组成原理 只要exists 后对比的结果返回true 则列出:

10101 计算机组成原理

同理外部查询的COURSE_ID COURSE_NAME 还剩下8项一一和内部查询的
STUDENT_ID COURSE_ID SCORE比较最后得出结果

COURSE_ID COURSE_NAME
---------- ------------------------------
10101 计算机组成原理
10201 自动化控制原理
10301 工程制图

很多人会被查询语句中的
(select 2 from students_grade sg
where sg.course_id =c.course_id);的2迷惑,不管你这里用*号 还是
students_grade中的(STUDENT_ID 、COURSE_ID 、SCORE)项,最后都不会影响整个相关查询的结果,这是因为,外部查询的项和内部查询项对比时只会看是否为ture,如果为ture则列出结果,所以这里根本不会理会select 2 from students_grade sg
where sg.course_id =c.course_id中select的结果,那你一定会问为什么用select 2 不用select * 呢
我上网查了下 听说 如果用select * 要查数据字典所以会慢点 呵呵 还不知道是不是真的!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: