MySQL语言之高级关联查询(嵌套查询)

高级关联查询概念: 有的时候,我们要查询的数据, 一个简单的查询语句满足不了,并且我们使用的数据,表中不能直观体现出来。 而是预先经过一次查询才会有所体现。那么先执行的查询,我们称之子查询。被子查询嵌入的查询语句称之为父查询。

子查询返回的数据特点:
   (1) 可能是单行单列的数据。
   (2) 可能是多行单列的数据
   (3) 可能是单行多列的数据
   (4) 可能是多行多列的数据

 1)子查询可以在where子句中

子查询在WHERE子句中
1、查询工资大于jones工资的员工信息
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename = 'jones');
2、查询员工表中工资大于10号部门的平均工资的员工的姓名,职位,工资及部门号
SELECT ename,job,sal,deptno FROM emp WHERE sal>(SELECT AVG(IFNULL(sal,0)) FROM emp WHERE deptno=10);
3、查询工资等于每个部门的平均工资的人员信息
SELECT * FROM emp WHERE sal IN(SELECT AVG(IFNULL(sal,0)) FROM emp GROUP BY deptno);
4、查询工资大于所有部门的平均工资的人员信息
SELECT * FROM emp WHERE sal>ALL(SELECT AVG(IFNULL(sal,0)) FROM emp GROUP BY deptno);
5、查询工资大于任意部门的平均工资的人员信息
SELECT * FROM emp WHERE sal>ANY(SELECT AVG(IFNULL(sal,0)) FROM emp GROUP BY deptno);
6、查询工资和奖金与员工scott相同的其他员工信息
SELECT * FROM emp WHERE sal = (SELECT sal FROM emp WHERE ename = 'scott') AND comm = (SELECT comm FROM emp WHERE ename = 'scott') AND ename<> 'scott';
SELECT * FROM emp WHERE(sal,comm) = (SELECT sal,comm FROM emp WHERE ename = 'scott') AND ename<>'scott';

 2)子查询可以在from子句中

解析:可以这样想:员工的工资,姓名都可以在emp中查到,但是部门的平均工资却没有,如果可以有另外一张表中存在部门的平均工资,我们可以进行关联查询。

子查询在FROM子句中
7、查询每个员工的工资,姓名和其部门的平均工资
SELECT e.sal,e.ename,d.平均工资 FROM emp e,(SELECT deptno,AVG(IFNULL(sal,0)) 平均工资 FROM emp GROUP BY deptno) d WHERE e.deptno = d.deptno;
8、查询大于本部门的平均工资的员工的信息
SELECT e.sal,e.ename,d.平均工资 FROM (SELECT deptno,AVG(IFNULL(sal,0)) 平均工资 FROM emp 

 3)子查询可以在having子句中

子查询在HAVING子句中
9、查询部门平均工资大于30部门平均工资的 平均工资,工资之和,最大工资,最小工资
SELECT AVG(IFNULL(sal,0)) 平均工资,SUM(sal),MAX(sal),MIN(sal) FROM emp HAVING 平均工资>(SELECT AVG(IFNULL(sal,0)) FROM emp WHERE deptno=30);

4)子查询可以在select字句中,相当于外连接的另外一种写法。     

子查询在SELECT子句中
10、查询每个员工的姓名,工资,及其部门的平均工资,部门的工资之和。
SELECT ename,sal,
(SELECT AVG(IFNULL(sal,0)) FROM emp a WHERE a.deptno = b.deptno) 平均工资,
(SELECT SUM(sal) FROM emp c WHERE c.deptno=b.deptno) 工资之和 
FROM emp b; 


 

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