SQL SERVER - Понимание того, как работает MIN (текст) - PullRequest
18 голосов
/ 21 декабря 2010

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

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

Так что, если у меня есть таблица, в которой одна строка содержит следующие значения:

Data

AA
AB
AC

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

Спасибо!

Ответы [ 3 ]

18 голосов
/ 21 декабря 2010

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

  • 'AA' <'AB' </li>
  • 'AA' <'AC' </li>
  • 'AB' <'AC' </li>

Следовательно, «AA» является минимальным значением. Для других культур это может не сработать. Например, датская сортировка будет возвращать «AB» как минимум, потому что «AA»> «AB». Это потому, что «АА» рассматривается как эквивалент «А», который является последней буквой в датском алфавите.

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 голосов
/ 21 декабря 2010

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

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

2 голосов
/ 21 декабря 2010

min (x), где тип char (string) - char (), varchar (), nchar (), nvarchar (), находит самое низкое значение в группе на основе правил сравнения строк SQL:

  • если две строки различаются по длине, более короткая дополняется символами SP (пробелами) до длины более длинной.
  • Сравнение происходит слева направо, символ за символом, в соответствии с правилом используемой последовательности сортировки.
  • в сравнениях, значение NULL сравнивается ниже, чем любые ненулевые значения (стандарт SQL ISO / ANSI говорит, что это выбор реализации относительно того, будет ли 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 (), или курс, дает обратное, упорядочивая набор в порядке убывания и выбирая первое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...