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查询入职日期最早的员工姓名,入职日期
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'
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)
4.ANY的使用
表示和子查询的任意一行结果进行比较,有一个满足条件即可。
(1)< ANY:表示小于子查询结果集中的任意一个,即小于最大值就可以。
(2)> ANY:表示大于子查询结果集中的任意一个,即大于最小值就可以。
(3)= ANY:表示等于子查询结果中的任意一个,即等于谁都可以,相当于IN。
eg:查询是经理的员工姓名,工资
SELECT ENAME, SAL
FROM EMP
WHERE EMPNO = ANY (SELECT MGR FROM EMP)
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;