首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 9.2.12 用GROUP BY关键字分组查询 在MySQL中,`GROUP BY`语句是一个强大的工具,它允许我们将查询结果集按照一个或多个列进行分组,并对每个分组执行聚合函数(如`SUM()`, `AVG()`, `MAX()`, `MIN()`, `COUNT()`等),从而实现对数据的汇总分析。这一功能在数据报表生成、统计分析、业务趋势预测等方面具有广泛应用。本章将深入讲解`GROUP BY`的使用方法、注意事项以及高级技巧。 #### 9.2.12.1 GROUP BY基础语法 `GROUP BY`语句的基本语法结构如下: ```sql SELECT column_name(s), AGGREGATE_FUNCTION(column_name) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s); ``` - `SELECT`子句中可以包含聚合函数和非聚合列。非聚合列必须出现在`GROUP BY`子句中。 - `AGGREGATE_FUNCTION`是SQL中的聚合函数,用于对分组后的数据进行计算。 - `WHERE`子句(可选)用于在分组前过滤记录。 - `GROUP BY`子句指定了用于分组的列。 - `ORDER BY`子句(可选)用于对分组后的结果进行排序。 #### 9.2.12.2 分组查询示例 假设我们有一个名为`sales`的表,记录了不同产品的销售额,表结构如下: ``` +------------+---------+-------+ | product_id | year | sales | +------------+---------+-------+ | 1 | 2020 | 1000 | | 2 | 2020 | 1500 | | 1 | 2021 | 1200 | | 2 | 2021 | 1800 | | 3 | 2020 | 800 | +------------+---------+-------+ ``` **示例1:按年份分组计算每年的总销售额** ```sql SELECT year, SUM(sales) AS total_sales FROM sales GROUP BY year ORDER BY year; ``` 此查询将返回每个年份的总销售额。 **示例2:按产品ID和年份分组计算每个产品的年销售额** ```sql SELECT product_id, year, SUM(sales) AS annual_sales FROM sales GROUP BY product_id, year ORDER BY product_id, year; ``` 此查询进一步细分,展示了每个产品每年的销售额。 #### 9.2.12.3 注意事项 1. **非聚合列必须出现在GROUP BY中**:如果SELECT语句中包含了非聚合列,那么这些列必须出现在GROUP BY子句中,否则会导致SQL错误。 2. **GROUP BY与HAVING的区别**:`HAVING`子句用于对分组后的结果进行过滤,而`WHERE`子句在分组前过滤记录。因此,当需要基于聚合函数的结果进行过滤时,应使用`HAVING`。 ```sql SELECT year, SUM(sales) AS total_sales FROM sales GROUP BY year HAVING SUM(sales) > 1000 ORDER BY year; ``` 3. **性能考虑**:在使用`GROUP BY`时,尤其是涉及大量数据的表时,应注意查询性能。合理的索引可以显著提高查询效率。 4. **NULL值的处理**:在分组时,MySQL会将所有NULL值视为相同的值进行分组。 #### 9.2.12.4 高级技巧 **1. 使用ROLLUP进行多级汇总** `ROLLUP`是`GROUP BY`的一个扩展,它可以在分组的基础上自动进行多级汇总。 ```sql SELECT year, product_id, SUM(sales) AS total_sales FROM sales GROUP BY ROLLUP(year, product_id); ``` 这将首先按`year`和`product_id`分组,然后仅按`year`分组,最后汇总所有记录。 **2. 使用CUBE进行全组合分组** `CUBE`比`ROLLUP`更灵活,它可以生成所有可能的分组组合。 ```sql SELECT year, product_id, SUM(sales) AS total_sales FROM sales GROUP BY CUBE(year, product_id); ``` 这将生成包括`year`、`product_id`、`(year, product_id)`、`()`(即所有记录的总和)在内的所有分组组合。 **3. 分组排序与LIMIT结合使用** 有时,我们可能只对分组后的前几名感兴趣,这时可以将`GROUP BY`与`ORDER BY`和`LIMIT`结合使用。 ```sql SELECT product_id, SUM(sales) AS total_sales FROM sales GROUP BY product_id ORDER BY total_sales DESC LIMIT 3; ``` 这将返回销售额最高的三个产品的总销售额。 #### 9.2.12.5 结论 `GROUP BY`是SQL中一个非常强大的功能,它允许我们根据一个或多个列对查询结果进行分组,并对每个分组执行聚合操作。通过合理使用`GROUP BY`,我们可以轻松实现数据的汇总分析,为业务决策提供有力支持。然而,在使用时也需要注意其语法规则、性能影响以及与其他SQL语句(如`HAVING`、`ORDER BY`、`LIMIT`)的配合使用,以充分发挥其潜力。希望本章内容能帮助你更好地理解和应用`GROUP BY`语句。
上一篇:
9.2.11 用ORDER BY关键字对查询结果进行排序
下一篇:
9.2.13 用LIMIT限制查询结果的数量
该分类下的相关小册推荐:
MySQL 实战 45 讲
MySQL从入门到精通(二)
MySQL从入门到精通(五)
MySQL必会核心问题
MySQL8.0入门与实践
MySQL从入门到精通(四)
细说MySQL(零基础到高级应用)
MySQL从入门到精通(一)
SQL零基础到熟练应用(增删改查)