这里写目录标题
- 子查询
- 子查询的分类
- 1.非相关子查询
- 单行单列
- 单行多列
- 单列多行
- 多行多列
- 2.相关子查询
子查询
定义:一个查询语句中嵌套一个或多个查询语句,里层的查询语句的结果成为了外层查询语句的一部分。
外层的查询叫主查询
里层的查询叫子查询
子查询需要加括号
子查询的分类
1.非相关子查询
是指子查询部分,能单独运行,子查询不会牵扯主查询内容。主查询在乎的是子查询的结果。
根据子查询返回的结果不同,可以分为四种。
单行单列
SELECT AVG(sal) FROM emp;
例题:查询和SMITH在同一部门的员工信息。
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH')
步骤:1.先写好主查询,子查询部分先用汉语表达,越清楚越好,如
SELECT * FROM emp WHERE deptno = (SMITH的部门编号)
2.写出子查询的查询,为了实现第一步中的汉语部分,查询结果列的个数,顺序,属性要和主查询条件列一致。
SELECT deptno FROM emp WHERE ename = 'SMITH'
3.将主查询和子查询结合。
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH')
练习:查询和scott在同一岗位的员工信息
SELECT *FROM emp where job = (SELECT job FROM emp WHERE ename = 'SCOTT');
单行多列
不是很友好,用的不多
例题:查询和SOCTT在同一部门并且岗位也相同的员工信息。
SELECT * FROM emp WHERE (dept,job)=(SCOTT的部门和岗位)
--SCOTT的部门和岗位
SELECT deptno,job FROM emp WHERE ename = 'SCOTT';
--注意,查询的列的个数顺序属性要和主查询条件一致。
SELECT * FROM emp WHERE (deptno,job)=(SELECT deptno,job FROM emp WHERE ename = 'SCOTT')
练习:查询和scott或者king在同一部门并且同一岗位的员工信息
SELECT * FROM emp WHERE (deptno,job) in (SELECT deptno,job FROM emp WHERE ename in('SCOTT','KING'));
单列多行
把单列多行的查询结果看成一个集合
IN,ANY,ALL后面通常可以放结合
例题:查询和SMITH或者和KING在同一部门的员工信息
SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE ename = 'SMITH' OR ename = 'KING');
练习:查询出emp表所有的领导信息。
SELECT * FROM emp WHERE empno in (SELECT MGR FROM emp);
多行多列
子查询的结果相当于 一张表
大多数把多行多列的查询结果放在FROM关键字后面
例题:查询十号部门中最高的工资的员工。
SELECT ename,MAX(sal) FROM (SELECT sal,ename From emp WHERE deptno = 10 )
练习:查询所有部门中平均工资最高的部门编号
SELECT deptno FROM emp WHere (SELECT avg(sal) FROM emp GROUP by deptno )
习题:查询所有部门中平均工资最高的部门编号–把每个部门的平均工资当成表
方法1:
SELECT DEPTNOFROM (SELECT AVG(SAL) SAL, DEPTNO FROM EMP GROUP BY DEPTNO)WHERE SAL = (SELECT MAX(AVG(SAL)) SAL FROM EMP GROUP BY DEPTNO);
方法2:
SELECT DEPTNO, AVG(SAL)FROM EMPGROUP BY DEPTNO
HAVING AVG(SAL) = (SELECT MAX(SAL)FROM (SELECT AVG(SAL) SAL, DEPTNOFROM EMPGROUP BY DEPTNO));
2.相关子查询
是指子查询不能单独运行,子查询会牵扯主查询的部分内容
主查询在乎的是与子查询的关系。
例题
查询员工的姓名岗位薪资部门编号以及对应的部门名称。
SELECT ename,job,deptno,(对应部门编号的部门名称) FROM emp;
SELECT ENAME,JOB,SAL,DEPTNO,(SELECT DNAME FROM DEPT B WHERE B.DEPTNO = A.DEPTNO)FROM EMP A;
练习:查询员工工资比该员工岗位平均薪资高的员工信息。
SELECT *FROM EMP AWHERE A.SAL >(SELECT AVG(SAL) FROM EMP B WHERE A.JOB = B.JOB GROUP BY JOB);
```
子查询不能放在GROUP BY后面,其余都可以。
相关子查询有点难度啊 上课没听懂改天学明白了再更新