Сортировка и группирование результатов

Конструкция order by(упорядочить) позволяет расположить (рассортировать) результаты запроса в соответствии с содержимым выделенных столбцов. Выделять для сортировки можно не более 16 столбцов. Упорядочение по каждому столбцу должно быть либо возрастающим (asc), либо убывающим (desc). По умолчанию предполагается возрастающее упорядочение. В следующем запросе результаты упорядочиваются по столбцу pub_id:

select pub_id, type, title_id

From titles

order by pub_id

pub_id type title_id

------ --------------- ------------

0736 business BU2075

0736 psychology PS2091

0736 psychology PS2106

0736 psychology PS3333

0736 psychology PS7777

0877 UNDECIDED MC3026

0877 mod_cook MC2222

0877 mod_cook MC3021

0877 psychology PS1372

0877 trad_cook TC3218

0877 trad_cook TC4203

0877 trad_cook TC7777

1389 business BU1032

1389 business BU1111

1389 business BU7832

1389 popular_comp PC1035

1389 popular_comp PC8888

1389 popular_comp PC9999

(Выбрано 1 строку)

Если в конструкции order byуказано несколько столбцов, то проводится комбинированная сортировка. Следующий оператор упорядочивает строки из таблицы titlesсначала в убывающем порядке по издателям, затем по каждому издателю книги располагаются в возрастающем порядке по типу и, наконец, книги имеющие одного издателя и один тип располагаются по номерам (также по умолчанию в возрастающем порядке). Неопределенные значения в любой группе указываются первыми.

select pub_id, type, title_id

From titles

order by pub_id desc, type, title_id

pub_id type title_id

--------- ------------------- ------------

1389 business BU1032

1389 business BU1111

1389 business BU7832

1389 popular_comp PC1035

1389 popular_comp PC8888

1389 popular_comp PC9999

0877 UNDECIDED MC3026

0877 mod_cook MC2222

0877 mod_cook MC3021

0877 psychology PS1372

0877 trad_cook TC3218

0877 trad_cook TC4203

0877 trad_cook TC7777

0736 business BU2075

0736 psychology PS2091

0736 psychology PS2106

0736 psychology PS3333

0736 psychology PS7777

(Выбрано 18 строк)

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

select pub_id, type, title_id

From titles

Order by 1 desc, 2, 3

select pub_id, type, title_id

From titles

Order by 1 desc, type, 3

В большинстве версий SQL требуется, чтобы названия столбцов в конструкции order by брались из списка выбора. В языке Transact-SQL этого не требуется. Можно сортировать результаты предыдущего запроса по столбцу title (заголовок), хотя этого столбца нет в списке выбора.

Замечание:Нельзя проводить сортировку по столбцам типа text (текст) и image (графика).

В конструкции order byнельзя также использовать подзапросы, агрегирующие функции и выражения, содержащие константы и переменные.

Результаты упорядочения по данным различного типа зависят от процедур сортировки, установленных на SQL Сервере. Обычно это процедуры двоичной и словарной сортировки, в которой не учитывается регистр символов. Системная процедура SP_HELPSORT позволяет увидеть установленный на Сервере порядок сортировки. Детали можно посмотреть в разделе order byв Справочном руководстве SQL Сервера.

Если оператор выбора содержит конструкцию where, но не содержит конструкцию group by(группировка), то агрегирующая функция будет выдавать одно значение для подмножества строк, отобранных конструкцией where. Однако, в расширении Transact-SQL можно также указать название столбца в списке выбора, в результате чего в каждой строке будет повторяться одно и то же итоговое значение. В этом случае результат запроса будет таким же, как и при использовании конструкции having, как это описывается в главе “Выбор Групп Данных: Конструкция having”.

В следующем запросе вычисляется среднее значение аванса и общая годовая сумма, вырученная только от продажи книг по бизнесу.

select avg(advance), sum(total_sales)

From titles

where type = “business”

-------------------------- -------------------

6,281.25 30788

(Выбрана 1 строка)

Когда агрегирующая функция используется в операторе выбора, который не содержит конструкции group by, то в результате появится одно итоговое значение независимо от наличия или отсутствия конструкции отбора where. Это называется скалярным агрегированием.

Заметим, что можно использовать несколько агрегирующих функций в одном и том же списке выбора и получить несколько скалярных итоговых значений в одном операторе выбора.

Наши рекомендации