Ключевое слово ORDER BY, где используется
Содержание
- 1 Настройка базы данных для примеров
- 1.1 1. Просмотр доступных баз данных
- 1.2 2. Создание новой базы данных
- 1.3 3. Выбор базы данных для использования
- 1.4 4. Импорт SQL-команд из файла .sql
- 1.5 5. Удаление базы данных
- 2 Раздел ORDER BY
- 2.1 ORDER BY в обратном порядке
- 2.2 ORDER BY в возрастающем порядке
- 2.3 ORDER BY в возрастающем и убывающем порядке
- 3 SQL ORDER BY ключевое слово
- 4 Аргументы
- 5 Рекомендации
- 6 Совместимость
- 7 Ограничения
- 8 Использование OFFSET и FETCH для ограничения числа возвращаемых строк
- 9 Демо база данных
- 10 Пример ORDER BY
- 10.1 Пример
- 11 Пример ORDER BY DESC
- 11.1 Пример
- 12 Пример ORDER BY несколько столбцов
- 12.1 Пример
- 13 Группировка
- 14 Сложение строк
- 15 Длина строк
- 16 Изменение строк
- 17 Поиск по строкам
- 18 Работа с пробелами
- 19 Работа с регистром
Настройка базы данных для примеров
Создайте базу данных для демонстрации работы команд. Для работы вам понадобится скачать два файла: DLL.sql и InsertStatements.sql. После этого откройте терминал и войдите в консоль MySQL с помощью следующей команды (статья предполагает, что MySQL уже установлен в системе):
mysql -u root -p
Затем введите пароль.
Выполните следующую команду. Назовём базу данных «university»:
CREATE DATABASE university;
USE university;
SOURCE
SOURCE
1. Просмотр доступных баз данных
SHOW DATABASES;
2. Создание новой базы данных
CREATE DATABASE;
3. Выбор базы данных для использования
USE
4. Импорт SQL-команд из файла .sql
SOURCE
5. Удаление базы данных
DROP DATABASE
Раздел ORDER BY
Фраза ORDER BY используется для того, чтобы упорядочить строки, извлекаемые запросом.
В предложении ORDER BY SQL можно задавать несколько выражений. Сначала сортируются строки, основываясь на их значениях для первого выражения. Строки с одним и тем же значением для первого выражения затем сортируются по второму выражению и так далее. NULL-значения располагает после всех других при упорядочивании в порядке возрастания и перед всеми другими при сортировке в убывающем порядке.
Вместо имени столбца можно указать его позицию для сокращения записи длинного выражения.
Кроме того, при составлении сложных запросов, содержащих множественные операторы UNION, INTERSECT, MINUS, или UNION ALL, в предложении ORDER BY лучше использовать позиции, чем непосредственно сами выражения. Предложение ORDER BY может появляться только в последнем составляющем запросе и сортирует строки, полученные всем составным запросом в целом.
Предложение ORDER BY подчинено следующим ограничениям:
- Если в утверждении SELECT используются и оператор ORDER BY и оператор DISTINCT, то предложение ORDER BY не может ссылаться на столбцы, не упоминаемые в списке выбора выбираемых столбцов.
- Предложение ORDER BY не может появляться в подзапросах внутри других утверждений.
ORDER BY в обратном порядке
Выбрать из EMP записи по всем продавцам, и упорядочить результаты по размерам комиссионных в обратном порядке (убывающем порядке):
SELECT *FROM emp WHERE job = ‘SALESMAN’ ORDER BY comm DESC;
ORDER BY в возрастающем порядке
Выбрать из EMP записи по всем сотрудникам, и упорядочить результаты по размерам комиссионных в возрастающем порядке:
SELECT * FROM emp WHERE job = ‘SALESMAN’ ORDER BY comm ASC;
ORDER BY в возрастающем и убывающем порядке
Выбрать из EMP записи по служащим, упорядоченные сначала по возрастанию номера отдела а затем по убыванию размера оклада:
SELECT ename, deptno, sal FROM emp ORDER BY deptno ASC, sal DESC;
SQL ORDER BY ключевое слово
Ключевое слово ORDER BY используется для сортировки результирующего набора в порядке возрастания или убывания.
Ключевое слово ORDER BY по умолчанию сортирует записи в порядке возрастания. Чтобы отсортировать записи в порядке убывания, используйте ключевое слово DESC.
Аргументы
order_by_expression
Указывает столбец или выражение, по которому производится сортировка результирующего набора запроса. Столбец сортировки может быть указан с помощью имени или псевдонима столбца или неотрицательного целого числа, представляющего позицию столбца в списке выбора.
Можно указать несколько столбцов сортировки. Имена столбцов должны быть уникальными. Последовательность столбцов сортировки в предложении ORDER BY определяет организацию упорядоченного результирующего набора. Иными словами, результирующий набор сортируется по первому столбцу, затем упорядоченный список сортируется по второму и т. д.
Имена столбцов, на которые содержатся ссылки в предложении ORDER BY, должны однозначно соответствовать столбцу или псевдониму столбца в списке выбора либо столбцу, определенному в таблице, указанной в предложении FROM. Если предложение ORDER BY ссылается на псевдоним столбца в списке выбора, псевдоним должен использоваться отдельно, а не как часть выражения в предложении ORDER BY, например:
SELECT SCHEMA_NAME(schema_id) AS SchemaName FROM sys. objects ORDER BY SchemaName; — correct SELECT SCHEMA_NAME(schema_id) AS SchemaName FROM sys.objects ORDER BY SchemaName + »; — wrong
COLLATE collation_name
Указывает, что операция ORDER BY должна выполняться в соответствии с параметрами сортировки, указанными в аргументе collation_name, но не в соответствии с параметрами сортировки столбца, определенными в таблице или представлении. Аргументом collation_name может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. Дополнительные сведения см. в статье Collation and Unicode Support. Аргумент COLLATE применяется только к столбцам типа char, varchar, nchar и nvarchar.
ASC | DESC
Указывает порядок сортировки значений в указанном столбце — по возрастанию или по убыванию. Значение ASC сортирует от низких значений к высоким. Значение DESC сортирует от высоких значений к низким. Порядок сортировки по умолчанию — ASC. Значения NULL рассматриваются как минимально возможные значения.
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Указывает число сток, которые необходимо пропустить, прежде чем будет начат возврат строк из выражения запроса. Это значение может быть целочисленной константой или выражением, значение которого больше нуля или равно нулю.
Применимо к: SQL Server 2012 (11.x) и выше, База данных SQL Azure.
offset_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. Иными словами, он не может коррелировать с внешним запросом.
ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI.
В плане выполнения запроса значение смещения строки отображается в атрибуте Offset оператора запроса TOP.
FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Указывает число строк, возвращаемых после обработки предложения OFFSET. Это значение может быть целочисленной константой или выражением, значение которого больше единицы или равно единице.
Применимо к: SQL Server 2012 (11. x) и выше, а также База данных SQL Azure.
fetch_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. Иными словами, он не может коррелировать с внешним запросом.
FIRST и NEXT являются синонимами и предусмотрены для совместимости со стандартом ANSI.
ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI.
В плане выполнения запроса значение смещения строки отображается в атрибуте Rows или Top оператора запроса TOP.
Рекомендации
Избегайте указания столбцов в предложении ORDER BY по их порядковому номеру в списке выбора. Например, хотя инструкция SELECT ProductID, Name FROM Production.Production ORDER BY 2 верна, она будет не очень понятна другим пользователям по сравнению с тем случаем, когда столбцы указаны по именам. Кроме того, если список выбора изменится, в частности изменится порядок столбца или будут добавлены новые столбцы, то это потребует изменения предложения ORDER BY во избежание непредвиденных результатов.
В инструкции SELECT TOP (N) всегда указывайте предложение ORDER BY. Это единственный способ предсказуемым образом отметить строки, которые были обработаны предложением TOP. Дополнительные сведения см. в разделе TOP (Transact-SQL).
Совместимость
При использовании в инструкции SELECT…INTO или INSERT…SELECT предложения ORDER BY для вставки строк из другого источника вставка строк в указанном порядке не гарантируется.
Использование OFFSET и FETCH в представлении не приведет к изменению его свойства Updateability.
Ограничения
Нет ограничения на число столбцов в предложении ORDER BY, однако общий размер столбцов, перечисленных в нем, не может превышать 8060 байт.
Столбцы типа ntext, text, image, geography, geometry и xml не могут использоваться в предложении ORDER BY.
Нельзя указывать целое число или константу, если аргумент order_by_expression присутствует в ранжирующей функции. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).
Если в качестве имени таблицы в предложении FROM используется псевдоним, то только псевдоним может быть использован для обозначения столбца этой таблицы в предложении ORDER BY.
Имена и псевдонимы столбцов, указанные в предложении ORDER BY, должны быть определены в списке выбора, если инструкция SELECT содержит одно из следующих предложений или операторов:
UNION, оператор
Оператор EXCEPT
INTERSECT, оператор
SELECT DISTINCT
Кроме того, если в инструкцию входит оператор UNION, EXCEPT или INTERSECT, то имена и псевдонимы столбцов должны быть указаны в списке выбора первого (слева) запроса.
В запросе, содержащем оператор UNION, EXCEPT или INTERSECT, предложение ORDER BY допускается только в конце инструкции. Это ограничение применяется только при использовании операторов UNION, EXCEPT и INTERSECT в запросах верхнего уровня, но не во вложенных запросах. См подраздел «Примеры» ниже.
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах и вложенных запросах, если также не указаны предложения TOP либо OFFSET и FETCH.
В этих объектах предложение ORDER BY используется только для определения строк, возвращаемых предложением TOP или OFFSET и FETCH. Предложение ORDER BY не гарантирует упорядочивания результатов при запросе этих конструкций, если оно не указано в самом запросе.Предложения OFFSET и FETCH не поддерживаются в индексированных представлениях и представлениях, определенных с предложением CHECK OPTION.
Предложения OFFSET и FETCH могут быть использованы в любом запросе, допускающем применение TOP и ORDER BY, со следующими ограничениями.
Предложение OVER не поддерживает OFFSET и FETCH.
Предложения OFFSET и FETCH не могут быть указаны прямо в инструкциях INSERT, UPDATE, MERGE и DELETE, но могут быть указаны во вложенных запросах, определяемых этими инструкциями. Например, в инструкции INSERT INTO SELECT предложения OFFSET и FETCH могут быть указаны в инструкции SELECT.
В запросе, содержащем оператор UNION, EXCEPT или INTERSECT, предложения OFFSET и FETCH могут быть указаны только в конечном запросе, который определяет порядок следования результатов запроса.
TOP нельзя сочетать с OFFSET и FETCH в одном выражении запроса (в той же области запроса).
Использование OFFSET и FETCH для ограничения числа возвращаемых строк
Для разбиения на страницы и ограничения числа строк, передаваемых клиентскому приложению, рекомендуется пользоваться предложениями OFFSET и FETCH, а не предложением TOP.
Применение в качестве решения для разбиения на страницы предложений OFFSET и FETCH потребует однократного выполнения запроса для каждой «страницы» данных, возвращаемых клиентскому приложению. Например, чтобы вернуть результаты запроса блоками по 10 строк, необходимо выполнить запрос для получения строк с 1 по 10, затем еще раз для получения строк с 11 по 20 и так далее. Каждый запрос выполняется независимо и никаким образом не связан с другими запросами. Это означает, что в отличие от использования курсора, где запрос выполняется всего один раз, а текущее состояние хранится на сервере, за отслеживание состояния отвечает клиентское приложение.
Чтобы добиться стабильных результатов между запросами с предложениями OFFSET и FETCH, должны выполняться следующие условия.Базовые данные, используемые запросом, должны быть неизменными. Иными словами, либо строки, обработанные запросом, не должны обновляться, либо все запросы страниц выполняемого запроса должны выполняться в одной транзакции, использующей моментальный снимок или сериализуемую изоляцию транзакции. Дополнительные сведения об уровнях изоляции транзакции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).
Предложение ORDER BY содержит столбец или сочетание столбцов, которые гарантированно уникальны.
См. пример «Выполнение нескольких запросов в одной транзакции» в подразделе «Примеры» ниже в этом разделе.
Если согласованность планов выполнения важна для решения разбиения на страницы, подумайте над использованием указания запросов OPTIMIZE FOR для параметров OFFSET и FETCH. См. пункт «Указание выражений для значений OFFSET и FETCH» в подразделе «Примеры» ниже в этом разделе. Дополнительные сведения об OPTIMZE FOR см. в статье Указания запросов (Transact-SQL).
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Пример ORDER BY
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers», отсортированных по столбцу «Country»:
Пример
SELECT * FROM Customers
ORDER BY Country;
Пример ORDER BY DESC
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers», отсортированных по убыванию столбца «Country»:
Пример
SELECT * FROM Customers
ORDER BY Country DESC;
Пример ORDER BY несколько столбцов
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers», отсортированных по столбцу «Country» и «CustomerName». Это означает, что он заказывает по стране, но если некоторые строки имеют одну и ту же страну, он заказывает их по имени клиента:
Пример
SELECT * FROM Customers
ORDER BY Country, CustomerName;
Группировка
- группировка
GROUP BY - условие на group by
HAVING
Сложение строк
- сложение строк
CONCAT - сложение с разделителем
CONCAT_WS - сложение ячеек
GROUP_CONCAT
Длина строк
- длина строки
LENGTH
Изменение строк
- вырезание слева
LEFT - вырезание справа
RIGHT - взятие подстроки
SUBSTRING - взятие подстроки
MID
SUBSTRING_INDEX- поиск и замена
REPLACE - дополнение строки слева
LPAD - дополнение строки справа
RPAD - переворот строки
REVERSE - повторение строки
REPEAT
Поиск по строкам
- поиск подстроки
POSITION - поиск подстроки
LOCATE - поиск подстроки
INSTR
Работа с пробелами
- обрезание пробелов
TRIM - обрезание пробелов слева
LTRIM - обрезание пробелов справа
RTRIM - строка из пробелов
SPACE
Работа с регистром
- нижний регистр
LCASE, LOWER - верхний регистр
UCASE, UPPER
Источники
- https://zen. yandex.ru/media/id/5eba7f439f339d116671be06/osnovnye-komandy-sql-kotorye-doljen-znat-kajdyi-programmist-5f3fac20b7d0fb2734f1df9b
- https://sql-language.ru/select-order-by.html
- https://schoolsw3.com/sql/sql_orderby.php
- https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
- http://old.code.mu/sql/order-by.html
Что такое SQL и как он работает. Microsoft SQL Server
SQL в хранилищах данных: аналитическая обработка данных. Оконные функции T-SQL
Почему SQL Server не гарантирует сортировку результатов без ORDER BY / Хабр
И снова здравствуйте. В июне OTUS вновь запускает курс «MS SQL Server разработчик», традиционно в преддверии старта курса мы начинаем делиться с вами материалом по теме.
Если в вашем запросе отсутствует ORDER BY, то вы не можете быть уверены в том, что сортировка результатов не изменится со временем.
Конечно, поначалу все будет довольно предсказуемо, но по мере того, как происходят изменения (в индексах, таблицах, конфигурации сервера, объеме ваших данных), вы можете столкнуться с некоторыми неприятными сюрпризами.
Давайте начнем с чего-нибудь простого: выполним SELECT для таблицы Users базы данных Stack Overflow. В этой таблице есть кластерный индекс по колонке Id, который начинается с единицы и увеличивается до триллиона. Для этого запроса данные возвращаются в порядке кластерного индекса:
Но если создать индекс на DisplayName и Location, то SQL Server внезапно решит использовать новый индекс, а не кластерный:
Вот план выполнения:
Почему SQL Server решил использовать этот индекс, хотя ему не нужно было сортировать по DisplayName и Location? Потому что этот индекс — наименьшая копия данных, которые необходимо получить. Давайте посмотрим на размеры индексов с помощью sp_BlitzIndex
:
В кластерном индексе (CX/PK) около 8,9 млн строк и его размер 1,1 ГБ.
В некластерном индексе для DisplayName, Location также около 8,9 млн строк, но его размер всего 368 МБ. Если вам нужно сделать scan для получения результатов запроса, то почему бы не выбрать наименьший источник данных, так как это будет быстрее. Именно по этой причине SQL Server поступил таким образом.
Хорошо, теперь, когда у нас есть индекс для DisplayName и Location, давайте попробуем выполнить запрос, который ищет конкретное имя (DisplayName). Результаты получаются отсортированными по DisplayName:
В плане выполнения видно, что используется индекс по DisplayName и Location:
Но если искать по другому значению, то результаты уже не будут отсортированы по DisplayName:
SQL Server обнаружил, что Alex’ов много и более разумно выполнить Clustered Index Scan вместо Index Seek + Key Lookup:
Даже в этих, действительно простых случаях, вы не можете гарантировать, что SQL Server всегда будет использовать ту копию данных, которую вы ожидаете.
В последнее время я столкнулся с гораздо более сложными случаями:
- Удаление индекса, который использовался в запросе
- Включение принудительной параметризации (Forced Parameterization), которая изменяет оценку предполагаемого количества строк, заставляя SQL Server выбирать другой индекс
- Изменение уровня совместимости базы данных (Compatibility Level) с включением нового механизма оценки кардинальности (Cardinality Estimator), который выдает другой вариант плана.
Узнать подробнее о курсе.
SQL ORDER BY | ПРЕДЕЛ SQL — базовый SQL
В этой статье рассматриваются два новых предложения SELECT:
-
ORDER BY
упорядочивает результаты запроса. -
LIMIT
ограничивает результирующий набор фиксированным числом строк.
SQL ЗАКАЗАТЬ ПО
Для каждого запроса можно определить разные порядки.
ORDER BY
влияет только на порядок возврата результирующих записей. Это не влияет на результаты запроса.
Вот таблица Customer , используемая в примерах ORDER BY
и LIMIT
:
Вы хотите получить отчет с атрибутами имя_клиента , адрес электронной почты и дата_последнего_заказа заказанный пользователем имя_клиента . Вот запрос SQL:
ВЫБЕРИТЕ имя_клиента, адрес электронной почты, дату_последнего_заказа ОТ клиента ЗАКАЗАТЬ по customer_name
Вот результаты, заказанные имя_клиента :
имя_клиента | адрес электронной почты | last_order_date |
---|---|---|
Дипали Гупта | [email protected] | 10.10.2020 |
Джон Доу | [email protected] | 09/28/2020 |
Мэри Стэнтон | [email protected] | 28.09.2020 |
Питер Кан | [email protected] | 10.05.2020 |
Вы можете легко изменить критерии заказа. Вот тот же отчет, упорядоченный по атрибуту last_order_date
:
ВЫБЕРИТЕ имя_клиента, адрес электронной почты, дату_последнего_заказа ОТ клиента ЗАКАЗАТЬ ПО last_order_date
Результат:
имя_клиента | адрес электронной почты | last_order_date |
---|---|---|
Мэри Стэнтон | mary@allinoemarket. com | 28.09.2020 |
Питер Кан | [email protected] | 10.05.2020 |
Джон Доу | [email protected] | 28.09.2020 |
Дипали Гупта | [email protected] | 10.10.2020 |
ПРЕДЕЛ SQL
LIMIT
используется для ограничения результирующего набора фиксированным числом строк. Естественно, если полный результирующий набор содержит меньше строк, чем число исправлений, которое мы указали в LIMIT, база данных возвращает меньше записей, чем предельное число.
LIMIT
не является стандартным предложением SQL. Другие диалекты SQL имеют варианты LIMIT
. Например, MS-SQL Server использует TOP, а Oracle использует ROWNUM 9.0007 .
Вот пример, ограничивающий результаты двумя строками:
ВЫБЕРИТЕ customer_id, имя_клиента, адрес электронной почты ОТ клиента ПРЕДЕЛ 2
Вот результат:
customer_id | имя_клиента | адрес электронной почты | last_order_date |
---|---|---|---|
100 | Джон Доу | john. [email protected] | 28.09.2020 |
101 | Мэри Стэнтон | [email protected] | 28.09.2020 |
Запрос может возвращать разные результаты, поскольку вы не уверены в порядке записей в результатах.
Чтобы LIMIT
имело смысл, результаты должны быть упорядочены по некоторым критериям. Решение состоит в том, чтобы объединить ORDER BY
и LIMIT
в одном запросе.
Например, вы хотите получить все атрибуты клиента, разместившего последний заказ. Вот запрос SQL:
ВЫБЕРИТЕ customer_id, customer_name, адрес электронной почты, last_order_date ОТ клиента ЗАКАЗАТЬ ПО last_order_date DESC ПРЕДЕЛ 1
Пункт DESC
, используемый в ORDER BY
. указывает результаты в порядке убывания. В сочетании с LIMIT 1
запрос возвращает одну запись в наборе результатов. В данном случае запись с максимальным значением last_order_date
.
Пример закрытия
В последнем примере объединены все предложения, изученные в этой статье, и оператор SQL SELECT.
Предположим, вашему начальнику нужен отчет о клиентах, разместивших 5 последних заказов во втором квартале. Если два или более клиентов разместили заказ в один и тот же день, отчет должен быть заказан по имени клиента. Вот запрос:
ВЫБЕРИТЕ customer_id, customer_name, адрес электронной почты, last_order_date ОТ клиента ГДЕ last_order_date >= ‘01.04.2020’ AND last_order_date < ‘01.07.2020’ ЗАКАЗАТЬ ПО last_order_date DESC, имя_клиента ASC ПРЕДЕЛ 5
Два столбца, указанные в ORDER BY
. Если имеется одна запись на last_order_date
, результаты располагаются в порядке убывания до last_order_date
, как указано DESC
. Если несколько записей имеют одно и то же значение для last_order_date
, результаты располагаются в порядке возрастания по customer_name, как указано ASC
. Технически, вы можете отказаться от ASC
, так как по умолчанию используется восходящий порядок. Результат:
идентификатор_клиента | имя_клиента | адрес электронной почты | last_order_date |
---|---|---|---|
100 | Джон Доу | [email protected] | 28.09.2020 |
103 | Питер Кан | [email protected] | 10.05.2020 |
До встречи в следующей статье. Изучайте SQL, ваши навыки — это актив!
SQL - ПОРЯДОК ПО
Последнее изменение: 09 августа 2021 г.
По умолчанию результаты возвращаются в том порядке, в котором они хранятся в базе данных. Но иногда вы захотите отсортировать их по-другому. Вы можете сделать это с помощью команды «ORDER BY» в конце ваших запросов, как показано в расширенной версии нашего шаблона SQL здесь
.SELECT [материал, который вы хотите выбрать] FROM [таблица, в которой он находится] ORDER BY [столбец, по которому вы хотите упорядочить];
Например, следующий запрос показывает все треки, упорядоченные по идентификатор_альбома .