EXISTS、使用操作符的相关子查询小结

一、判断使用相关子查询前提特征: 前提是在子查询中引用了外部查询中的一列或多列, 在编写受控于外部查询的某个列值(一般是外键)的子查询时。特征是相关子查询的效率是较低的,所以要谨慎使用。类型分为使用操作符的、使用EXISTS的相关子查询。

二、相关子查询的执行步骤:

步骤是:

(1)进入外部查询的一行。

(2)在读取外部一行下,子查询for一遍内部的整个表得到所给条件的返回值。

(3)外部查询的一行与子查询返回值比较确定外部查询的返回值,返回(1)(2)直至得到整个查询结果。

三、使用操作符的相关子查询:

示例:

SELECTstuff_id,stuff_name FROM stuff outter WHERE outter.Salary >

(SELECT AVG(Salary) FROM stuff inner

WHERE outter.Apartment=inner.Apartment)

ORDER BY Apartment;

上述是在职员表中选出大于职员所在部门的平均工资的职员编号和姓名。

1.使用操作符的特点:可以实现内部表,按外部控制,对内部表进行分组;然后在分组上返回组上某字段的计算值给外部表,外部表做出判断并返回符合条件行的值。

2.编写使用操作符的子查询:上面示例的聚集函数为其它的聚集函数,操作符可以是> ,< ,=,<>等。

四:EXISTS相关子查询:

示例:

SELECT student_id,student_name FROM  student s

WHERE NOT EXISTS

          (SELECT * FROM sc sc1

           WHERE sc1.student_id='0807100404' AND

                    NOT EXISTS

                            (SELECT *

                             FROM sc sc2

                             WHERE sc2.student_id=s.student_id AND sc2.course_id=sc1.course_id

                               )

                     );

目的:查询至少选修了学号为0807100404的学生,选修的全部课程,的学生的学号和姓名。

解释下,至少就是等于或包含至少后面得内容的集合。

如果要用自然语言解释就是:先对外部的一个学生选择了和sc1一样的课程查询出来,然后取反得到只有sc1选择了的课程记录,再取反得到外部的一个学生是选择了sc1选择的全部课程或更多。

可能你看上面的自然语言解释有些不明白,下面简要总结下EXISTS实质。

1.使用EXISTS的特点: 当仅用EXISTS时,可以用自然连接来代替,但是描述自身的分组后选择 时要用EXISTS,且描述"所有未“,”至少“这些取反的NOT EXISTS时 就难以用自然连接来解决,此时只好用NOT EXISTS。

2.EXISTS,NOT EXISTS的执行实质 :实质是返回true,false。但是当外部一行,内部一for遍历,再一for遍历时,从返回的结果分析更清楚这样的过程;实质上此时返回的结果是在给定条件下的记录集合,取NOT EXISTS就是不符合条件的记录集合 ,再在上面对应的列值中进行选择。最后返回给最外层一个true,false进行choose or not

3.编写使用EXISTS、NOT EXISTS的子查询 :先分析需求是否符合相关子查询的前提;确定关联的表和外键;用集合和EXIST、NOT EXISTS的实质来大概画出逻辑嵌套层次;编写代码。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值