web-dev-qa-db-ja.com

SQLサーバー-MIN(テキスト)の仕組みを理解する

SQLサーバーがMIN(Varchar)を評価する方法について、少し掘り下げて説明を探しています。

私はこの発言をBOLで見つけました:MINは、基礎となるデータベースで定義されている照合シーケンスで最も低い値を見つけます

したがって、次の値を持つ1つの行を持つテーブルがあるとします。

_Data

AA
AB
AC
_

SELECT MIN(DATA)を実行すると、AAが返されます。この理由を理解し、BOLをもう少しよく理解したいだけです。

ありがとう!

21
tmercer

collat​​ion (ソート順)によって決定されます。ほとんどの文化では、照合順序は英語のアルファベットのアルファベット順と同じです。

  • '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'); 
21
Mark Byers

いいえ、MINは複数の行をスキャンするSELECTステートメントで使用されています。引数として列を受け取り、その列で見つかった(照合順序に従って)「最低」の値を返します。

GROUP BY句なしで使用すると、結果セットには単一の行が含まれ、MINの値はその列で見つかった最小値になります。 GROUP BY句とともに使用すると、結果セットにはグループごとに1つの行があり、MINの値はグループ内の任意の行のその列の最小値になります。

5
Larry Lustig

char(string)タイプのchar()、varchar()、nchar()、nvarchar()であるmin(x)は、SQLの文字列比較ルールに基づいて、グループ内の最小値を検索します。

  • 2つの文字列の長さが異なる場合は、短い方がSP文字(スペース)で埋められ、長い方が長くなります。
  • 比較は、使用されている照合順序の規則に従って、文字ごとに左から右に進みます。
  • 比較では、値NULLは非NULL値よりも低く比較されます(ISO/ANSI SQL標準では、NULLが非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()(コース)は逆を与え、セットを降順で並べ、最初の値を選択します。

2
Nicholas Carey