Sql 寻找第二高数逻辑解释

Sql 寻找第二高数逻辑解释,sql,database,Sql,Database,我需要一些关于使用下面的查询查找第二高值列的说明 SELECT MAX( column ) FROM table WHERE column < ( SELECT MAX( column ) FROM table ) 有人能告诉我这是怎么回事吗?按列顺序从表中选择列描述限制2 这将提供前两个,因此您需要从中解析数据。这就是查询的逻辑计算方式 T(c)=>{10,20,30,40} 最大值(c)=>40 从T中选择c,其中c{10,20,30} 从T中

我需要一些关于使用下面的查询查找第二高值列的说明

SELECT MAX( column )
  FROM table
 WHERE column < ( SELECT MAX( column )
                 FROM table )

有人能告诉我这是怎么回事吗?

按列顺序从表中选择列描述限制2


这将提供前两个,因此您需要从中解析数据。

这就是查询的逻辑计算方式

T(c)=>{10,20,30,40}

最大值(c)=>40

从T中选择c,其中c<40=>{10,20,30}


从T中选择MAX(c),其中c<40=>30

这里有两个查询:
选择最大值(列)
从表中

这将查找列中最大的行并返回它

选择最大值(列)
从桌子上

WHERE column我看到您理解这个查询,是吗

SELECT MAX( column )
FROM table
它只返回存储在此表中的最大值。因此,在您的示例中是
40

现在考虑一下这个问题,简化了一个问题:

SELECT MAX( column )
FROM table
WHERE column < 40
选择最大值(列)
从桌子上
其中列<40
我认为你理解这一点也没有任何问题。它仍然是与上面相同的查询,但只考虑
值小于
40
的行。如何准确地将其存储在数据库中(如临时表等)是DBMS的问题,您无需为此烦恼


请具体说明您不理解并希望我们澄清的内容。

内部查询从表中选择顶部值。RDBMS足够聪明,可以将该值保存在内存中,然后再次点击表格,从表格中查找最大值,但这次它查找的是小于原始最大值的最大值


没有比这更多的了。我没有编写RDBMS,所以我不知道它到底是如何运行的。

我知道还有很多其他方法可以找到第二高的数字,但我需要解释我的上述查询…从表中选择最大值(列)内部查询返回40我也知道这一点,先生,正如我在问题中所述…但是外部查询选择最大值(列)还回40总是对吗?表示外部查询以这种方式工作右->从表中选择最大值(列),其中列<40,总是40,其中10<40,40,其中20<40和40,其中30<40…?WHERE子句是查询的一部分;这不是一个单独的声明。SQL没有语句;它是一种声明性语言。MAX是在WHERE减少了行集之后确定的。
从表中选择MAX(column),其中column<40
首先返回满足
WHERE
子句的所有行(因此在本例中,值为
10、20、30
的行,然后从剩余的所有行中查找
MAX
值(所以这里
30
是这三个中的最大值)它是如何排除的..你不认为这就是它字面上的计算方式吗…从表中选择最大值(列)内部查询返回40…但外部查询选择最大值(列)也返回40始终正确?意味着外部查询以这种方式工作右->选择最大值(列)从表WHERE column<40,总是40 WHERE 10<40,40 WHERE 20<40和40 WHERE 30<40…?它是如何得到预期的评估的?告诉我一件事,对于使用WHERE条件激发的每一列,外部查询中的最大值(列)是多少。我不明白这个问题。在集合{10,20,30,40}的情况下,子选择将返回40(where子句中的select)。然后,主select将受子select的结果限制,因此,不带where的主select将返回{10,20,30,40}。然后对其求值,以排除任何小于max(40)的值,因此该集将变为{10,20,30},并且从该集中选择max。现在,如果您的集是{10,20,30,40,40}您的查询结果仍然是30。从技术上讲,这不是第二高,因为第一高是平局。请看,我得到了您试图解释的内容,但在外部查询中,我们选择了max(列)不只是列,以获得正确的数字集,所以它应该像40,其中10<40为第一列,40,其中20<40为第二列,40,其中30<40为第三列,对吗?“我们选择了最大值(列)而不仅仅是列,以获得正确的数字集”的类型。选择最大值(列)由于where子句的存在,要得到一组数字已经在一个缩减集上运行。因此,不是从{10,20,30,40}得到一个max,而是从{10,20,30}得到一个max因为10我这里唯一的注释是底部的第二个select应该在集合中包含40。它被返回,然后被where before max计算排除。不,它不应该,T中小于40的元素c集合不包含40。为什么这个查询是由select c from T T形成的,其中c<40=>{10,20,30}…不,我们返回的是select…我不确定我是否理解你的问题,但我怀疑有些混乱取决于你不是在集合中思考。相反,你是在试图掌握循环和返回语句的情况。T中小于40的元素c是{10,20,30}。
SELECT MAX( column )
FROM table
WHERE column < 40