24

私は少し掘り下げて、SQL サーバーがどのように評価するかについての説明を探していますMIN(Varchar)

BOL でこの発言を見つけました: MIN は、基になるデータベースで定義された照合順序で最小値を見つけます

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

Data

AA
AB
AC

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

ありがとう!

4

3 に答える 3

25

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

  • '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');
于 2010-12-21T20:45:24.057 に答える
6

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

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

于 2010-12-21T20:44:18.720 に答える
2

min(x) は char (文字列) 型です -- char()、varchar()、nchar()、nvarchar() は、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() または course は、セットを降順で並べ替え、最初の値を選択するという逆の結果を返します。

于 2010-12-21T20:55:28.453 に答える