博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
exist后select加数字的理解
阅读量:4143 次
发布时间:2019-05-25

本文共 1530 字,大约阅读时间需要 5 分钟。

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

 

转载地址:http://rnbti.baihongyu.com/

你可能感兴趣的文章
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>
CORBA links
查看>>
读后感:>
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>
To do list
查看>>
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
spring事务探索
查看>>
浅谈Spring声明式事务管理ThreadLocal和JDKProxy
查看>>
初识xsd
查看>>
java 设计模式-职责型模式
查看>>
构造型模式
查看>>
svn out of date 无法更新到最新版本
查看>>
java杂记
查看>>
RunTime.getRuntime().exec()
查看>>