SQL—子查询

本文围绕SQL子查询展开,介绍了子查询语法,强调子查询在主查询前执行,主查询使用其结果。还阐述了使用子查询的注意事项,如要放在括号内等。并详细说明了在WHERE、FROM、SELECT子句中使用子查询,以及单行、多行子查询的用法,还提及子查询中的空值问题和结果集分页方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子查询

时间:20190228
作者:chj

子查询语法

  • 子查询(内查询)在主查询(外查询)之前执行。
  • 主查询使用子查询结果。
  • 子查询是嵌入在另一个SELECT语句子句中的SELECT语句。可以使用子查询从简单语句构建功能强大的语句。当需要从表中选择具有依赖于表本身的数据的条件的行时,它们可能非常有用。

使用子查询注意事项

  • 子查询要包还在括号内
  • 将子查询放在比较条件的右侧增强可读性 ( 子查询可以出现在比较运算符的两侧)
  • 单行操作符对应单行子查询,多行操作符对应多行子查询

WHERE 子句中使用子查询

例:查询公司内,比“SCOTT”工资高的员工信息

select ename,sal
from emp
where sal>(select sal from emp
where ename='SCOTT');

ENAME             SAL
---------- ----------
KING             5000

FROM 子句中使用子查询

例:查看员工姓名、工资、部门编号和部门平均工资

select a.ename,a.sal,a.deptno,b.salavg
from emp a,
(select deptno,avg(sal) salavg
from emp
group by deptno) b
where a.deptno = b.deptno;

ENAME             SAL     DEPTNO     SALAVG
---------- ---------- ---------- ----------
SMITH             800         20       2175
ALLEN            1600         30 1566.66667
WARD             1250         30 1566.66667
JONES            2975         20       2175
MARTIN           1250         30 1566.66667
BLAKE            2850         30 1566.66667
CLARK            2450         10 2916.66667
SCOTT            3000         20       2175
KING             5000         10 2916.66667
TURNER           1500         30 1566.66667
ADAMS            1100         20       2175
JAMES             950         30 1566.66667
FORD             3000         20       2175
MILLER           1300         10 2916.66667

SELECT 子查询

select e.empno,e.ename,e.deptno, 
 (select d.dname from dept d where e.deptno = d.deptno) 
 from emp e;

单行子查询

  • 只返回一行
  • 使用单行比较操作符
操作符含义
=等于
>大于
>=大于等于
<小于
<=小于等于
<>不等于

子查询中的空值问题

例:查询公司不是领导的员工
错误写法:因为mgr内有空值

select distinct e.ename,e.job
from emp e,emp m
where e.empno not in (select mgr from emp);

no rows selected

正确写法:

select distinct e.ename,e.job
from emp e,emp m
where e.empno not in (select nvl(mgr,0) from emp);

ENAME      JOB
---------- ---------
WARD       SALESMAN
SMITH      CLERK
TURNER     SALESMAN
JAMES      CLERK
MARTIN     SALESMAN
ADAMS      CLERK
ALLEN      SALESMAN
MILLER     CLERK

多行子查询

  • 返回多行
  • 使用多行比较操作符
操作符含义
in等于列表中的某一个值
any与列表中的任意值比较
all与列表中的所有值相比较

any:使用方法
例:查询出员工工资比任意一个部门的平均工资高的员工信息

select ename,sal,deptno
from emp
where sal > any (select avg(sal) from emp
group by deptno);

ENAME             SAL     DEPTNO
---------- ---------- ----------
KING             5000         10
FORD             3000         20
SCOTT            3000         20
JONES            2975         20
BLAKE            2850         30
CLARK            2450         10
ALLEN            1600         30

all:使用方法
例:查询出员工工资比所有部门的平均工资高的员工信息

select ename,sal,deptno
from emp
where sal > all (select avg(sal) from emp
group by deptno);

ENAME             SAL     DEPTNO
---------- ---------- ----------
JONES            2975         20
SCOTT            3000         20
FORD             3000         20
KING             5000         10

结果集分页

  • rownum 只能用“<”,不能使用“>”和"="。
    例:
    查看全部信息
select rownum,a.*
from (select rownum rn,ename,sal
from emp) a;

    ROWNUM         RN ENAME             SAL
---------- ---------- ---------- ----------
         1          1 SMITH             800
         2          2 ALLEN            1600
         3          3 WARD             1250
         4          4 JONES            2975
         5          5 MARTIN           1250
         6          6 BLAKE            2850
         7          7 CLARK            2450
         8          8 SCOTT            3000
         9          9 KING             5000
        10         10 TURNER           1500
        11         11 ADAMS            1100
        12         12 JAMES             950
        13         13 FORD             3000
        14         14 MILLER           1300

只看前5行

select rownum,a.*
from (select rownum rn,ename,sal
from emp) a
where rownum<6;

    ROWNUM         RN ENAME             SAL
---------- ---------- ---------- ----------
         1          1 SMITH             800
         2          2 ALLEN            1600
         3          3 WARD             1250
         4          4 JONES            2975
         5          5 MARTIN           1250

只看6-10行,错误写法

select rownum,a.*
from (select rownum rn,ename,sal
      from emp) a
where rownum between 6 and 10;

no rows selected

只看6-10行,正确写法

select rownum,a.*
from (select rownum rn,ename,sal
        from emp) a
where a.rn between 6 and 10;

    ROWNUM         RN ENAME             SAL
---------- ---------- ---------- ----------
         1          6 BLAKE            2850
         2          7 CLARK            2450
         3          8 SCOTT            3000
         4          9 KING             5000
         5         10 TURNER           1500
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值