我在做一個小挖,尋找上的SQL Server如何評估MIN(Varchar)
一個解釋。SQL SERVER - 瞭解MIN(文本)是如何工作的
我發現這句話在BOL:MIN發現在底層數據庫中定義
所以,如果我有一個具有一行具有以下值的表整理序列中的最低值:
Data
AA
AB
AC
做一個SELECT MIN(DATA)
會返回AA。我只是想了解背後的原因,並理解BOL好一點。
謝謝!
我在做一個小挖,尋找上的SQL Server如何評估MIN(Varchar)
一個解釋。SQL SERVER - 瞭解MIN(文本)是如何工作的
我發現這句話在BOL:MIN發現在底層數據庫中定義
所以,如果我有一個具有一行具有以下值的表整理序列中的最低值:
Data
AA
AB
AC
做一個SELECT MIN(DATA)
會返回AA。我只是想了解背後的原因,並理解BOL好一點。
謝謝!
它是由collation(排序)確定。對於大多數文化歸類順序是一樣的,在英文字母,因此按字母順序排列:
因此 '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');
不,MIN用於掃描多行的SELECT語句中。它將一列作爲參數,並返回在該列中找到的「最低」值(再次根據整理序列)。
如果不使用GROUP BY子句,結果集將有一個單一的行,MIN的值將在該列中的最低值。與GROUP BY子句一起使用時,結果集對於每個組將有一行,MIN的值將是該組中任何行的該列中的最低值。
分鐘(X), char(),varchar(),nchar(),nvarchar()根據SQL的字符串比較規則找到組中的最小值:
所以,如果你有一個表
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()或當然,給你反序,以降序對序列進行排序並選擇第一個值。
只是FYI,我認爲編輯這個問題(雖然它使數據「看起來」是正確的)並沒有表達OP的意圖誰希望所有這些值在一行,而不是三。 – 2010-12-21 20:46:27
@Larry Lustig:實際上,我認爲OP的問題是誤導性的,我懷疑他有一張有一行和三個值的表格 - 他可能想要一張帶有單列和三行的表格,每行都有一個這樣的值。那麼他會怎樣在該表上做一個「MIN(Data)」? – 2010-12-21 20:48:05
目前尚不清楚,但我相信他確實相信MIN在一行內運行(因爲他說「一行」)。我認爲他把它和一個函數混淆起來,這個函數在返回最小時需要幾個參數)。 – 2010-12-21 20:49:22