2010-12-21 55 views
15

我在做一個小挖,尋找上的SQL Server如何評估MIN(Varchar)一個解釋。SQL SERVER - 瞭解MIN(文本)是如何工作的

我發現這句話在BOL:MIN發現在底層數據庫中定義

所以,如果我有一個具有一行具有以下值的表整理序列中的最低值:

Data 

AA 
AB 
AC 

做一個SELECT MIN(DATA)會返回AA。我只是想了解背後的原因,並理解BOL好一點。

謝謝!

+0

只是FYI,我認爲編輯這個問題(雖然它使數據「看起來」是正確的)並沒有表達OP的意圖誰希望所有這些值在一行,而不是三。 – 2010-12-21 20:46:27

+0

@Larry Lustig:實際上,我認爲OP的問題是誤導性的,我懷疑他有一張有一行和三個值的表格 - 他可能想要一張帶有單列和三行的表格,每行都有一個這樣的值。那麼他會怎樣在該表上做一個「MIN(Data)」? – 2010-12-21 20:48:05

+0

目前尚不清楚,但我相信他確實相信MIN在一行內運行(因爲他說「一行」)。我認爲他把它和一個函數混淆起來,這個函數在返回最小時需要幾個參數)。 – 2010-12-21 20:49:22

回答

16

它是由collation(排序)確定。對於大多數文化歸類順序是一樣的,在英文字母,因此按字母順序排列:

  • 'AA' < 'AB'
  • 'AA' < 'AC'
  • 'AB' <「 AC」

因此 'AA' 爲最小值。對於其他文化,這可能不成立。例如,由於「AA」>「AB」,丹麥語整理將返回「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'); 
5

不,MIN用於掃描多行的SELECT語句中。它將一列作爲參數,並返回在該列中找到的「最低」值(再次根據整理序列)。

如果不使用GROUP BY子句,結果集將有一個單一的行,MIN的值將在該列中的最低值。與GROUP BY子句一起使用時,結果集對於每個組將有一行,MIN的值將是該組中任何行的該列中的最低值。

2

分鐘(X), 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 

你基本上是按升序排列集合並選擇第一個val UE。 MAX()或當然,給你反序,以降序對序列進行排序並選擇第一個值。