Oracle子查询

在SQL语言中,由SELECT-FROM-WHERE组成的语句称为查询块。当需要获得一个未知的但又在数据库中存在的值时,将一个查询块嵌套在另一个查询块的WHERE子句的条件中的查询块称为子查询。子查询中还可以嵌套子查询。子查询的结果可以是一个值也可以是多个值。

 

学生表(STUDENT):

 

1)子查询

    学生表中有学号(SNO)、姓名(SNAME)、性别(SSEX)、出生日期(SBIRTHDAY)和班级(CLASS)。例如要找学号比王芳大的同学,这时知道的信息只有一个,那就是王芳。要找这些同学就要先查出王芳的学号,然后用王芳的学号去对比其他的学号,最后再找出比王芳学号大的同学。查王芳的学号这一步就相当于是子查询,返回的结果就是王芳的学号,将王芳的学号返回给父查询再匹配查询出学号比王芳大的同学。

 

这里能查询出结果主要是因为子查询会在父查询之前执行完成,父查询就可以使用子查询的结果。需要注意的是子查询要包含在括号内而且要将子查询放在比较条件的右侧。

 

 

2)多个子查询

在查询块中,当遇到两个或两个以上未知的但又在数据库中存在的值时,就需要用到多个子查询。例如查询与王芳同班且学号比她小的同学,这里有两个未知的值,王芳的班级与学号,这时候就需要用到多个子查询进行查询。

    这里的两个子查询分别把王芳的学号跟班级查询出来,再通过这两个条件查找出匹配的结果。

 

 

3)嵌套子查询

    在查询块中,当遇到要用子查询且子查询也有未知的但又在数据库中存在的值时,就可以用嵌套子查询来解决,也就是子查询中嵌套子查询。如下图代码所示,查询同班同学中学号比王芳大的同学

    这个查询先用子查询查出跟王芳同班的所有人,由于王芳所在的班级是未知的,所以子查询里面就嵌套了子查询来查王芳的班级。需要注意的是,这里的子查询的结果返回的是多条数据,王芳所在班级的所有人的信息,同是返回的数据又是一个表,这个表的数据经过父查询WHERE子句的过滤后得到最终的结果。所以子查询不一定只跟在WHERE子句后面,也可以跟在FROM子句后面。

 

 

4)子查询返回多行

    上面讲的子查询中除了跟在FROM子句后面的子查询之外返回的都是一个值。那么相应的就会有返回多个值的子查询。对于返回多个值的子查询就需要用到多行比较操作符。多行比较操作符有三个。

IN:等于子查询中的任意一个。

ANY:和子查询返回的某一个值比较。

ALL:和子查询返回的所有值比较。

 

IN子查询中有匹配相等的就是满足条件;ANY匹配集合中的任意一个就算满足条件;而ALL要跟所有的值比较,所有都满足以后才算满足条件。

 

 

5)子查询空值

子查询在查询时可能会出于种种原因而使得查询的结果为空。当查询的结果为空时,就会返回空值的结果给父查询,会导致父查询查询不出结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值