HAVING 子句
HAVING 子句是对分组统计函数的结果进行过滤的子句
格式
SELECT *
FROM 数据源,数据源…
WHERE 条件判断语句
GROUP BY 需要分组的字段
HAVING 对统计函数进行筛选
ORDER BY 排序的字段 排序的方式
执行顺序:第一步执行:FROM 子句。
第二步执行:WHERE子句。
第三步执行:GROUP BY子句。
第四步执行:HAVING 子句。
第五步执行:SELECT 子句 。
第六步执行:ORDER BY 子句
延用上次的例子:查询出平均薪资大与2000的职位以及名称
子查询
子查询就是将一个查询的结果当作另一个查询的数据来源或判断条件,常见的子查询有,WHERE子查询,FROM子查询,SELECT子查询,HAVING子查询,EXISTS子查询。子查询都需要用小括号括起来。
WHERE子查询
将一个查询的结果当作另一个查询的判断条件
列如:查询出薪资比经理职位中最高薪资低的员工信息
第一步现查询出经理职位中薪资最高的
SELECT MAX(sal)
FROM emp
GROUP BY job
HAVING job = 'MANAGER';
然后再把第一步查询的结果作为判断条件
SELECT *
FROM emp
WHERE sal <(
SELECT MAX(sal)
FROM emp
GROUP BY job
HAVING job = 'MANAGER');
FROM 子查询
将一个查询的结果当作另一个查询的数据来源
例如:查询各部门工资大以该部门平均工资的员工信息
SELECT *
FROM emp e INNER JOIN (
SELECT deptno, AVG(sal) avgsal
FROM emp
GROUP BY deptno) temp ON e.deptno = temp.deptno
WHERE e.sal > temp.avgsal;
HAVING 子查询
HAVING 子查询是对分组统计函数进行过滤的子句
例如:查询出平均薪资高于所有员工平均薪资的职位名称,以及职位的人数,这些高于平均工资的职位的平均工资。
SELECT job ,COUNT(*),AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>(
SELECT AVG(sal) avgsal
FROM emp);
EXISTS子查询
EXISTS子查询的特征:将主查询中的数据带到子查询中验证,如果验证成功则子查询返回true,当主查询接收到true的时候被验证的数据就会显示,如果子查询中验证失败则返回false,当主查询接收到false的时候验证的数据就不会显示。
例如:查询出有部门的员工信息
SELECT *
FROM emp e
WHERE EXISTS (
SELECT deptno
FROM dept d
WHERE e.deptno = d.deptno
);
/*
查询出没有部门的员工信息
使用NOT EXISTS 的时候也是将主查询中的数据带入子查询中验证,如果验证成功返回false,主 查询接受到false则不显示数据,反正则显示数据。
*/
SELECT *
FROM emp e
WHERE NOT EXISTS (
SELECT deptno
FROM dept d
WHERE e.deptno = d.deptno
);
ROWNUM 伪列
ROWNUM是在查询过程中动态的生成一个列,该列其实也很像一个字段,但是这个列不是数据表,而是在查询中动态生成的,且该列必须从1开始。
SELECT ROWNUM AS rn ,empno , ename ,job ,sal, hiredate ,mgr
FROM emp;
例:显示后5条数据
SELECT *
FROM (
SELECT ROWNUM AS rn ,empno , ename ,job ,sal, hiredate ,mgr
FROM emp) temp
WHERE temp.rn >= 10;