sql查询当前值到最大值中间的数据

方法一

复制代码
select * from cmp where id >1 and id <= max(id)

很明显这样做是错的

会报错

invalid use of group function

原因是 max是聚合函数, where条件中不能使用聚合函数

为什么呢

这是一个很有意思的问题,仔细地想一下其实很有道理。我们知道,聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的,在筛选过程中依赖"基于已经筛选完毕的数据得出的计算结果"是一种悖论,这是行不通的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!而where子句还处于"确定"结果集的过程中,因而不能使用聚集函数。与where子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的having子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),where子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过having子句配合聚集函数来完成。

另外,对于having子句再多说一点:没有使用group by而直接使用having子句的例子是不太多见,因为如果没有group by,那么整个结果集就是一个分组,但是这种例子也不是没有,比如当我们需要对"现有的"整个结果集进行"二次筛选"时,就会直接使用having子句了。

因此

方法就是

复制代码
select * from cmp where id > 1 
group by id 
having
  id <= max(id)

或者

复制代码
select * from cmp where id >1 and (select * from cmp where id <=max(id))
相关推荐
万事大吉CC21 分钟前
【3】深入剖析 Django 之 MTV:路径引用与资源加载机制
数据库·django·sqlite
Hical_W27 分钟前
用 Hical + MySQL 5 分钟搭建 CRUD API(C++20 协程版)
数据库·mysql·c++20
AIMath~30 分钟前
agent上下文和模型的上下文区别
数据库
与遨游于天地40 分钟前
分布式锁从Redis到Redisson的演进
数据库·redis·分布式
想唱rap1 小时前
传输层协议之UDP
java·linux·网络·c++·网络协议·mysql·udp
山峰哥2 小时前
SQL性能提升20倍的秘密:这些优化技巧让DBA都惊叹
开发语言·数据库·sql·编辑器·深度优先·宽度优先
猪脚踏浪2 小时前
mysql 用户授权
mysql
HuDie3402 小时前
prompt模版
数据库·prompt
梦想画家2 小时前
PostgreSQL 图计算双雄:Apache AGE 与 pgGraphBLAS 的融合实战指南
数据库·postgresql·图算法