JAVA培训之连接查询之子查询

子查询就是嵌套查询,即SELECT语句中包含SELECT语句,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:

  • Where子句中,作为条件存在;
  • from后,作为表存在(多行多列)。

下面我们通过几个练习题来了解子查询,如下所示:
(1)查询emp表中,工资最高的员工的详细信息,如图1-1所示:

图1-1 查询员工信息
图1-1中,查询语句是:select * from emp where sal=MAX(sal),看上去这条sql语句没有什么问题,但是执行的时候却报错了。原因是where子句后面不能使用聚合函数,为了解决这个问题,我们可以使用子查询。
(2)首先查询出emp表中的最大工资,然后再查询工资等于最大工资的员工信息,如图1-2所示:
图1-2 子查询
图1-2中,查询语句是:select * from emp where sal=(select MAX(sal) from emp ),在where子句中嵌套了一个子查询语句。该子查询语句查询的是最大工资数。
以上子查询的位置是在where子句中,下面我们来了解子查询的位置出现在from关键字后面的情况,如下所示:
(3)查询30号部门的员工信息,如图1-3所示:
图1-3 子查询
在from后面使用子查询时,一定要为子查询指定别名,图1-3中,查询语句是:select * from (select * from emp where deptno=30) e,子查询的别名为e,可以理解为查询的结果就是一张表,然后再从这张表中查询信息。
图1-2中,子查询语句的查询结果是单行单列,图1-3中的子查询语句的查询结果是多行多列。根据子查询的查询结果有以下分类:

  • 单行单列:这样的子查询通常用来做条件,如:select * from 表1 别名1 where 列1[=,>,<,>=,<=,!=] (select 列 from 表2 别名2 where 条件);
  • 多行单列:这样的子查询通常也用来做条件,如:select * from 表1 别名1 where 列1[in,all,any] (select 列 from 表2 别名2 where 条件);
  • 单行多列:这样的子查询通常也用来做条件,如:select * from 表1 别名1 where [列1,列2,…列n] in (select 列1,列2,…列n from 表2 别名2 where 条件);
  • 多行多列:这样的子查询通常作为要查询的表,即放在from关键词后面,如:select * from 表1 别名1,(select…) 别名2 where 条件。

单行单列的子查询我们就不在演示,下面我们了解子查询的结果是多行单列的练习题,如下所示:
(4)查询大于30部门所有员工工资的员工信息,包含30部门员工,如图1-4所示:

图1-4 多行单列子查询
图1-4的查询语句是:select * from emp where sal>all(select sal from emp where deptno=30),其中子查询语句:select * from emp where deptno =30的结果是30部门所有员工的工资,是一个多行单列的结果集,查询语句的含义是大于子查询结果集中的所有的工资值,all关键字就是所有的意思,那么只要员工的工资大于30部门员工的最大工资就符合查询条件。
(5)查询大于30部门任意一个员工工资的员工信息,包含30部门员工,如图1-5所示:
图1-5 多行单列子查询
图1-5中查询语句是:select * from emp where sal>any(select sal from emp where deptno=30),子查询还是查询30部门的所有员工工资,where条件子句代表查询员工工资大于30部门员工的最小工资的员工信息,any表示任意一个。
以上是多行单列的子查询,下面我们来了解单行多列的子查询,如下所示:
(6)查询与名称为殷天正的员工的工作,部门以及工资相同的员工信息,如图1-6所示:
图1-6 单行多列子查询
图1-1中,查询语句是:select * from emp where (job,deptno,sal) in (select job,deptno,sal from emp where ename=’殷天正’),子查询是查询殷天正的工作,部门以及工资。where条件字句表示查询job,deptno以及sal同时与殷天正的工作,部门,工资相同的员工。
   当子查询的查询结果是多行多列时,我们就可以把它当成是一个表,将它放在from关键词后面,这里我们就不在进行演示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值