SQL SERVER - 了解MIN(文本)的工作原理

时间:2010-12-21 20:40:34

标签: sql-server tsql sqltransaction

我正在进行一些挖掘并寻找有关SQL Server如何评估MIN(Varchar)的解释。

我在BOL中发现了这句话:MIN在底层数据库中定义的整理顺序中找到最低值

因此,如果我有一个包含以下值的行的表:

Data

AA
AB
AC

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

谢谢!

3 个答案:

答案 0 :(得分:18)

collation(排序顺序)决定。对于大多数文化,整理顺序与英文字母中的字母顺序相同,所以:

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

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

SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1;

min_s
AB

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

SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1;

min_s
AA

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

CREATE TABLE table1 (s varchar(100));
INSERT INTO table1 (s) VALUES ('AA'), ('AB'), ('AC');

答案 1 :(得分:5)

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

在没有GROUP BY子句的情况下使用,结果集将只有一行,MIN的值将是该列中找到的最低值。与GROUP BY子句一起使用时,结果集对于每个组都有一行,MIN的值将是该列中任何行的最低值。

答案 2 :(得分:2)

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

  • 如果两个字符串的长度不同,则较短的字符用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()或过程为您提供逆序,按降序排列集合并选择第一个值。