SQL MAX函数在非数字列中

时间:2013-09-01 12:55:06

标签: sql select max

据我了解MAX函数,它应返回给定列的最大值。对于数值,例如工资列,我很清楚 - 这是我在教程中找到的唯一应用程序。但是,我有一个问题需要了解在非数字列的情况下它是如何工作的。

我的问题源于此练习(在sql-ex.ru上)

找出只生产相同型号型号的制造商,这些型号的数量超过1个。 表“产品”包括有关制造商,型号和类型(“PC”,“笔记本电脑”或“打印机”)的信息。 其中一个解决方案是:

SELECT maker,
       MAX(type) AS type
FROM   product
GROUP  BY maker
HAVING COUNT(DISTINCT type) = 1
       AND COUNT(model) > 1 

我不明白max的功能 - 它算什么?我尝试了一个更简单的查询来理解它,但它只会让它变得更加困难。

SELECT maker,
       MAX(type) AS type, COUNT(type) AS QTY
FROM product
GROUP BY maker
ORDER BY maker

返回的集是

maker  type      QTY
A      Printer   7
B      PC        2
C      Laptop    1
D      Printer   2
E      Printer   4

MAX(类型)在我看来显示一个随机值,例如为什么制造商B的结果是PC而不是笔记本电脑?为什么E是打印机而不是PC?

全表
 http://i.stack.imgur.com/gObvQ.png

3 个答案:

答案 0 :(得分:18)

函数MAXMIN等在应用于文本列时使用词典顺序。因此,您的MAX(类型)将返回“打印机”而不是“PC”,因为“打印机”按字母顺序位于(大于)“PC”之后。

请注意,在您的第一个查询中,条件HAVING COUNT(distinct type) = 1表示每个组只能有一个type值。使用select中的MAX(type)子句是因为只有type不能在select中使用,因为它不在GROUP BY子句中。

答案 1 :(得分:3)

在字符列中,MAX在整理顺序中找到最高值。在PC和笔记本电脑的情况下:“P”符号在“L”符号后面,因此MAX结果为PC。打印机和PC:首字母相等但“r”符号在“C”之后,因此MAX结果为打印机。

答案 2 :(得分:1)

字符串上使用的

MAX()按字母顺序和长度a>评估值。 b,但ab> a

在您的情况下,HAVING子句限制了给定type的所有记录的maker值相同的位置,因此MAX()和{{1}仅用于返回单个行,并且它返回的GROUP BY的值无关紧要,因为它们对于可以返回的所有行都是相同的。

如果您更改了第二个查询,它可能会帮助您了解这一切是如何运作的:

type

演示:SQL Fiddle

第一个查询也可以重写为:

SELECT maker
     , MAX (type) AS maxType
     , MIN (type) AS minType
     , COUNT(DISTINCT type) AS QTY
     , COUNT(model) AS Models
FROM product
GROUP BY maker
ORDER BY maker