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

来源:互联网 发布:魔兽2.43数据库 编辑:程序博客网 时间:2024/05/12 15:15
 
查看文章
  
相关子查询中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_idselect的结果,那你一定会问为什么用select 2 不用select * 呢

我上网查了下 听说 如果用select * 要查数据字典所以会慢点 呵呵 还不知道是不是真的!