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 使用两种策略来完成:使用临时表或者文件排序来分组。(其他。。。。。。。。)

posted on 2015-04-10 22:49  叼烟斗的纤夫  阅读(1200)  评论(0编辑  收藏  举报