34

据我了解 MAX 函数,它应返回给定列的最大值。如果是数值,例如薪水列,我很清楚 - 这是我在教程中找到的唯一应用程序。但是,我很难理解它在非数字列的情况下是如何工作的。

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

找出仅生产同类型型号的厂商,并且这些型号的数量超过1。 “产品”表包括有关厂商、型号和类型('PC'、'Laptop'或'Printer')的信息')。解决方案之一是:

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(type) 在我看来是一个随机值,例如为什么制造商 B 的结果是 PC 而不是笔记本电脑?为什么E是打印机而不是PC?

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

4

3 回答 3

31

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

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

于 2013-09-01T13:01:44.943 回答
4

在字符列中,MAX 查找整理序列中的最大值。在 PC 和笔记本电脑的情况下:“P”符号位于“L”符号之后,因此 MAX 结果为 PC。打印机和 PC:第一个字母相等,但“r”符号在“C”之后,因此 MAX 结果是打印机。

于 2013-09-01T13:10:17.567 回答
2

MAX()用于字符串以字母顺序和长度计算值,a> b,但是ab> a

在您的情况下,该HAVING子句限制type为给定的所有记录的值相同的位置maker,因此MAX()andGROUP BY仅用于返回单行,它返回的值无关紧要,type因为它们对于所有可以返回的行。

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

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

演示:SQL 小提琴

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

SELECT maker
     , MIN(type)
FROM product
GROUP BY maker
HAVING MAX(type) = MIN(type)
   AND COUNT(model) > 1
ORDER BY maker
于 2013-09-01T14:36:37.933 回答