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中,能够将数据集进行多次分组





版权声明:本文为博主原创文章,未经博主允许不得转载。

SQLiteSpy软件学习sql语句Group by的各种用法。

SQLiteSpy 下载软件的下载安装步骤不再冗述,百度搜索一下很多下载链接。 1、新建一个数据库: File->New Database,起名为SqlLearning。如下图: 2、sql...

SQL学习(7)分组查询group by

1.       group by 这个都不知道的话就不用向下看了 多说一句,select后面的没有使用聚合函数的列必须出现在group by 后面。这个是新人常犯的错误。 2.       g...

sql学习(6)——Mysql数据库where,group by,having

首先关于mysql中select语句的顺序:select * from tablename where * group by * having * oder by * limit*。 用表:clh_t...

Oracle中SQL语句学习五(统计分组语句group by和having)

在应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句、分组函数、having子句共同实现的。其中group by子句用于...
  • icanlove
  • icanlove
  • 2014年08月26日 16:23
  • 13813

SQL 数据库 学习 027 查询-10 group by --- 以某字段分组

我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express 本篇博客里面使用了 scott 库,如何你现在还没有添加这个库到你的服...

sql group by 学习

group by 顾名思义就是根据一定的规则进行分组,所谓分组就是将一个数据及划分成若干个小区域,然后针对这若干个小区域进行数据处理 基本语法如下: select col1,col2,sum(co...

黑马程序员之SQL 学习笔记:SQL中group by 和having的使用

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。 --它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 --...

SQL中GROUP BY的用法

  • 2014年09月26日 20:06
  • 433KB
  • 下载

SQL中Group By的使用 【转】

1、概述2、原始表3、简单Group By4、Group By 和 Order By5、Group By中Select指定的字段限制6、Group By All7、Group By...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL学习--group by
举报原因:
原因补充:

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