非数字列中的SQL MAX函数

非数字列中的SQL MAX函数,sql,select,max,Sql,Select,Max,据我所知,MAX函数将返回给定列的最大值。对于数值,例如工资列,这对我来说很清楚——这是我在教程中找到的唯一应用程序。然而,我有一个问题要理解它在非数字列的情况下是如何工作的 我的问题源于这个练习(在sql-ex.ru上) 找出只生产同一型号的制造商,这些型号的数量超过1。 “产品”表包括制造商、型号和类型(“PC”、“笔记本电脑”或“打印机”)的相关信息。 解决方案之一是: SELECT maker, MAX(type) AS type FROM product GROUP

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

满桌

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


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

在字符列中,MAX在排序顺序中找到最高值。在PC和笔记本电脑中,“P”符号在“L”符号之后,所以最大结果是PC。打印机和PC:第一个字母相等,但“r”符号在“C”之后,所以最大结果是打印机。

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

在您的情况下,
HAVING
子句限制了
type
值对于给定
生成器的所有记录都是相同的,因此
MAX()
groupby
仅用于返回一行,它返回的
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
演示:

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

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

我明白了-如果类型在GROUP BY子句中,它将产生不同的结果,返回所有可能的maker和type组合?@Bartias确切地说,它将为每个不同的组合maker类型创建不同的组,并且SELECT子句中的聚合函数将应用于这些较小的组