本节内容总结自《High Performance MySQL》
- DISTINCT:DISTINCT是用来去重的。DISTINCT支持单列,多列的去重方式。单列去重的方式是相同的值只保留一个。多列去重是根据指定列的信息进行的,即只有所有指定的列都相同,才会被认为是相同的信息。
- GROUP BY:在一个查询语句中,GROUP BY 是在SELECT语句之前执行的。实际上GROUP BY 子句执行完会生成一个临时表(这个临时表将原表中的分组字段相同的列合并为一个列,这其中,分组字段合并为一个值,其他字段为多个值的叠加态),因此对于GROUP BY前的SELECT,如果不使用聚合函数,则最好选择分组字段否则可能出现一列有多个值的情况。之后SELECT取字段时就是从这个临时表中获取的。GROUP BY 之前可以通过WHERE 条件筛选一定的行(WHERE先执行,后通过GROUP BY生成临时表),WHERE条件中不能包含聚合函数。也可以在GROUP BY 后面通过HAVING筛选一定的组(GROUP BY 先生成临时表,后通过HAVING限制组),HAVING子句的作用是筛选满足条件的组(组即GROUP BY 生成临时表中的每一行数据),即在分组之后过滤数据,条件中经常包含聚合函数。
- 对关联查询做分组:如果需要对关联查询做分组,并且是按照查找表中的某个列进行分组,那么通常采用查找表的标识列分组的效率会比其他列高。
- 分组查询中选用非分组列:SELECT后面出现的非分组列一定是直接依赖分组列,并且在每个组内的值是唯一的。可以在服务器的SQL_MODE设置为包含ONLY_FULL_GROUP_BY来禁止这样的写法。