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

 
查看文章
  
相关子查询中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 * 要查数据字典所以会慢点 呵呵 还不知道是不是真的!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值