zoukankan      html  css  js  c++  java
  • MySQL之GROUP BY用法误解

    1.说明

       “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。(只是简单说明这个语句的作用,不是这篇文章的重点)

    2.使用举例:

      2.1表结构类型

    mysql> desc actor;
    +-------------+----------------------+------+-----+-------------------+-----------------------------+
    | Field       | Type                 | Null | Key | Default           | Extra                       |
    +-------------+----------------------+------+-----+-------------------+-----------------------------+
    | actor_id    | smallint(5) unsigned | NO   | PRI | NULL              | auto_increment              |
    | first_name  | varchar(45)          | NO   |     | NULL              |                             |
    | last_name   | varchar(45)          | NO   | MUL | NULL              |                             |
    | last_update | timestamp            | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    +-------------+----------------------+------+-----+-------------------+-----------------------------+
    4 rows in set (0.00 sec)
    

      2.2使用:

      

    mysql> select first_name,last_name  from actor group by first_name,last_name;
    +-------------+--------------+
    | first_name  | last_name    |
    +-------------+--------------+
    | ADAM        | GRANT        |
    | ADAM        | HOPPER       |
    | AL          | GARLAND      |
    | ALAN        | DREYFUSS     |
    | ALBERT      | JOHANSSON    |
    | ALBERT      | NOLTE        |
    | ALEC        | WAYNE        |
    | ANGELA      | HUDSON       |
    | ANGELA      | WITHERSPOON  |
    | ANGELINA    | ASTAIRE      |
    | ANNE        | CRONYN       |
    | AUDREY      | BAILEY       |
    | AUDREY      | OLIVIER      |
    | BELA        | WALKEN       |
    | BEN         | HARRIS       |
    | BEN         | WILLIS       |
    | BETTE       | NICHOLSON    |
    | BOB         | FAWCETT      |
    | BURT        | DUKAKIS      |
    

      3.其他

      我们知道在很早之前接触到GROUP BY 的时候就被告知,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。正如上面的使用方法那样,那我能不能在select后面的字段显示出来而不包括在GROUP BY 字段里。看看下面的SQL是否会正常执行呢?

    mysql> select first_name,last_name  from actor group by actor_id;
    

      结果可能出乎你的意料之外,来看看执行结果:

    mysql> select first_name,last_name  from actor group by actor_id;
    +-------------+--------------+
    | first_name  | last_name    |
    +-------------+--------------+
    | PENELOPE    | GUINESS      |
    | NICK        | WAHLBERG     |
    | ED          | CHASE        |
    | JENNIFER    | DAVIS        |
    | JOHNNY      | LOLLOBRIGIDA |
    | BETTE       | NICHOLSON    |
    | GRACE       | MOSTEL       |
    | MATTHEW     | JOHANSSON    |
    | JOE         | SWANK        |
    | CHRISTIAN   | GABLE        |
    | ZERO        | CAGE         |
    | KARL        | BERRY        |
    | UMA         | WOOD         |
    | VIVIEN      | BERGEN       |
    | CUBA        | OLIVIER      |
    | FRED        | COSTNER      |
    | HELEN       | VOIGHT       |
    | DAN         | TORN         |
    | BOB         | FAWCETT      |
    | LUCILLE     | TRACY        |
    | KIRSTEN     | PALTROW      |
    | ELVIS       | MARX         |
    

    4.分析

         这是什么情况?不是说如果select指定的字段要么出现在GROUP BY里面要么出现在聚合函数里面呢?我上面的SQL 没有在GROUP BY里面指定相应的字段也是可以正常执行的啊!!!原来我查过MYSQL的官方文档才知道:如果select指定的字段没有在GROUP BY 里面,那么一定要保证的是他们这些字段都直接依赖与GROUP BY后面的字段。比如first_name,last_name都依赖主键actor_id,所以上面的结果是OK的。

    5.扩展

      需要指出的在MYSQL中,当无法使用索引的时候,GROUP BY 使用两种策略来完成:使用临时表或者文件排序来分组。(其他。。。。。。。。)

  • 相关阅读:
    符号表实现(Symbol Table Implementations)
    揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)
    玩转指针(Playing with Pointers)
    什么是空间复杂度(What is actually Space Complexity ?)
    论困于记忆之物(随笔感言)
    【未有之有】洛依文明相关
    告别
    【未有之有】洛森修炼体系整理
    【未有之有】洛森十三圣人
    复苏
  • 原文地址:https://www.cnblogs.com/zhangminghui/p/4415881.html
Copyright © 2011-2022 走看看