“select max”和“select .. where column = max”之间有什么区别?

时间:2009-09-11 08:30:30

标签: sql mysql

我有两个问题:

SELECT id, max(index) from table;

SELECT id, index from table where index=(select max(index) from table);

两者之间有什么区别吗?

我在MySQL Query Browser中运行代码,发现结果是一样的。但我觉得应该有所不同。如果有差异,介意附加一个简单的场景?

修改:index 唯一。

编辑:您可能会说我的第一个查询丢失了group by;但它实际上是在mysql中工作。我只是想知道两者之间的差异,而不是第一次查询与group by和第二次查询之间的差异。

4 个答案:

答案 0 :(得分:1)

第一个应返回所有表记录,每个表记录具有相同的max(index)值。

id_1    100
id_2    100
id_3    100

第二个应该只返回一个具有最大index值的记录(假设您的index字段在此表中是唯一的)。如果不是,那么结果可能确实相同。

id_3    100

ADDED:对于[index]不唯一的情况:

  • 第一个查询将返回所有表行,对于每两个字段,[id]和[index]的相同最大值。
  • 第二个查询将返回所有具有相同最大[index]值的表行。此记录子集将小于或等于ALL记录子集。

答案 1 :(得分:0)

我不是MySQL专家(见上文)。但是,我对this的读取是,如果最大索引是唯一的,那么两个查询都将返回相同的唯一ID和索引。但是,如果最大索引显示多行,则第一个查询将返回最大索引和一个不确定ID。第二个查询将返回与max index一样多的行,每个id出现在一行中。

编辑:在阅读了APC的答案后,删除了部分答案,并意识到我写的不正确。

答案 2 :(得分:0)

像Ruffles一样,我不是MySQL的专家,所以当没有明确的GROUP BY使用聚合函数时,我不理解它的行为。 NewInTown的例子在我看来很奇怪。

但我绝对希望在第一个查询中使用GROUP BY来生成与第二个查询不同的结果集。当然它确实在甲骨文中。

SQL> select pk, max(idx)
  2  from whatever
  3  group by pk
  4  /

        PK   MAX(IDX)
---------- ----------
         1         10
         2         50
         3        100

SQL> select pk, idx
  2  from whatever
  3  where idx in ( select max(idx) from whatever)
  4  /

        PK        IDX
---------- ----------
         3        100

SQL>

结果相同的唯一时间是所有记录共享IDX的相同值:

SQL> select pk, max(idx)
  2  from whatever
  3  group by pk
  4  /

        PK   MAX(IDX)
---------- ----------
         1        100
         2        100
         3        100

SQL> select pk, idx
  2  from whatever
  3  where idx in ( select max(idx) from whatever)
  4  /

        PK        IDX
---------- ----------
         1        100
         2        100
         3        100

SQL>

答案 3 :(得分:0)

SELECT id, max(index) from table;

正如已经指出的那样,使用这个组功能意味着你必须按id分组。如果您错过了select中的id,则您的语句将从索引列返回最大值  整个桌子。如果您包含组,则结果将是每个ID的行和每个ID的最大索引。

您的第二个问题:

SELECT id, index from table where index=(select max(index) from table);

子查询将从整个表中选择最大索引,然后外部查询将在与最大值具有相同索引的任何行上返回id和index。

在您的情况下,结果可能相同,但查询非常不同。