查看文章
|
前提:两个基础表 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 * 要查数据字典所以会慢点 呵呵 还不知道是不是真的!
|