SQL Server - Понимание того, как работает min (текст)
-
12-10-2019 - |
Вопрос
Я немного копаю и ищу объяснения о том, как оценивает SQL Server MIN(Varchar)
.
Я нашел это замечание в BOL: MIN находит наименьшее значение в последовательности сбора, определенной в базовой базе данных
Так что, если у меня есть таблица с одной строкой со следующими значениями:
Data
AA
AB
AC
Делая а SELECT MIN(DATA)
вернется обратно Аа. Я просто хочу понять, почему за этим и понять Бол немного лучше.
Спасибо!
Решение
Это определено сопоставление (Порядок сортировки). Для большинства культур порядок сбора такой же, как в алфавитном порядке в английском алфавите, так что:
- 'Aa' <'ab'
- 'Aa' <'ac'
- 'Ab' <'ac'
Поэтому «Аа» является минимальным значением. Для других культур это может не соблюдать. Например, датское сопоставление вернет «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');
Другие советы
Нет, MIN используется в операторе SELECT, который сканирует более одной строки. Он принимает столбец в качестве аргумента и возвращает значение «самого низкого» (опять же, в соответствии с последовательности сбора), найденного в этом столбце.
Используется без положения группы по пункту, набор результатов будет иметь одну строку, а значение MIN будет самым низким значением, найденным в этом столбце. Используемый с пунктом группы по группе, набор результатов будет иметь одну строку для каждой группы, и значение MIN будет самым низким значением в этом столбце для любой строки в группе.
min (x), где находится char (string) type - char (), varchar (), nchar (), nvarchar (), находит самое низкое значение в группе, на основе правил сравнения строк SQL:
- Если две строки различаются по длине, более короткий сформул сочетается с символами SP (пространства) до длины дольше.
- Сравнение проходит слева направо, характер по характеру, в соответствии с правилом используемой последовательности сбора.
- Для сравнения, значение Null сравнивается ниже, чем любые не нулевые значения (стандарт ISO/ANSI 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
Вы в основном заказываете набор в восходящей последовательности и выбираете первое значение. Max (), или, конечно, дает вам обратный, заказывая набор в нисходящей последовательности и выбирая первое значение.