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

Учебник SQL

Урок 3. Сортировка выбранных данных

На этом уроке вы узнаете, как использовать предложение ORDER BY оператора SELECT для сортировки полученных в результате выборки данных.

Сортировка данных

Из последнего урока вы узнали, что следующий SQL-оператор возвращает один столбец из таблицы базы данных. Но взгляните на результат: данные выводятся в полном беспорядке.

SELECT prod_name 
FROM Products;

Результат:

prod_name
-------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

Вообще-то выбранные данные отображаются не в полном беспорядке. При отсутствии сортировки данные обычно выводятся в том порядке, в котором они находятся в таблице. Это может быть порядок, в котором они изначально добавлялись в таблицу. Однако если данные впоследствии обновлялись или удалялись, порядок будет зависеть от того, как СУБД будет использовать оставшееся свободное место. В результате вы не можете (и не должны) полагаться на порядок сортировки, если вы не контролируете его. В теории реляционных баз данных говорится, что последовательность выбранных данных не имеет смысла, если не был специально указан порядок сортировки.

Предложение

SQL-операторы завершаются предложениями, одни из которых обязательны, другие — нет. Предложение обычно состоит из ключевого слова и предоставляемых данных. Примером может служить предложение FROM оператора SELECT, которое мы использовали в предыдущем уроке.

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

SELECT prod_name 
FROM Products 
ORDER BY prod_name;

Это выражение идентично предыдущему, за исключением предложения ORDER BY, которое указывает системе управления базой данных отсортировать данные в алфавитном порядке по столбцу prod_name. Результат применения этого выражения будет следующим:

prod_name
--------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
Fish bean bag toy
King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann

Местоположение предложения ORDER BY

При использовании предложения ORDER BY убедитесь, что оно указано последним в операторе SELECT. Использование предложений в неправильном порядке ведет к появлению сообщений об ошибках.

Сортировка по невыбранным столбцам

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

Сортировка по нескольким столбцам

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

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

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

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;

Вывод:

prod_id  prod_price  prod_name
----------------------------------------
BNBG02   3.4900      Bird bean bag toy
BNBG01   3.4900      Fish bean bag toy
BNBG03   3.4900      Rabbit bean bag toy
RGAN01   4.9900      Raggedy Ann
BR01     5.9900      8 inch teddy bear
BR02     8.9900      12 inch teddy bear
RYL01    9.4900      King doll
RYL02    9.4900      Queen doll
BR03     11.9900     18 inch teddy bear

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

Сортировка по положению столбца

Порядок сортировки можно указать не только по именам столбцов, но и по относительному положению столбца (проще говоря — по номеру столбца). Чтобы лучше понять это, рассмотрим пример:

SELECT prod_id, prod_price, prod_name 
FROM Products ORDER BY 2, 3;

Вывод:

prod_id  prod_price  prod_name
------------------------------------
BNBG02   3.4900      Bird bean bag toy
BNBG01   3.4900      Fish bean bag toy
BNBG03   3.4900      Rabbit bean bag toy
RGAN01   4.9900      Raggedy Ann
BR01     5.9900      8 inch teddy bear
BR02     8.9900      12 inch teddy bear
RYL01    9.4900      King doll
RYL02    9.4900      Queen doll
BR03     11.9900     18 inch teddy bear

Как видите, результат выполнения запроса идентичен предыдущему примеру. Разница только в предложении ORDER BY. Здесь мы не указывали имена столбцов, вместо этого было оговорено их относительное положение в указанном списке SELECT. Предложение ORDER BY 2 означает сортировку по второму столбцу списка SELECT, а именно по столбцу prod_price. Предложение ORDER BY 2, 3 означает сортировку по столбцу prod_price, а затем по столбцу prod_name.

Основное преимущество данного метода заключается в том, что не нужно несколько раз набирать в запросе имена столбцов. Однако имеются и недостатки. Во-первых, неконкретное перечисление столбцов повышает вероятность того, что вы случайно укажете не тот столбец. Во-вторых, можно случайно сменить порядок данных при изменении списка SELECT (при этом забыв внести соответствующие изменения в предложение ORDER BY). И наконец, очевидно, нельзя использовать этот метод для сортировки по столбцам, не указанным в списке SELECT.

Сортировка по невыбранным столбцам

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

Указание направления сортировки

Сортировка данных не ограничена порядком по возрастанию (от А до Я). Несмотря на то что этот порядок является порядком по умолчанию, в предложении ORDER BY также можно использовать порядок по убыванию (от Я до А). Для этого необходимо указать ключевое слово DESC.

В следующем примере продукция сортируется по цене в убывающем порядке (вначале идут самые дорогие товары).

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;

Вывод:

prod_id  prod_price  prod_name
----------------------------------------
BR03     11.9900     18 inch teddy bear
RYL01    9.4900      King doll
RYL02    9.4900      Queen doll
BR02     8.9900      12 inch teddy bear
BR01     5.9900      8 inch teddy bear
RGAN01   4.9900      Raggedy Ann
BNBG01   3.4900      Fish bean bag toy
BNBG02   3.4900      Bird bean bag toy
BNBG03   3.4900      Rabbit bean bag toy

Но что, если производится сортировка по нескольким столбцам? В следующем примере продукция сортируется по цене в убывающем порядке (вначале самые дорогие), плюс по названию продукта:

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;

Вывод:

prod_id  prod_price  prod_name
----------------------------------------
BR03     11.9900     18 inch teddy bear
RYL01    9.4900      King doll
RYL02    9.4900      Queen doll
BR02     8.9900      12 inch teddy bear
BR01     5.9900      8 inch teddy bear
RGAN01   4.9900      Raggedy Ann
BNBG02   3.4900      Bird bean bag toy
BNBG01   3.4900      Fish bean bag toy
BNBG03   3.4900      Rabbit bean bag toy

Ключевое слово DESC применяется только к тому столбцу, после которого оно указано. В предыдущем примере ключевое слово DESC было указано для столбца prod_price, но не для prod_name. Таким образом, столбец prod_price отсортирован в порядке убывания, а столбец prod_name в обычном, возрастающем порядке.

Сортировка по убыванию по нескольким столбцам

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

Следует упомянуть, что DESC — это сокращение от DESCENDING, можно использовать оба ключевых слова. Противоположным словом для DESC является ASC (ASCENDING), которое можно указывать для сортировки по возрастанию. Однако на практике слово ASC обычно не применяется, поскольку такой порядок используется по умолчанию (он предполагается, если не указано ни ASC, ни DESC).

Чувствительность к регистру и порядок сортировки

При сортировке текстовых данных А это то же самое, что и а? И а идет перед Б или после я? Это не теоретические вопросы, ответ на них зависит от настройки базы данных.
При лексикографическом порядке сортировки А считается идентичным а, и такое поведение является обычным для большинства систем управления базами данных. Однако в некоторых СУБД администратор может при необходимости это поведение изменить. (Это может оказаться полезным, если в вашей базе данных содержится много символов из другого языка.) Суть в том, что если вам понадобится альтернативный порядок сортировки, его нельзя будет достичь посредством обычного предложения ORDER BY. Вам придется обратиться к администратору базы данных.

Резюме

Этот урок был посвящен сортировке выбранных данных при помощи предложения ORDER BY оператора SELECT. Это предложение, которое должно быть последним в операторе SELECT, можно использовать для сортировки данных по одному или нескольким столбцам.