请在sql中解释select max(...)... group by的功能

时间:2012-05-21 18:47:50

标签: mysql sql

我很欣赏这可能在许多人看来是一个dum问题,但我无法在任何地方找到关于“group by”对SQL语句中的select max(...)的影响的明确解释。

我有以下数据(还有另一个类型为mediumblob的列图像未显示):

id  title                      test_id 

1  bomb                             0 
2  Soft watch                       2 
3  Dali                             1 
4  Narciss                          1 
5  The Woman In Green               0 
6  A summer in Vetheuil             0 
7  Artist's Garden                  2 
8  Beech Forest                     2 
9  Claude Monet                     0 

我知道如果我执行

select max(id) from images 
where image is not null; 

我得到了id的最大值,即:

max(id) 

9

但有人可以解释我执行时发生的事情

select max(id), title, test_id 
from images 
where image is not null 
group by id; 

我发现max(id)没有用处(结果如下所示)?

  max(id)  title                      test_id 

  1  bomb                              0 
  2  Soft watch                        2 
  3  Dali                              1 
  4  Narciss                           1 
  5  The Woman In Green                0 
  6  A summer in Vetheuil              0 
  7  Artist's Garden                   2 
  8  Beech Forest                      2 
  9  Claude Monet                      0 

3 个答案:

答案 0 :(得分:1)

在使用MAX()的情况下,GROUP BY子句基本上告诉查询引擎如何对项目进行分组以确定最大值。在您的第一个示例中,您只选择了一个列,因此无需进行分组。但是在你的第二个例子中,你有多列。因此,您需要告诉查询引擎如何确定要比较哪些内容以找到最大值。

您告诉它按id列进行分组。这意味着它将比较具有相同id的记录,并为每个唯一id提供最大值。{由于每条记录都有不同的id,因此您基本上没有对该子句做任何事情。

它使用id 1(这是一条记录)对所有记录进行分组,并返回该组中最大id的记录(即该记录)。对23

执行了同样的操作

如果此处显示的是三列,则唯一可以对记录进行分组的地方是test_id列。像这样:

SELECT MAX(id), title, test_id
FROM images
WHERE image IS NOT null 
GROUP BY test_id

这会将它们按test_id分组,因此结果将包含记录6(id 0的最大test_id),4(id的最大值test_id {1}} 1)和8(id 2的最大test_id)。通过根据test_id列中的三个唯一值将记录拆分为这三个组,可以有效地在每个组中找到“最大”id

答案 1 :(得分:0)

是的,在你的例子中它没有任何用处。

您按ID进行分组,然后找到最大ID。但这没有意义,因为每个ID只有一个。通常MAX()用于数量,如价格或项目数等。

答案 2 :(得分:0)

分组依据不用于此类查询 它用于这样的查询

OId OrderDate   OrderPrice  Customer

1   2008/11/12  1000    Hansen

2   2008/10/23  1600    Nilsen

3   2008/09/02  700 Hansen

4   2008/09/03  300 Hansen

5   2008/08/30  2000    Jensen

6   2008/10/04  100 Nilsen

现在,如果您想获得每个客户购买的材料总和,您将使用

分组

SELECT Customer,SUM(OrderPrice)FROM Orders GROUP BY客户

customer    SUM(OrderPrice)

Hansen  2000

Nilsen  1700

Jensen  2000

在上面的情况下,ID是唯一的,因此按ID分组将没有任何意义