24

我正在做一些挖掘并寻找关于 SQL 服务器如何评估的解释MIN(Varchar)

我在 BOL 中找到了这个注释:MIN 找到底层数据库中定义的整理序列中的最小值

因此,如果我有一个表,其中一行具有以下值:

Data

AA
AB
AC

做 aSELECT MIN(DATA)会返回 AA。我只是想了解这背后的原因并更好地了解 BOL。

谢谢!

4

3 回答 3

25

它由排序规则(排序顺序)决定。对于大多数文化,整理顺序与英文字母表中的字母顺序相同,因此:

  • 'AA' < 'AB'
  • 'AA' < 'AC'
  • 'AB' < 'AC'

因此'AA'是最小值。对于其他文化,这可能不成立。例如,丹麦排序规则将返回 'AB' 作为最小值,因为 'AA' > 'AB'。这是因为“AA”被视为等同于“Å”,后者是丹麦字母表中的最后一个字母。

SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1;

分钟
AB

要获得“普通”排序顺序,请使用Latin1_General_Bin排序规则:

SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1;

分钟
AA

要重现此结果,您可以创建此测试表:

CREATE TABLE table1 (s varchar(100));
INSERT INTO table1 (s) VALUES ('AA'), ('AB'), ('AC');
于 2010-12-21T20:45:24.057 回答
6

不,MIN 用于扫描多行的 SELECT 语句。它将一列作为参数,并返回在该列中找到的“最低”值(同样,根据整理顺序)。

在不使用 GROUP BY 子句的情况下使用,结果集将只有一行,并且 MIN 的值将是在该列中找到的最小值。与 GROUP BY 子句一起使用时,结果集将为每个组保留一行,并且 MIN 的值将是该组中任何行的该列中的最小值。

于 2010-12-21T20:44:18.720 回答
2

min(x),其中是 char(字符串)类型 -- char()、varchar()、nchar()、nvarchar(),根据 SQL 的字符串比较规则,查找组中的最小值:

  • 如果两个字符串的长度不同,较短的将用 SP 字符(空格)填充到较长的长度。
  • 根据使用的排序规则,从左到右逐个字符进行比较。
  • 在比较中,值 NULL 比较低于任何非空值(ISO/ANSI SQL 标准表示,对于 NULL 是否低于或高于任何非空值排序是一种实现选择)。

所以,如果你有一张桌子

create table foo
(
  myString varchar(16) not null ,
)

然后运行查询

select min(myString) from foo

将为您提供与执行时相同的结果集

set rowcount 1

select myString
from foo
order by myString

set rowcount 0

您基本上是按升序对集合进行排序并选择第一个值。MAX(),或者当然,给你相反的,以降序排列集合并选择第一个值。

于 2010-12-21T20:55:28.453 回答