GROUP BY 用法

  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分组,划分更小的组。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值