第 13 章 分组数据
13.1 数据分组
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算
13.2 创建分组
输入: SELECT COUNT(*) FROM global_grants;
输出:
+----------+
| COUNT(*) |
+----------+
| 38 |
+----------+
分析: 输出所有行数
输入: SELECT USER,COUNT(*) FROM global_grants GROUP BY USER;
输出:
+------------------+----------+
| USER | COUNT(*) |
+------------------+----------+
| mysql.infoschema | 1 |
| mysql.session | 7 |
| mysql.sys | 1 |
| root | 29 |
+------------------+----------+
分析: 通过 GROUP BY 分组的形式查询,对 USER 列的每个值计算一次而不是整个表
注意: 1. GROUP BY 子句可以包含任意数目的列2. 如果在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总3. GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)4. 除聚集计算语句外,SELECT 语句中的每个列都必须在 GROUP BY 子句中给出5. 如果分组列中有 NULL 值,则 NULL 将作为一个分组返回6. GROUP BY 子句必须在 WHERE 子句之后, ORDER BY 子句前
13.3 过滤分组
注意: WHERE 过滤行, HAVING 过滤分组
输入: SELECT USER,COUNT(*) FROM global_grants GROUP BY USER HAVING COUNT(*) >= 7;
输出:
+---------------+----------+
| USER | COUNT(*) |
+---------------+----------+
| mysql.session | 7 |
| root | 29 |
+---------------+----------+
分析: HAVING 支持 WHERE 所有操作符,上面例子过滤 >= 7 的行数
13.4 SELECT 子句顺序
SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT