您的位置:首页 > 数据库 > Oracle

GROUP BY 用法

2013-06-16 11:58 127 查看
  GROUP BY 子句:  

         GROUP BY (EXPRESSION)

       你可以用group by 子句把表分成更小的组。这个子句有些要注意的地方:

1.在selelct 列表中的任何列或表达式,它们都必须出现在group by子句中或者是group function中,但是group by子句中可以出现非select列表中的列或表达式。

select 列表中的列都在group by子句和group function中,所以成功执行。

SQL> select department_id,avg(salary)  from  employees

  2  group  by department_id

  3  order by  department_id;

DEPARTMENT_ID AVG(SALARY)

------------- -  ----------

           10        4400

           20        9500

           30        4150

           40        6500

           50  3475.55556

           60        5760

           70       10000

           80  8955.88235

           90  19333.3333

          100  8601.33333

          110       10154

DEPARTMENT_ID AVG(SALARY)

------------- -----------

                     7000

12 rows selected.

没有将job_id列放在group by子句或group function中,所以执行失败。

SQL> select   department_id, job_id,avg(salary)  from  employees

  2  group by department_id;

select   department_id, job_id,avg(salary)  from  employees

                        *

ERROR at line 1:

ORA-00979: not a GROUP BY expression

在group  by 子句中可以有非select列表中的列,所以执行成功。

SQL> select avg(salary)  from employees  group  by  department_id;

AVG(SALARY)

-----------

 8601.33333

       4150

       7000

       9500

      10000

 19333.3333

      10154

 3475.55556

       6500

 8955.88235

       4400

AVG(SALARY)

-----------

       5760

12 rows selected.

2.在where子句中不可以使用别名,同样在group by 子句中也不可以使用。order by 子句中可以使用别名。

SQL> select department_id  as DD,avg(salary)  from employees 

  2  group by DD;

group by DD

         *

ERROR at line 2:

ORA-00904: "DD": invalid identifier

这是为什么?主要是执行顺序的原因:
SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据;

2、where子句基于指定的条件对记录行进行筛选;

3、group by子句将数据划分为多个分组;

4、使用聚集函数进行计算;

5、使用having子句筛选分组;

6、计算所有的表达式;

7、select 的字段;

8、使用order by对结果集进行排序。

SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出现的SELECT。SQL查询处理的步骤序号:

(8) 

1 SELECT  (9) DISTINCT (11) <TOP_specification> <select_list> 

2  (1)  FROM <left_table>  

3  (3) <join_type> JOIN <right_table> 

4  (2) ON <join_condition> 

5  (4) WHERE <where_condition> 

6  (5) GROUP BY <group_by_list> 

7  (6) WITH {CUBE | ROLLUP} 

8  (7) HAVING <having_condition> 

9 (10) ORDER BY <order_by_list>

  以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

3.按多列分组

对GROUP BY 子句的强大扩充就是使用多个分组特性。Oracle允许将数据集划分为多组,并且允许使用不同的分组特性将这些组进一步划分成子组。

SQL> select department_id,job_id,sum(salary)  from  employees

  2  group  by department_id,job_id

  3  order by department_id;

DEPARTMENT_ID JOB_ID     SUM(SALARY)

------------- ---------- -----------

           10 AD_ASST           4400

           20 MK_MAN           13000

           20 MK_REP            6000

           30 PU_CLERK         13900

           30 PU_MAN           11000

           40 HR_REP            6500

           50 SH_CLERK         64300

           50 ST_CLERK         55700

           50 ST_MAN           36400

           60 IT_PROG          28800

           70 PR_REP           10000

DEPARTMENT_ID JOB_ID     SUM(SALARY)

------------- ---------- -----------

           80 SA_MAN           61000

           80 SA_REP          243500

           90 AD_PRES          24000

           90 AD_VP            34000

          100 FI_ACCOUNT       39600

          100 FI_MGR           12008

          110 AC_ACCOUNT        8300

          110 AC_MGR           12008

              SA_REP            7000

20 rows selected.

先是用department_id进行分组,然后再在这个分组的基础上用job_id分组,划分更小的组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息