Oracles数据库学习笔记(五)子查询(嵌套查询)

子查询(嵌套查询)

一、如何使用子查询

1.括号内的查询叫做子查询,也叫内部查询,先于主查询执行。
2.子查询的结果被主查询(外部查询)使用
3.expr operator包括比较运算符:
  单行运算符:>、=、>=、<、<>、<=
  多行运算符: IN、ANY、ALL

4.子查询可以嵌于以下SQL子句中:
  (1)WHERE子句
  (2)HAVING子句
  (3)FROM子句

二、写法规定

  (1)子查询要用括号括起来

SELECT 
FROM 
WHERE(SELECT)

  (2)将子查询放在比较运算符的右边

SELECT 
FROM 
WHERE A > (SELECT)

  (3)对于单行子查询要使用单行运算符

SELECT 
FROM 
WHERE A > (SELECT)

  (4)对于多行子查询要使用多行运算符

SELECT 
FROM 
WHERE A >ALL (SELECT)

三、单行子查询

1.单行子查询只返回一行一列
2.使用单行运算符

等于 大于 大于等于 小于 小于等于 不等于
= > >= < <= <>

eg:查询和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作

SELECT ENAME, JOB FROM EMP
WHERE JOB = (SELECT JOB FROM EMP WHERE EMPNO = 7369)
AND SAL > (SELECT SAL FROM EMP WHERE EMPNO = 7876)

这里写图片描述
3.子查询中使用组函数
eg:查询工资最低的员工姓名,岗位及工资

SELECT ENAME, JOB, SAL
FROM EMP 
WHERE SAL = (SELECT MIN(SAL) FROM EMP)

这里写图片描述
4.HAVING子句中使用子查询
eg:查询部门最低工资比20部门最低工资高的部门编号及最低工资

SELECT DEPTNO, MIN(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING MIN(SAL) > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 20)

这里写图片描述

练习1

1-1查询入职日期最早的员工姓名,入职日期

SELECT ENAME,HIREDATE 
FROM EMP 
WHERE HIREDATE = (SELECT MIN(HIREDATE) FROM EMP)

这里写图片描述
1-2查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称

SELECT ENAME, SAL, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL > (SELECT SAL FROM EMP WHERE ENAME = 'SMITH') AND LOC = 'CHICAGO'

Oracles数据库学习笔记(五)子查询(嵌套查询)_第1张图片
1-3查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期

SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE < (SELECT MIN(HIREDATE) FROM EMP WHERE(DEPTNO = 20))

这里写图片描述
1-4查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数

SELECT EMP.DEPTNO, DNAME, COUNT(ENAME)
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
HAVING  COUNT(ENAME) > (SELECT (SELECT COUNT(*) FROM EMP)/(SELECT COUNT(*) FROM DEPT)FROM DUAL)
GROUP BY  EMP.DEPTNO, DNAME

这里写图片描述

四、多行子查询

1.子查询返回记录的条数 可以是一条或多条。

2.和多行子查询进行比较时,需要使用多行操作符,多行操作符包括:IN 、ANY、ALL。

3.IN的使用

eg:查询是经理的员工姓名,工资

SELECT ENAME, SAL
FROM EMP
WHERE EMPNO IN (SELECT MGR FROM  EMP)

Oracles数据库学习笔记(五)子查询(嵌套查询)_第2张图片
4.ANY的使用
表示和子查询的任意一行结果进行比较,有一个满足条件即可。
(1)< ANY:表示小于子查询结果集中的任意一个,即小于最大值就可以。
(2)> ANY:表示大于子查询结果集中的任意一个,即大于最小值就可以。
(3)= ANY:表示等于子查询结果中的任意一个,即等于谁都可以,相当于IN。

eg:查询是经理的员工姓名,工资

SELECT ENAME, SAL
FROM EMP
WHERE EMPNO = ANY (SELECT MGR FROM EMP)

Oracles数据库学习笔记(五)子查询(嵌套查询)_第3张图片
5.ALL的使用
表示和子查询的所有行结果进行比较,每一行必须都满足条件。
(1)< ALL:表示小于子查询结果集中的所有行,即小于最小值。
(2)> ALL:表示大于子查询结果集中的所有行,即大于最大值。
(3)= ALL :表示等于子查询结果集中的所有行,即等于所有值,通常无意义。

eg:查询部门编号不为30,且工资比30部门所有员工工资高的员工编号,姓名,职位,工资

SELECT EMPNO, ENAME, JOB, SAL
FROM    EMP
WHERE   SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO= 30)
AND DEPTNO <> 30;

这里写图片描述

你可能感兴趣的:(数据库)