SQL中的最大值是多少?
我只是被绊倒了SQL中的最大值是多少?,sql,jooq,Sql,Jooq,我只是被绊倒了 MAX(DISTINCT x)与仅MAX(x)有什么不同?如果我没有错,就没有区别了 列 ID 1 2 2 3 3 4 5 5 两个quire的输出相同5 MAX(DISTINCT x) // ID = 1,2,2,3,3,4,5,5 // DISTINCT = 1,2,3,4,5 // MAX = 5 // 1 row 以及 MAX(x) // ID = 1,2,2,3,3,4,5,5 // MAX = 5 // 1 row 定义了maxDistinct和minDi
MAX(DISTINCT x)
与仅MAX(x)
有什么不同?如果我没有错,就没有区别了
列
ID
1
2
2
3
3
4
5
5
两个quire的输出相同5
MAX(DISTINCT x)
// ID = 1,2,2,3,3,4,5,5
// DISTINCT = 1,2,3,4,5
// MAX = 5
// 1 row
以及
MAX(x)
// ID = 1,2,2,3,3,4,5,5
// MAX = 5
// 1 row
定义了
maxDistinct
和minDistinct
,以保持与其他聚合函数的一致性,其中具有distinct选项实际上会产生差异(例如,countDistinct
,sumDistinct
)
由于数据集不同值之间计算的最大值(或最小值)在数学上与同一集合的简单最大值(或最小值)相等,因此这些函数本质上是冗余的 理论上,DISTINCT x确保每个元素都不同于某个集合。“最大”操作符从集合中选择最高值。在纯SQL中,两者之间应该没有区别。简而言之,没有区别。对于MySQL,它甚至声明: 返回expr的最大值。MAX()可以接受字符串参数; 在这种情况下,它返回最大字符串值。见第8.5.3节, “MySQL如何使用索引”。DISTINCT关键字可用于查找 但是,expr的不同值的最大值会产生 与省略DISTINCT相同的结果
之所以可能,是因为要保持与其他平台的兼容性。在内部,不会有任何区别-MySQL将忽略
DISTINCT
的影响。它不会尝试对一组行执行某些操作(即首先生成不同的集合)。对于索引列,它将是选择优化掉的表
(从而从索引中读取一个值,而不是一个表),用于非索引-完全扫描。我想它只是为了与其他聚合保持一致,不同的和非不同的聚合可以产生不同的值。@Damien\u不相信者:+1。我想这可以在SQL级别上解释这一点。使您的BNF保持简单。但是为什么人们要将它包含在他们手工编码的持久性库中(添加它是一项额外的工作)。@Thilo:关于异常的推理实际上比盲目地遵循BNF要复杂得多。。。不过,这是一个很好的发现;-)