搜集大乌龟,诌老大的sql经典
在SQL查询中,有时我们需要根据某个字段进行分组,并找出每个分组内的最大或最小值对应的完整记录。这里,我们探讨的是如何在MySQL中实现这一功能。标题中的"搜集大乌龟,诌老大的sql经典"可能指的是在CSDN MySQL论坛上的一个讨论,其中收集了各种高效的方法来解决这个问题。 我们看一个示例数据,它包含了一个名为`tb`的表,具有`name`、`val`和`memo`三个字段。`name`字段代表不同的组别,`val`字段存储各个组内的数值,而`memo`字段则存放相关的描述信息。表中的数据展示了不同`name`值下的多个`val`值。 要按`name`分组取最大`val`值所在行的数据,有以下五种常见方法: 1. **子查询关联法**: ```sql select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name; ``` 这种方法通过子查询找到每个组的最大`val`值,然后与原始表关联获取完整的行。 2. **非存在子查询法**: ```sql select a.* from tb a where not exists (select 1 from tb where name = a.name and val > a.val); ``` 如果不存在同组内比当前行`val`更大的值,那么当前行即为最大值。 3. **分组关联法**: ```sql select a.* from tb a, (select name, max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name; ``` 先对`tb`表进行分组求最大`val`,再与原表进行关联。 4. **内连接法**: ```sql select a.* from tb a inner join (select name, min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name; ``` 类似于方法3,但使用了内连接操作。 5. **子查询计数法**: ```sql select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val) order by a.name; ``` 计算同组内比当前行`val`更大的值的数量,如果数量为0,说明当前行是最大值。 同样的,对于按`name`分组取最小`val`值所在行的数据,可以采用类似的方法,只需要将子查询中的`max`替换为`min`即可。 这些方法各有优缺点,例如子查询关联法简单直观,但效率可能较低;非存在子查询法和子查询计数法在某些情况下可能更高效,但理解起来稍微复杂些。实际应用时,应根据数据量、数据库性能以及特定场景来选择合适的方法。在处理大数据集时,优化查询性能至关重要,可能需要结合索引等手段进一步提高查询速度。
剩余63页未读,继续阅读
- kandari2014-08-24还不错 很详细的 是sqlserver的
- 粉丝: 127
- 资源: 19
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助