MySQL分组查询:取最大值与会话变量方法
需积分: 10 161 浏览量
更新于2024-09-04
收藏 3KB TXT 举报
"这篇文档是关于MySQL中的分组查询,特别是如何进行不常见的查询操作,如按字段分组并选择特定记录,以及利用会话变量进行查询。文档中通过创建一个名为tb的测试表和插入数据来举例说明,表结构包含id、name、val和memo四个字段,并填充了相关的示例数据。特别提到了按name分组取val最大值所在行的方法。"
在MySQL中,分组查询是数据分析和报表生成的关键操作。它允许我们将数据根据一个或多个字段进行聚合,以便计算每个组的汇总值或者选择每个组的特定记录。在提供的描述中,我们看到了如何创建一个简单的表`tb`,并插入了9条记录,记录了不同name(a和b)对应的val(数值)和memo(备注)。
分组查询的基础语句是`GROUP BY`,例如要按`name`字段分组并查看每个组的平均`val`,可以使用以下SQL:
```sql
SELECT name, AVG(val) as avg_val
FROM tb
GROUP BY name;
```
这个查询将返回每个name组的平均val值。
文档中提到的“无条件取前N条”或“后N条”记录,这通常涉及到`LIMIT`和`OFFSET`子句。比如,如果我们想获取每个name组中val最高的前两条记录,可以使用以下复杂查询:
```sql
SELECT t1.*
FROM (
SELECT name, val, ROW_NUMBER() OVER(PARTITION BY name ORDER BY val DESC) as row_num
FROM tb
) t1
WHERE t1.row_num <= 2;
```
这里使用窗口函数`ROW_NUMBER()`对每个name组内的记录进行排序,并分配行号,然后只选取行号小于等于2的记录。
会话变量在查询中的应用可以提高灵活性,特别是在处理复杂逻辑时。例如,我们可以设置一个会话变量来保存每组的最大val,然后用它来筛选记录:
```sql
SET @max_val = NULL;
SELECT *
FROM (
SELECT name, val,
IF(@max_val IS NULL OR val > @max_val, @max_val := val, @max_val) as max_in_group,
@row_num := IF(@max_val = val, @row_num, @row_num + 1) as row_num
FROM tb, (SELECT @max_val := NULL, @row_num := 0) r
GROUP BY name, val
ORDER BY name, val DESC
) t
WHERE t.row_num = 1;
```
这个查询首先找到每个name组的max_val,然后用`IF`和`@row_num`来跟踪每组中最大val出现的次数,最终选取每个组中val最大的那条记录。
以上就是关于MySQL分组查询和会话变量使用的一些核心知识点,它们在实际的数据分析和处理中有着广泛的应用。通过熟练掌握这些技巧,可以更有效地从数据库中提取所需信息。
2024-04-22 上传
2008-09-18 上传
105 浏览量
139 浏览量
2020-08-05 上传
2020-06-03 上传
5201 浏览量
147 浏览量
146 浏览量
Lewis_刘
- 粉丝: 3
- 资源: 5
最新资源
- 由小波滤波器系数求尺度函数和小波函数
- Visual C++ MFC 简明教程
- C51单片机程序实例大全
- Hardware Design Guidelines for TMS320F28xx .pdf
- C2000_系统设计(硬件部分)
- CISCO ACS 安装详细手册(中文版)
- ICMP 的说明与解释
- VLAN总结(对VLAN作了详细说明与介绍,其中包括对VTP的介绍)
- shell编程指南(有作者对重要部分进行高亮显示)
- EAserver程序员指南
- 《c#手册》非常不错
- C#语法攻略(详细介绍了.NET语法知识)
- CCNA路由链路负载均衡,浮动静态路由
- SQL循序渐进(看完不会你可以砍我)教程
- UML 互动图的教程PPT,63页,很详细
- Java+Servlet+API说明文档,JAVA人的真爱