美文网首页
分组查询

分组查询

作者: 杜大个 | 来源:发表于2018-09-06 09:06 被阅读0次

本节课我们会涉及到SELECT下的两个字句,分别是GROUP BY 以及 HAVING

上一节我们学习了聚合函数,实现了对数据表里面的数据进行计算和、平均值、最大值、最小值、统计总数等。

这几课我们来学习如何将数据按照分组的方式来返回某一类的数据的统计:

groub by 分组的含义

  • 将查询结果按照1个或多个字段进行分组,字段值相同的为一组
  • 可用于单个字段分组,也可用于多个字段分组
  • group by 单独使用的意义不大

通过示例来观察如何实现分组的功能

group by + 集合函数

通过的聚合函数,我们既然可以统计出每个分组的某字段的值的集合,也可以通过集合函数来对这个值的集合做一些操作

SELECT COUNT(*) AS totalnum,age from customers group by age;

DeepinScrot-4812

SELECT count(gender),gender FROM studentinfo GROUP BY gender;

SELECT avg(age),gender FROM studentinfo GROUP BY gender;

group by + group_concat()

  • group_concat(字段名)可以作为一个输出字段来使用,
  • 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

SELECT gender,group_concat(student_name) FROM studentinfo GROUP BY gender;

DeepinScrot-3801

group by + group_concat() + 集合函数

SELECT avg(age),gender,group_concat(student_name) FROM studentinfo GROUP BY gender;

DeepinScrot-3801

group by + with rollup

with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和

SELECT gender,count(*) FROM studentinfo GROUP BY gender with rollup;

DeepinScrot-0815

SELECT gender,group_concat(age) FROM studentinfo GROUP BY gender with rollup;

DeepinScrot-0907

在我们使用GROUP BY 时需要知道的一些规矩:

  • GROUP BY子句可以包含任意数目的列(可以根据多个列进行分组)。这使得能对分组进行嵌套,为数据分组提供更细致的控制。如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的有列都起计算(所以不能从个别的列取回数据)。

  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。

  • 除聚集计算语句外, SELECT语句中的每个列都必须在GROUP BY子句中给出。

  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

  • GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前

如何过滤分组???

MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个相同地区以上的用户。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤

HAVING

HAVING子句。 HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。

  • having 条件表达式:用来分组查询后指定一些条件来输出查询结果
  • having作用和where类似,但having只能用于group by

SELECT COUNT(),age,adress FROM customers GROUP BY age,adress HAVING COUNT() >= 2;

SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2;

SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2 and adress LIKE '%搜索关键字%';

HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

SELECT COUNT(),age,adress FROM customers WHERE adress LIKE '北%' GROUP BY age,adress HAVING COUNT() >= 2;

DeepinScrot-5143

分组和排序

SELECT COUNT(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age DESC; ;

DeepinScrot-5707

SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2 ORDER BY age ASC;

分组和排序、限定查询

SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2;

SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2,2;

DeepinScrot-5831

总结:目前我们所学的所有SELECT字句的查询语句的执行顺序如下:

02000 0111

相关文章

  • Mysql笔记之分组函数和分组查询

    1、分组函数 2、分组查询 3、分组查询案例

  • java基础-day31-数据库2.0

    7.7 分组查询 7.8 分组过滤查询 7.9 限定查询 7.10 基本查询总结 7.11 子查询 7.11.1 ...

  • MySQL——分组函数、distinct、分组查询、连接查询、子

    MySQL——分组函数、distinct、分组查询、连接查询、子查询 一、分组函数(聚合函数)1、 会自动忽略空值...

  • SQL进阶部分一

    分组查询 什么是分组查询 ​ 将查询结果按照1个或多个字段进行分组,字段值相同的为一组 分组使用 ​ ...

  • SQL-分组查询

    分组查询 语法: 注意:查询列表必须特殊,要求是分组函数和group by后出现的字段 特点: 分组查询中的筛选条...

  • 数据库分组查询(Group by)

    分组查询命令 -- group by-- having **分组查询中,select后只能跟分组的字段和聚合函数 ...

  • 分组筛选的异同

    语法 特点: GROUP BY后跟分组函数查询的字段 分组可以按单个字段也可以多个字段 案例 分组前查询 查询班级...

  • 数据库高级查询2

    分组查询(group by) 分组查询: 1.查询每个部门的最高工资 select deptno,max(sal)...

  • 数据库基础06分组、关联查询

    分组 分组查询 示例:按部门编号进行分组,查询出各个部门的平均工资 HAVING 句子 HAVING子句用来对分组...

  • 分组查询

    本节课我们会涉及到SELECT下的两个字句,分别是GROUP BY 以及 HAVING 上一节我们学习了聚合函数,...

网友评论

      本文标题:分组查询

      本文链接:https://www.haomeiwen.com/subject/hietgftx.html