SQL学习--group by

原创 2016年08月31日 13:44:27
学习环境:oracle中的模拟表,使用hr模式连接
1. group by子句:
在select列表中不是分组行数的所有项必定是group by 子句的分组特性
 
select d.DEPARTMENT_NAME,max(e.SALARY)
from EMPLOYEES e
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
group by d.DEPARTMENT_NAME;
这个是正确的

select d.DEPARTMENT_NAME,max(e.SALARY)
from EMPLOYEES e
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
group by e.DEPARTMENT_ID;
这个是错误的,因为此处select中所包含的行并没有被group所使用,此处会提示
ORA-00979: 不是 GROUP BY 表达式
00979. 00000 -  "not a GROUP BY expression"

注意一个重点:在select中不是分组函数的所有项必定全部是group by 的分组特性

select d.DEPARTMENT_ID,d.DEPARTMENT_NAME,max(e.SALARY)
from EMPLOYEES e 
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
group by d.DEPARTMENT_ID,d.DEPARTMENT_NAME;
就像这个一样,虽然d.DEPARTMENT_ID,d.DEPARTMENT_NAME这两个其实是一个意思,但是必须还是需要在group by 子句中加上这两个分组特性(PS:我记得MySQL中的group by没那么多事儿啊...)

2. group by 的having限制:

select d.DEPARTMENT_ID,d.DEPARTMENT_NAME,max(e.SALARY)
from EMPLOYEES e 
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
group by d.DEPARTMENT_ID,d.DEPARTMENT_NAME
having d.DEPARTMENT_ID=100;
注意这里:假如having子句使用了非select条目的约束,那么一样不行

select d.DEPARTMENT_ID,d.DEPARTMENT_NAME,max(e.SALARY)
from EMPLOYEES e 
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
group by d.DEPARTMENT_ID,d.DEPARTMENT_NAME
having e.DEPARTMENT_ID=100;
例如这种的,

3. group by 的多列分组特性:
就是在group by 列1,[列2],[列3]...,典型的例子就是查找学生表中各班男女的数目

select d.DEPARTMENT_NAME,j.JOB_TITLE,e.LAST_NAME
from EMPLOYEES e
join DEPARTMENTS d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
join JOBS j
on e.JOB_ID=j.JOB_ID
group by d.DEPARTMENT_NAME,j.JOB_TITLE,e.LAST_NAME
order by d.DEPARTMENT_NAME,j.JOB_TITLE;

查找每个部门中的每个职位的负责人,

4. 对于分组函数来说:只能嵌套两层,但是单行函数能够多层嵌套
(但是平常也没人会这么用:max(sum(avg(salary))):要是有人这么用,那该喂他吃药了)
分组函数:max,min,avg,sum,count等等,就是把多个值计算为一个值的函数
单行函数:例如大小写,concat,等等,对一行数据进行处理的函数
max和min函数只能作用于number,date,char,varchar2的数据类型


5. having
having与where的显而易见的区别是:
having对group by是具有依赖的,它只能被group的子句所指定,因为having在限制组之前这些行组必须存在
where不能在组中进行过滤操作
再通俗点:where过滤完了之后才能再给group by,然后group by 分组完了之后再使用having对已经分完的组进行再次过滤

看到了没?效果是一样的,根据具体场景灵活运用才对
但是在实际上的优化过程中,假如列上有索引并且该列非常适合走索引的话,还是推荐先where再分组,因为having是对所有的数据全部取出之后再进行的过滤,是会进行全表扫描的(我们对优化也要关心一下)


总结的group by使用方法:
1. 行必须具有共同的特性才能够将其分到一组
2. group注意在where语句之后,在order by 之前
3. select 列表上,假如不是分组函数的,那么必定是分组的特性,select后面跟的只要不是分组函数,那么必须出现在group by里面,这个也是许多初学者碰到错误不明白的
4. 注意where子句中不能有分组函数,例如select * from t1 where id=max(id);
    (00934"group function is not allowed here")这种碰到了直接打死
5. 在oracle中,能够将数据集进行多次分组





版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dsc1245/article/details/52384174

Having的用法

一、实例 Examine the description of the EMPLOYEES table: EMP_ID NUMBER(4) NOT NULL LAST_ NAME VARCHAR2(...
  • zl834205311
  • zl834205311
  • 2016-04-25 11:04:53
  • 1847

having字句可以让我们筛选成组后的各种数据

 having字句可以让我们筛选成组后的各种数据 having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在g...
  • dongfengkuayue
  • dongfengkuayue
  • 2016-03-23 10:33:15
  • 900

sql的分组统计与group by 日期的处理

近几天补oracle的sql知识,这块记录下sql的分组统计 1.简单的分组统计 创建STUDENT表: CREATE TABLE STUDENT( "NAME" VARCHAR2(10 BYT...
  • u010652906
  • u010652906
  • 2015-07-27 03:47:01
  • 1317

Sql distinct和group by的区别

distinct和Group by 区别:  distinct只是将重复的行从结果中出去;  group by是按指定的列分组,一般这时在select中会用到聚合函数。  distinct是把不...
  • hezudao25
  • hezudao25
  • 2017-03-02 09:50:31
  • 1566

SQL中order by 、group by 、having的用法区别

Having 这个是用在聚合函数的用法。当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算。运算完后就要用到HAVING 的用法了,就是进行判断了,例如说...
  • freshlover
  • freshlover
  • 2013-03-01 18:15:04
  • 29628

mysql必知必会——GROUP BY和HAVING

GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 select子句中的列名必须为分组列或列函数,列函数对于group by子句定义的每个组返回一个结果...
  • bingogirl
  • bingogirl
  • 2016-09-16 23:58:49
  • 21544

Sql group by 用法

 Sql group by 用法:1、记住所谓分类汇总,就是说select后边不是分类字段就是汇总的字段.分类就是和group by后边的字段一致,汇总就是有聚集函数的字段2、select 后面的在聚...
  • zyf1203
  • zyf1203
  • 2007-05-13 10:16:00
  • 7013

sql server中group by 的几种用法

Group by 是SQL Server 中常用的一种语法,语法如下:[ GROUP BY [ ALL ] group_by_expression [ ,...n ]    [ WITH { CUBE...
  • zzaihl
  • zzaihl
  • 2007-10-18 08:48:00
  • 20269

Spring Data JPA快速启动

Spring Data JPA快速启动   1概述 Spring Data JPA 是Spring Data 家族的提供的一个持久层框架,可以自动创建dao实现类和自定义查询,简化了持...
  • u013128651
  • u013128651
  • 2016-08-20 16:29:15
  • 1332

一套SQL笔试题1、查找整个职员表的所有内容。select*fromemployees2、查看雇员

一套SQL笔试题 1、查找整个职员表的所有内容。 select * from employees 2、查看雇员名字(last_name)。 select last_name from em...
  • lihe460186709
  • lihe460186709
  • 2016-11-03 19:01:45
  • 1822
收藏助手
不良信息举报
您举报文章:SQL学习--group by
举报原因:
原因补充:

(最多只允许输入30个字)