有如下数据:

一个简单的分组查询的案例

按照部门编号deptno分组,统计每个部门的平均工资。

select deptno,avg(sal) avgs
from emp
group by deptno;

结果如下:

group by关键字语法详解

group by是用于分组查询的关键字,一般是配合sum(),avg(),count(),max(),min()聚合函数使用的。也就是说SQL语句中只要有group by,那么在select后面的展示字段中一般会有聚合函数(5个聚合函数)中的一个或多个函数出现。观察上图用表中的字段A进行分组后,一般就需要对表中的其它字段,使用聚合函数,这样意义更大,而不是还对字段A使用聚合函数。

当SQL语句中使用了group by后,在select后面一定有一个字段使用了聚合函数(5个聚合函数)。但是除了这个聚合函数,select后面还可以添加其他什么字段吗?

答案肯定是可以的!但是该字段有一定的限制,并不是什么字段都可以。也就是说,当SQL语句中使用了group by关键字后,select后面除了聚合函数,就只能是group by后面出现的字段。也就是图中的字段A,select后面只能存在group by后面的字段。

分组前筛选和分组后筛选

原始表和结果集的概念

  • 原始表指的是数据库中真正存在的那个表,使用【select * from 表名】查询出来的就是原始表信息。
  • 结果集指的是在SQL语句中,添加其它任何一个限制条件,最终展示给我们表,都是结果集。添加不同的限制条件,查询出来的结果集也是不同的。
  • 原始表只有一个,结果集却是各种各样的。

where筛选和having筛选选用

  • 只要是需求中,涉及到聚合函数做条件的情况,一定是分组后的筛选
  • 能用分组前筛选的,就优先考虑分组前的筛选。(考虑到性能问题)

分组前筛选

  • 查询姓名中包含S字符的,每个部门的工资之和。
select deptno,sum(sal)
from emp
where ename like '%S%'
group by deptno;

  • 查询工资大于2000的,不同部门的平均工资。
select deptno,avg(sal)
from emp
where sal > 2000
group by deptno;

分组后筛选

  • 查询部门员工个数大于3的部门编号和员工个数。
select deptno,count(*)
from emp
group by deptno
haveing count(*) > 3;

  • 查询每个部门最高工资大于3000的部门编号和最高工资。
select deptno,max(sal) maxs
from emp
group by deptno
having maxs count(*) > 3;

分组前筛选和分组后筛选合用

  • 查询1981年入职的,不同部门间工资的平均值大于2000的部门编号和平均值。
select deptno,avg(sal) avgs
from emp
where year(hiredate) = '1981'
group by deptno
having avgs > 2000;

分组查询(按函数分组)

  • 按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>3的有哪些?
select length(ename) len, count(*) counts
from emp
group by len
having counts > 3;

分组查询(按多个字段分组)

  • 查询每个部门每个工种的员工的平均工资。
select deptno,jop,avg(sal) avgs
from emp
group by deptno,job;

group by和order by

  • 查询每个部门的员工的平均工资,按照平均工资降序。
select deptno,jop,avg(sal) avgs
from emp
group by deptno
order by avgs desc;

  • 查询每个部门的员工的平均工资,按照平均工资升序。
select deptno,jop,avg(sal) avgs
from emp
group by deptno
order by avgs asc;

总结

  • 分组函数做条件,肯定是放在having子句中。
  • 能用分组前筛选的,就优先考虑使用分组前筛选。(where筛选)
  • group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),还支持函数分组(用的较少)。

group by分组查询的更多相关文章

  1. 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...

  2. mysql group by分组查询后 查询个数

    mysql group by分组查询后 查询个数2个方法随便你选 <pre>select count(distinct colA) from table1;</pre>< ...

  3. SQL group by分组查询(转)

    本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...

  4. Group by 分组查询 实战

    实战经历,由于本人在共享单车上班,我们的单车管理模块,可以根据单车号查询单车,但是单车号没有设置unique(独一无二约束),说以这就增加了单车号可能重复的风险,但是一般情况下,单车号是不会重复的,因 ...

  5. mysql group by分组查询

    分组的SQL语句有2个: group by 和分组聚合函数实现 partition by (oracle和postgreSQL中的语句)功能 group by + having 组合赛选数据 注意:h ...

  6. SQL group by分组查询

    本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...

  7. ysql常用sql语句(12)- group by 分组查询

    测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...

  8. oracle Group by 分组查询后,分页

    ------------恢复内容开始------------ 1.分页查询 select count(*) times,title from menulog group by title order ...

  9. mysql group by分组查询错误修改

    select @@global.sql_mode;set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR ...

随机推荐

  1. java 日期字符串互相转换

    一.把日期转换成字符串 //获取当前时间  Date date = new Date();   //打印date数据类型  System.out.println(date.getClass().get ...

  2. Ubuntu 20.04 安装kodi播放器

    打开终端,执行命令在线安装 sudo apt-get install software-properties-common sudo add-apt-repository ppa:team-xbmc/ ...

  3. Flask db init 抛出KeyError: 'migrate’这个问题

    问题 目录下执行flask db init 结果 抛出KeyError: 'migrate'这个问题 ## 原因 初始化Migrate对象时没有加db 解决: appfactory.py import ...

  4. 每日三道面试题,通往自由的道路14——MySQL

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天我们是不是聊到了锁,而你提到了MySQL? ...

  5. 记录一次HSDB的使用遇到的问题 No such type.

    univese Unrecognized command. Try help... hsdb> universe Heap Parameters: Gen 0: eden [0x00000000 ...

  6. SpringBoot自动装配-源码分析

    1. 简介 通过源码探究SpringBoot的自动装配功能. 2. 核心代码 2.1 启动类 我们都知道SpringBoot项目创建好后,会自动生成一个当前模块的启动类.如下: import org. ...

  7. jadx的使用

    使用jadx之前必须安装配置java环境才能正常打开运行 https://www.cnblogs.com/yhoil/p/14808648.html 一.前言 今天介绍一个非常好用的反编译的工具 ja ...

  8. .user.ini和.htaccess

    .user.ini .user.ini的使用条件 (1)nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法 php配置访问级别 不同的php配置项根据其访问级别具有不 ...

  9. Android达到什么水平才能顺利拿到 20k 无压力?

    程序员分很多种类和等级,如果要提高达到20k的概率,有两个条件如果满足的话,则很容易达到: 1.一线城市:北上广深杭 2.互联网行业 如果你非得抬杠,我要在三线城市,做外包要赚20k的话,很难,我自己 ...

  10. java 注释,关键字和标识符

    注释 注释是为了防止当写代码的时间过久了之后,忘记了这行代码的意思或者是在一个大型的项目里面,不可能每一个模块的功能你都记得,所以需要一个注释来帮助记忆. 注释不会被执行 平时写代码一定要养成写注释的 ...