• group by的使用


    group  by的使用

    环境:win8.1  mysql5.7

    “group  by”就是根据“by”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

    原始表:

    eeaede6b-2e68-46a5-9a6b-5d2c28aba03c

    简单的group  by

    示例1

    select  *  from t_student  group  by  stu_subject;  

    结果

    e2a7acc7-87a9-4fb4-a470-b8735ba77a0e

    可以看出,单独地使用group  by的实际意义并不大,它只能显示出没组记录的第一条记录

    group  by和order  by

    示例2

    select  * from t_student  group  by  stu_subject  order  by  stu_id;

    结果

    a957fd40-54b2-463d-ab86-94f03762d860

    group  by + group_concat()

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

    a555e460-3907-41bd-b1f1-702ef54e5421

    group  by + 集合函数

    比如假设我们要计算出表中每人的平均分

    203d13e6-83f0-44b9-8476-b43a362cee40

    假设我们要计算出表中单科每人超过80分的数量

    a57aa5a9-880d-4cdc-affd-83695da80211

    group + having

    having:用来分组查询后指定一些条件来输出查询结果,having作用和where类似,但是having只能用在group  by场合,并且必须位于group  by之后order  by之前

    比如我们要查找表中平均分超过82分的人:

    e839fd03-a1d4-4981-9d04-990f77bd5a68

    顺便也对比一下having和where的区别

    举个例子说明:

    SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;

    SELECT user, MAX(salary) FROM users GROUP BY user WHERE MAX(salary)>10;

    第一个sql语句可以执行,但是第二个会报错

    二者作用的对象不同,where子句作用于表和视图,having作用于组。

    where在分组和聚集计算之前选取输入行(因而可以控制哪些行进入聚集计算),而having用于过滤group by的聚合,在分组和聚集之后选取分组的行。因为用聚集函数判断那些行输入给聚集运算是没有意义的,所以where不能包含聚集函数,不能使用分组项目

    HAVING子句可以引用总计函数,而WHERE子句不能引用

    where就不能用在sum之类的函数上,比如这样的错误,模仿前面吧having换成where

    a83c903b-60f8-4758-93a2-f8cac17f8864

    不要将HAVING用于应被用于WHERE子句的条目,尽管不出错,但是mysql不推荐

    stackoverflow上的一个例子:

    https://stackoverflow.com/questions/2905292/where-vs-having

    首先创建一个数据表:

    CREATE TABLE `wherehaving` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `value` int(10) unsigned NOT NULL,
     PRIMARY KEY (`id`),
     KEY `value` (`value`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    数据增加:

    INSERT INTO `wherehaving`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);

    5572396a-ec17-40e2-a575-e10f3fe2f8be

    我们通过下面两句来对比一下:

    SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
    SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
    上面这两句都是可以运行的
    SELECT `value` v FROM `table` WHERE `v`>5;
    

    Error #1054 - Unknown column 'v' in 'where clause'

    SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

    805375dc-c34a-4e97-9a40-91804d5e2dd4

    where子句要求条件是表中的列,单having子句可以使用列或者别名。这是因为where子句在选择之前过滤数据,但having子句在选择之后过滤数据

    详细地看一下

    d1835377-3d2c-4b20-87cb-583af9945641

    db34ea3d-9249-4783-b3b9-6b31c1fa63a6

    前面提到了having用于过滤group  by的聚合,也介绍了一些聚合函数,现在我们来看一下group by上常用的一些聚合函数

    group和聚合函数

    函数  作用   支持性
    sum(列名) 求和  
    max(列名) 最大值  
    min(列名) 最小值  
    avg(列名) 平均值  
    first(列名) 第一条记录 仅Access支持
    last(列名) 最后一条记录 仅Access支持
    count(列名) 统计记录数 注意和count(*)的区别

    group by + with rollup

    在最后新增一行,来记录当前列里所有记录的总和

    01f30650-089c-409c-a2a1-f04a896d92bf

    199f4bb7-b24b-4a12-b4e5-760c9fda8b59

  • 相关阅读:
    .NET 3.54.0 并行计算的支持
    温故知新ASP.NET 2.0(C#)(5) Localization(本地化,多语言)
    [翻译]asp.net 2.0中通过压缩ViewState改善性能
    C# 2.0 泛型
    温故知新ASP.NET 2.0(C#)(8) DataSourceControl(数据源控件)
    温故知新ASP.NET 2.0(C#)(1) MasterPage(母版页)
    [翻译]asp.net 2.0中页的生存周期(Lifecycle)和动态控件
    [翻译]ASP.NET AJAX之内部揭秘
    乐在其中设计模式(C#) 命令模式(Command Pattern)
    [翻译]ASP.NET AJAX调用Web Service
  • 原文地址:https://www.cnblogs.com/muhy/p/10558701.html
Copyright © 2020-2023  润新知