当前位置: 首页 > news >正文

第14张 GROUP BY 分组

一、分组功能介绍

        使用group by关键字通过某个字段进行分组,对分完组的数据分别 “SELECT 聚合函数”查询结果。 

1.1 语法

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
明确:可以使用GROUP BY子句将表中的数据分成若干组。WHERE一定放在FROM后面。接着是group by 和 order by,不能改变顺序。

注意:在 SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中,包含在 GROUP BY 子句中的列不必包含在SELECT 列表中因为例如

SELECT department_id, job_id, SUM(salary)

FROM employees

GROUP BY department_id;

如果employees表中有department_id为10的记录10条,但是10条中job_id为1,2,2,4,5的记录各两条。如果按照上述SQL编写查询,只是对department_id分组,那么查询结果中job_id的值应该是“1”还是“2”亦或是其他值呢?所以这是不合理的,故除了组函数之外的列都要写在group by之中。

举例:

# 在SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;# 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
SELECT AVG(salary)
FROM employees
GROUP BY department_id;

1.2 使用多个列分组

# SELECT 中出现的非组函数的字段必须声明在GROUP BY中,反之,GROUP BY中声明的字段可以不出现在SELECT中
# 分组的字段之间顺序无所谓,最终结果相同。
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;

注意:

分组的字段之间顺序无所谓,最终结果相同。

Mysql实现啊SQL规范不严谨,即使未遵守“SELECT 中出现的非组函数的字段必须声明在GROUP BY中,反之,GROUP BY中声明的字段可以不出现在SELECT中”,也可以得出结果,只是结果不对。Oracle对此就会报错。

1.3 GROUP BY中使用WITH ROLLUP

        使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。ROLLUP表示“归纳”。

举例:

SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;

注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。理解为“归纳的那条数据不适合参与排序,因为他不属于原表中的记录。”


http://www.mrgr.cn/news/70091.html

相关文章:

  • C语言数据结构与算法--简单实现队列的入队和出队
  • django入门【05】模型介绍——字段选项(二)
  • 星期-时间范围选择器 滑动选择时间 最小粒度 vue3
  • Docker--Docker是什么和对Docker的了解
  • 知名开源项目官宣停更,太痛了!
  • Java 之 XMLStreamConstants 原理及使用详细介绍
  • caozha-comment(原生PHP评论系统)
  • 支付宝域名如何加入白名单(扫码老是弹窗)
  • Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
  • 计算机的错误计算(一百五十)
  • 【基于轻量型架构的WEB开发】课程 作业4 AOP
  • CentOS网络配置
  • 第四十一章 Vue之初识VueX
  • 集群架构中Lua脚本的限制以及出现的报错
  • 【王木头】最大似然估计、最大后验估计
  • 23年广大新生赛
  • 由于 C*DN 的不做为,将暂停 C*DN 文章的发表
  • 安全见闻六:通讯协议安全问题剖析
  • DNS域名解析
  • mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了
  • JDBC-Util工具类
  • sql专题 之 三大范式
  • JAVA-顺序表ArrayList(实现ArrayList)
  • 控制台中,为什么会打印出烫烫烫?--那些中文乱码问题【more cpp-8】
  • 编程范式(Programming paradigm)
  • 多线程的创建方式以及及Thread类详解