Oracle子查询实例讲解

Oracle基础内容:子查询(单行、any、all),子查询在SELECT、UPDATE、DELETE语句内部可以出现SELECT语句。内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表。子查询的类型有:

单行子查询:不向外部返回结果,或者只返回一行结果。

多行子查询:向外部返回零行、一行或者多行结果。

案例1:查询出销售部(SALES)下面的员工姓名,工作,工资。

案例分析

该问题可以用联接查询实现,由于所需的结果信息都在Emp表中,可以先从Dept表中查询出销售部对应的部门号,然后根据当前部门号再到Emp表中查询出符合该部门的员工记录即可。从销售表中查询出的结果可以作为Emp表中查询的条件,SQL语句实现如下:

代码演示:单行子查询

SQL> SELECT ENAME,JOB,SAL FROM EMP

    WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES')  ①

    /
ENAME JOB SAL
ALLEN SALESMAN 1600
WARD SALESMAN 1250
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
TURNER SALESMAN 1500
JAMES CLERK 950
6 rows selected    

代码解析:

① 内部查询的结果作为外部查询的条件。

需要注意:

`如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返还任何结果。

`在单行子查询中外部查询可以使用=、>、<、>=、<=、<>等比较运算符。

`内部查询返回的结果必须与外部查询条件中的字段(DEPTNO)匹配。

`如果内部查询返回多行结果则出现错误。

案例2:查询出Emp表中比任意一个销售员(“SALESMAN”)工资低的员工姓名、工作、工资。

案例分析

销售员在Emp表中有很多条记录,每个人工资不相等,如果返回“比任意员工的工资还低”的条件,返回比“最高工资还低”即可。如果用子查询做,子查询中就会返回多条记录。用普通的关系符(>、<等)运行就会出错。这时候需要用关键字ANY。ANY放在比较运算符后面,表示“任意”的意思。

代码演示:ANY子查询

SQL> SELECT ENAME,JOB,SAL FROM EMP

     WHERE SAL<ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN')  ①

     /
(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐