oracle 12c HAVING 句

oracle 12c HAVING 句

集合函数不可以使用在where 语句。但是我们需要给group 函数指定一些选出的条件,此时可以使用HAVING 语句

基本的使用方法

select 列名,group函数(列名)
from 表名
[where 条件]
[group by group化使用的列列表]
[having group相对应的条件]
[order by 排列顺序用的列]

HAVING 语句可以指定那些行别选出来进行集合操作,不指定的情况下为全部选出。

使用的例子

select 列名,group函数(列名)
select deptno,job,count(*),avg(sal)
from employees
group by deptno,job
having count(*)>2 and avg(sal)>= 20000;

使用说明

having 语句查询顺序

  1. 有where 的情况下首先使用where 语句,选出集合化的语句。
  2. 使用group by 语句将行几何化
  3. 使用集合函数
  4. 使用having 句筛选出满足的结果,但结果为【true】 时筛选出来

特别注意的点

  • 必须使用在where 语句之后,order by 语句之前
  • group by 句 和having 谁在前的使用的顺序都是一样的
  • group 句没有指定having句时,选择全体

验证分析实验

第一步:准备工作(为了验证数据)

 select deptno,job from employees where job != '部長';
 /* 显示结果*/
 DEPTNO JOB
------ --------
    20 事務
    30 事務
    20 事務
    30 営業
    20 主任
    30 営業
    10 社長
    30 営業
    30 営業
    20 主任
    10 事務

     select deptno,job,count(*),avg(sal)
  2  from employees
  3   group by deptno,job;
 /* 显示结果*/
DEPTNO JOB        COUNT(*)   AVG(SAL)
------ -------- ---------- ----------
    10 社長              1     500000
    10 事務              1     230000
    30 営業              4     275000
    10 部長              1     245000
    20 事務              2     155000
    20 部長              1     280000
    30 事務              1     295000
    20 主任              2     290000
    30 部長              1     285000

第二步:where 和group by 一起,分析结果可知,group by 是在where 语句之后。

SQL> select deptno,job,count(*),avg(sal)
  2  from employees
  3  where job != '部長'
  4   group by deptno,job;

DEPTNO JOB        COUNT(*)   AVG(SAL)
------ -------- ---------- ----------
    10 社長              1     500000
    10 事務              1     230000
    30 営業              4     275000
    20 事務              2     155000
    30 事務              1     295000
    20 主任              2     290000

第三步:where 和group by句,最后是having 句。 分析结果可以知道。having语句实在group by 语句之后。

SQL> select deptno,job,count(*),avg(sal)
  2  from employees
  3  where job != '部長'
  4  group by deptno,job
  5  having count(*)>=2 and avg(sal)>200000;

DEPTNO JOB        COUNT(*)   AVG(SAL)
------ -------- ---------- ----------
    30 営業              4     275000
    20 主任              2     290000

第四步:group by 语句 和 having语句的顺序问题 ,检验结果一致,having 与 order by 写的顺序不影响执行顺序。

/* group 在前 */
SQL> select deptno,job,count(*),avg(sal)
  2  from employees
  3  where job != '部長'
  4  having job != '営業'
  5  group by deptno,job;

/*搜索结果*/
DEPTNO JOB        COUNT(*)   AVG(SAL)
------ -------- ---------- ----------
    10 社長              1     500000
    10 事務              1     230000
    20 事務              2     155000
    30 事務              1     295000
    20 主任              2     290000

/*  2 .group 在前 */
SQL> select deptno,job,count(*),avg(sal)
  2  from employees
  3  where job != '部長'
  4   group by deptno,job
  5  having job != '営業';
/*搜索结果*/
DEPTNO JOB        COUNT(*)   AVG(SAL)
------ -------- ---------- ----------
    10 社長              1     500000
    10 事務              1     230000
    20 事務              2     155000
    30 事務              1     295000
    20 主任              2     290000

猜你喜欢

转载自blog.csdn.net/qq1301709072/article/details/80643206