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