SQL SERVER-понимание того, как работает MIN (текст)

Я немного копаю и ищу объяснение того, как SQL server оценивает MIN(Varchar).

Я нашел это замечание в BOL: MIN находит наименьшее значение в последовательности сортировки, определенной в базовой базе данных

поэтому, если у меня есть таблица, которая имеет одну строку со следующими значениями:

Data

AA
AB
AC

делать SELECT MIN(DATA) вернется обратно AA. Я просто хочу понять, почему за этим стоит и понять бол немного лучше.

спасибо!

3 ответов


установлено сортировка (порядок сортировки). Для большинства культур порядок сортировки такой же, как алфавитный порядок в английском алфавите, поэтому:

  • ' AA '
  • ' AA '
  • ' AB '

поэтому' 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');

нет, MIN используется в инструкции SELECT, которая сканирует более одной строки. Он принимает столбец в качестве аргумента и возвращает "самое низкое" значение (опять же, в соответствии с последовательностью сортировки), найденное в этом столбце.

используется без предложения GROUP BY, результирующий набор будет иметь одну строку, а значение MIN будет наименьшим значением, найденным в этом столбце. Используется с предложением GROUP BY, результирующий набор будет иметь одну строку для каждой группы, а значение MIN будет наименьшим значением в этот столбец для каждой строки в группе.


min (x), где есть тип char (string) -- 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

вы в основном заказываете набор в восходящей последовательности и выбираете первое значение. MAX (), или course, дает вам обратное, упорядочение набора в нисходящей последовательности и выбор первого значения.