Ключевое слово 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
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, но могут быть указаны во вложенных запросах, определяемых этими инструкциями.
В запросе, содержащем оператор 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
Изменение строк
- вырезание слева
- вырезание справа
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 ORDER BY: Полное руководство
Оператор SQL ORDER BY определяет порядок, в котором записи возвращаются запросом. Вы можете возвращать записи в возрастающем или убывающем порядке по значению любого столбца в таблице.
Упорядочивание результатов запроса упрощает поиск нужных записей.
Например, предположим, что вы хотите знать, какие сотрудники получили награды за наибольшее количество сотрудников месяца. Вы можете упорядочить свой запрос по этой точке данных, чтобы отобразить сотрудника, который первым получил наибольшее количество наград.
Оператор SQL ORDER BY упорядочивает результаты запроса в зависимости от ваших условий. В этом руководстве мы собираемся обсудить, как использовать оператор ORDER BY. Мы рассмотрим пример, который поможет вам освоить это ключевое слово.
Содержание
- SQL ORDER BY
- Пример ORDER BY SQL
- Вывод
SQL ORDER BY
Ключевое слово SQL ORDER BY упорядочивает результаты запроса. Вы можете упорядочить результаты в возрастающем или убывающем порядке по определённому столбцу или набору столбцов.
Вот синтаксис запроса ORDER BY:
SELECT name
FROM employees
ORDER BY name, joined ASC;
После оператора SQL SELECT мы указываем имя столбца, который хотим получить. Затем мы заявляем, что хотим получить данные из таблицы сотрудников.
Оператор ORDER BY упорядочивает наш запрос по имени и объединённым столбцам в порядке убывания. Наша база данных сначала будет отсортирована по именам в порядке убывания.
Если есть несколько человек с одинаковыми именами, то человек, который присоединился последним, появится внизу этих имён.
По умолчанию SQL упорядочивает столбец в порядке возрастания. Вы можете заказать столбец в порядке убывания или убывания с помощью предложения SQL ORDER BY.
Два возможных порядка сортировки:
- ASC: По возрастанию.
- DESC: По убыванию.
Вы можете использовать список столбцов, чтобы упорядочить несколько столбцов в разном порядке:
SELECT name
FROM employees
ORDER BY name ASC, joined DESC;
Этот запрос упорядочивает нашу таблицу по имени в возрастающем порядке. Тогда наш стол заказана вступил в порядке убывания.
Пример ORDER BY SQL
Давайте запустим пример запроса, чтобы продемонстрировать оператор ORDER BY в действии. Мы хотим получить список всех имён сотрудников и титулов для каждого сотрудника. Наша цель — отсортировать этот список в алфавитном порядке по именам сотрудников.
Чтобы получить эти данные, мы могли бы использовать следующий запрос:
SELECT name, title FROM employees ORDER BY name ASC;
Наш запрос сортирует набор результатов. Вот наш набор результатов в порядке возрастания:
имя | заглавие |
Алексис | Сотрудник по продажам |
Джефф | Старший специалист по продажам |
Ханна | Сотрудник по продажам |
Иона | Вице-президент по продажам |
Люк | Сотрудник по продажам |
Майк | Сотрудник по продажам |
Если вы хотите отсортировать в обратном алфавитном порядке, вы должны заменить оператор ASC на DESC.
Вы также можете сортировать по нескольким столбцам. Это может быть полезно, если в вашей таблице есть повторяющиеся значения, которые вы хотите отсортировать.
Например, предположим, что вы хотите узнать, кто работал на вас наиболее короткое время, в порядке их названий. Вы можете сделать это, используя следующий запрос:
SELECT name, title, hired_date FROM employees ORDER BY title, hired_date DESC;
Наш оператор ORDER BY сортирует результаты запроса. Вот результат нашего запроса:
имя | заглавие | hired_date |
Эмма | Директор по маркетингу | 2010-03-19 |
Алексис | Сотрудник по продажам | 2014-04-01 |
Ханна | Сотрудник по продажам | 2011-09-30 |
Майк | Сотрудник по продажам | 2010-03-19 |
Люк | Сотрудник по продажам | 2009-12-03 |
Джефф | Старший специалист по продажам | 2012-03-17 |
Иона | Вице-президент по продажам | 2010-07-23 |
Как видите, наша таблица отсортирована как по должности сотрудника, так и по дате его приёма на работу. Наш оператор ORDER BY успешно отсортировал записи.
Самым недавно нанятым торговым представителем был Алексис. Нашим торговым партнёром, который дольше всех работает в компании, является Люк. Мы также можем увидеть дату приёма на работу всех остальных сотрудников в порядке их должностей.
Вывод
Оператор SQL ORDER BY изменяет порядок, в котором записи возвращаются запросом. Вы можете заказать запрос в возрастающем или убывающем порядке. По умолчанию запрос возвращает данные в порядке возрастания.
Хотите узнать больше о SQL? Прочтите наше руководство по изучению SQL. Вы найдёте лучшие советы по изучению SQL. В нашем руководстве мы подготовили список учебных ресурсов, которые помогут вам развить необходимые навыки. навыки.
sql server — Создайте представление с предложением ORDER BY
Я не уверен, что, по вашему мнению, выполняет этот ORDER BY
? Даже если вы сделаете поместите ORDER BY
в представление законным способом (например, добавив предложение TOP
), если вы просто выберете из представления, например.
SELECT * FROM dbo.TopUsersTest;
без предложения ORDER BY
, SQL Server может возвращать строки наиболее эффективным способом, который не обязательно будет соответствовать ожидаемому порядку. Это потому что ORDER BY
перегружен, поскольку пытается служить двум целям: сортировать результаты и определять, какие строки включать в TOP
. В этом случае всегда выигрывает TOP
(хотя в зависимости от индекса, выбранного для сканирования данных, вы можете заметить, что ваш ордер работает так, как ожидалось, но это просто совпадение). Чтобы выполнить то, что вы хотите, вам нужно добавить предложение ORDER BY
к запросам, извлекающим данные из представления, а не к коду самого представления.
Таким образом, ваш код просмотра должен быть таким:
CREATE VIEW [dbo].[TopUsersTest] КАК ВЫБИРАТЬ u.[DisplayName], SUM(a.AnswerMark) Метки AS ОТ dbo.Users_Questions AS uq ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo]. [Пользователи] AS u ON u.[UserID] = нас.[UserID] ВНУТРЕННЕЕ СОЕДИНЕНИЕ [dbo].[Ответы] КАК ON a.[AnswerID] = uq.[AnswerID] СГРУППИРОВАТЬ ПО u.[DisplayName];
ORDER BY
не имеет смысла, поэтому его даже не следует включать.
Чтобы проиллюстрировать использование AdventureWorks2012, вот пример:
СОЗДАТЬ ВИД dbo.SillyView КАК ВЫБЕРИТЕ ПЕРВЫЕ 100 ПРОЦЕНТОВ SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue ИЗ Sales.SalesOrderHeader ЗАКАЗАТЬ ПО CustomerID; ИДТИ ВЫБЕРИТЕ SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue ИЗ dbo.SillyView;
Результаты:
SalesOrderID OrderDate CustomerID AccountNumber TotalDue ------------ ---------- ---------- -------------- ---- ------ 43659 01.07.2005 29825 10-4020-000676 23153.233943660 01.07.2005 29672 10-4020-000117 1457.3288 43661 01.07.2005 29734 10-4020-000442 36865.8012 43662 01.07.2005 29994 10-4020-000227 32474.9324 43663 01.07.2005 29565 10-4020-000510 472. 3108
И вы можете видеть из плана выполнения, что TOP
и ORDER BY
были полностью проигнорированы и оптимизированы SQL Server:
Оператор TOP
вообще отсутствует, и никакой сортировки. SQL Server полностью их оптимизировал.
Теперь, если вы измените представление, сказав ORDER BY SalesID
, вы просто получите порядок, указанный в представлении, но только — как упоминалось ранее — по совпадению.
Но если вы измените свой внешний запрос, чтобы выполнить ORDER BY
, который вы хотели:
SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue ИЗ dbo.SillyView ЗАКАЗАТЬ ПО CustomerID;
Вы получаете результаты, упорядоченные так, как вы хотите:
SalesOrderID OrderDate CustomerID AccountNumber TotalDue ------------ ---------- ---------- -------------- ---- ------ 43793 22.07.2005 11000 10-4030-011000 3756.989 51522 22.07.2007 11000 10-4030-011000 2587. 8769 57418 04.11.2007 11000 10-4030-011000 2770.2682 51493 20.07.2007 11001 10-4030-011001 2674.0227 43767 18.07.2005 11001 10-4030-011001 3729.364
И план по-прежнему оптимизировал TOP
/ ORDER BY
в представлении, но добавлена сортировка (заметьте, немалая стоимость) для представления результатов, упорядоченных по CustomerID
:
Итак, мораль истории, не ставьте ORDER BY в представлениях. Поместите ORDER BY в запросы, которые на них ссылаются. И если сортировка требует больших затрат, вы можете подумать о добавлении/изменении индекса для ее поддержки.
Примеры кода предложения SQL ORDER BY
Автор: Эрик Блинн | Обновлено: 20 декабря 2021 г. | Комментарии | Связанный: Подробнее > TSQL
Проблема
Я пишу SQL и мне нужно отсортировать результаты. Похоже на ЗАКАЗ BY должны быть ключевыми словами, которые мне нужны. Как работает ORDER BY? Какие вещи я могу сортировать? Влияет ли это на производительность? Есть ли какие-либо лучшие практики в отношении ORDER BY, которым я должен следовать?
Решение
В этом учебнике по SQL подробно описывается предложение ORDER BY для инструкции SQL. много разных примеров и вариантов использования.
Все демонстрации в этом совете будут запускаться на SQL Server 2019 и ссылаться на образец базы данных WideWorldImporters, который можно скачать бесплатно с Github.
Основы предложения SQL ORDER BY
Предложение ORDER BY Оператор SQL SELECT идет в конце. Оно включает ключевые слова ORDER BY, за которыми следует ряд выражений (ASC | DESC), по которым данные должны быть отсортированы (по возрастанию или по убыванию).
Эти выражения обычно представляют собой столбцы, но они не обязательно должны быть столбцами. Они также могут быть вычислениями или порядковыми номерами столбцов. Допустимо смешивание и сопоставлять различные типы выражений в одном и том же предложении ORDER BY. Выражения также не обязательно должны быть частью вывода запроса. Будут примеры каждый из этих сценариев в демонстрациях ниже.
Предложение ORDER BY может иметь неограниченное количество выражений, но будет действительным даже с синглтоном. Когда в ORDER BY несколько выражений предложения, то они разделяются запятой.
Размер всех суммируемых выражений ограничен 8060 байтами. Редко можно увидеть сценарий, в котором проверяется этот верхний предел размера, поскольку на практике большинство предложений ORDER BY ограничено тремя выражениями или менее.
Направление сортировки устанавливается независимо для каждого выражения. После каждого выражение дополнительное ключевое слово ASC или DESC скажет SQL Server отсортировать это выражение по возрастанию или по убыванию соответственно. По возрастанию по умолчанию поэтому, если ни ключевое слово ASC, ни ключевое слово DESC не включены, выражение будет отсортировано по возрастанию. По этой причине крайне редко можно увидеть на практике ключевое слово ASC.
При сортировке по возрастанию даты и время сортируются от самых старых к самым новым и числа отсортированы от меньшего к большему. Метод сортировки текстовых столбцов определяется базой данных Уровень ПОДБОРКИ. Для баз данных, использующих английский язык, это обычно означает, что текстовые столбцы сортируются в алфавитном порядке так как наиболее распространенные и стандартные уровни COLLATION сортируются таким образом.
SQL ORDER BY с существующими столбцами
Считайте это очень простым ВЫБЕРИТЕ оператор в следующем запросе:
SELECT * FROM Sales.Orders;
Поскольку порядок сортировки не был определен, выходные данные этого оператора сортируются по кластеризованный индекс.
Небольшое изменение запроса для включения предложения ORDER BY и выражения «Идентификатор человека-продавца ASC» изменяет вывод, упорядочивая все строки по продавцу. (имя столбца), начиная с продавцом 2. Этот запрос будет работать точно так же без ключевого слова «АСЦ» так как это порядок сортировки по умолчанию. На практике АСК почти никогда не включают и не будет включен ни в какие другие сценарии в этом руководстве.
SELECT * FROM Sales.Orders ЗАКАЗАТЬ ПО SalespersonPersonID ASC;
Изменение этого запроса для использования DESC вместо ASC (или пробела) строки для продавца 20 вверх, а строки для продавца 2 вниз в отсортированном наборе результатов. Вот синтаксис:
SELECT * FROM Sales.Orders ЗАКАЗАТЬ ПО SalespersonPersonID DESC;
SQL ORDER BY Вычисляемые столбцы
Этот запрос создает вычисляемый столбец с именем PreTaxAmt. Сортировка по этому столбца так же просто, как повторно ввести псевдоним столбца как выражение в ORDER пункт ПО. Обратите внимание, что направление сортировки не объявлено, поэтому по умолчанию будет использоваться восходящее направление.
Существует также второе выражение, это сортировка по StockItemID по убыванию заказ. Это означает, что каждый раз, когда существует повторяющееся значение PreTaxAmt, эти строки будут сортироваться по StockItemID. См. следующую инструкцию SQL:
.ВЫБЕРИТЕ ИНВОЙСЛайнИД , Количество , Цена за единицу товара , Количество * Цена за единицу как PreTaxAmt , Расширенная цена , Идентификатор товара ИЗ Sales.InvoiceLines ЗАКАЗ ПО PreTaxAmt, StockItemID DESC;
Самые низкие элементы PreTaxAmt теперь находятся вверху. Когда есть повтор PreTaxAmt значения, как в строке 1-4, они отсортированы по StockItemID. Это происходит снова в ряды 5-9где все строки имеют 3,20 для суммы до налогообложения и отсортированы с 14 вниз до 11 в StockItemID. Добавление 3 рд Выражение в предложении ORDER BY помогло бы дополнительно отсортировать результаты. где первые 2 выражения были одинаковыми в 2 или более строках, например в строках 1-3. Выражение 3 rd будет игнорироваться в ситуациях, когда первые 2 выражения не соответствуют соседнему ряд как в ряду 4.
Представьте, что компания запросила информацию о продавце с наибольшее количество продаж за данный месяц, как указано в предложении WHERE. Запрос должен будет рассчитать количество заказов а затем отсортировать по этому количеству заказов. Запрос может выглядеть примерно так.
ВЫБЕРИТЕ SalespersonPersonID, COUNT(*) как OrderCount ОТ Продаж.Заказов ГДЕ OrderDate МЕЖДУ «01.01.2013» и «31.01.2013» СГРУППИРОВАТЬ ПО SalespersonPersonID ЗАКАЗАТЬ ПО OrderCount DESC;
Ведущий продавец будет перемещен в начало этого запроса. Проблема заключается в том, что бизнес действительно хочет видеть только лучших продавцов, а не всех других. В следующем разделе этот запрос будет переведен на следующий уровень.
SQL ORDER BY с TOP
Продолжая предыдущий пример, бизнес должен видеть только верхнюю строку, чтобы определить у какого продавца был лучший месяц. Это достигается путем добавления Предложение TOP в начало оператора. Это лучшая практика, когда использование предложения TOP, чтобы всегда включать ORDER BY в сочетании. Использование ТОП без ORDER BY может привести к неожиданным результатам, поскольку порядок сортировки не может быть гарантировано.
SELECT TOP 1 SalespersonPersonID, COUNT(*) as OrderCount ОТ Продаж.Заказов ГДЕ OrderDate МЕЖДУ «01.01.2013» и «31.01.2013» СГРУППИРОВАТЬ ПО SalespersonPersonID ЗАКАЗАТЬ ПО OrderCount DESC;
В этом примере бизнес может даже не захотеть видеть количество заказов. Возможно, им просто нужно знать, какой продавец был первым в отчете. Логичный Первым шагом было бы просто удалить COUNT (*) из части SELECT запроса. ограничение вывода до SalespersonPersonID. Но внесение этого изменения приносит об ошибке, поскольку предложение ORDER BY в настоящее время ссылается на псевдоним столбца который был определен в операторе SELECT, который был только что удален.
Чтобы выполнить то, о чем просил бизнес, расчет необходимо будет ввести в выражение предложения ORDER BY, как показано в примере ниже. Теперь это запрос сортируется по столбцу, который не существует в выходных данных. Это вполне разумный вариант использования.
ВЫБЕРИТЕ TOP 1 SalespersonPersonID ОТ Продаж.Заказов ГДЕ OrderDate МЕЖДУ «01.01.2013» и «31.01.2013» СГРУППИРОВАТЬ ПО SalespersonPersonID ЗАКАЗАТЬ ПО СЧЕТУ(*) DESC;
SQL ORDER BY с порядковыми номерами
Выражения ORDER BY, показанные до сих пор, были столбцами, псевдонимами столбцов, или расчеты. Есть еще вариант, который можно использовать только при сортировке по столбцам, которые находятся в выходных данных запроса. SQL Server позволяет использовать выражение быть просто числом, которое ссылается на расположение столбца в операторе выбора.
Выходные данные этого примера запроса содержат 6 столбцов.
Если выходные данные запроса необходимо отсортировать по PreTaxAmt, то число 4 можно использовать в качестве аргумента вместо псевдонима столбца или вычисления.
ВЫБЕРИТЕ ИНВОЙСЛайнИД , Количество , Цена за единицу товара , Количество * Цена за единицу как PreTaxAmt , Расширенная цена , Идентификатор товара ИЗ Sales.InvoiceLines ЗАКАЗАТЬ ПО 4 DESC;
Несмотря на то, что это очень удобный ярлык для игры в SSMS или ADS, он не то, что должно когда-либо идти в производство. Использование порядковых номеров столбцов для сортировки — важный антишаблон T-SQL. Слишком легко изменить запрос, добавив или удалив его. столбец, а затем внезапное изменение порядка сортировки без предупреждения.
SQL ORDER BY Влияние на производительность
Сортировка набора результатов обычно требует затрат. Значение этого стоимость зависит от нескольких факторов. Сколько строк нужно отсортировать? Есть индекс, который поддерживает этот вид? Планировал ли SQL Server сортировку сюда?
Измерить влияние этого довольно просто. Рассмотрим этот запрос, который имеет операция сортировки.
ВЫБЕРИТЕ SL.InvoiceID, InvoiceDate, AP.FullName, SL.Description ОТ Продажи.Счета-фактуры СИ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Sales.InvoiceLines SL ON SI.InvoiceID = SL.InvoiceID INNER JOIN [Application].People AP ON SI.SalespersonPersonID = AP.PersonID ГДЕ SalespersonPersonID = 8 И Дата выставления счета МЕЖДУ '7.01.2013' И '20.01.2013' ЗАКАЗАТЬ ПО дате счета-фактуры;
Выполнение этого запроса и включение план выполнения дает этот вывод. В самом конце плана запроса на вверху слева показана эта операция сортировки, на которую ушло 7% от общего объема работ.
Если тип запроса отрицательно влияет на производительность, рассмотрите возможность изменения индексы для поддержки сортировки — если это возможно — или рассмотрите возможность принудительной операции сортировки клиенту. Многие инструменты отчетности очень хорошо сортируют наборы результатов и не будет бороться с запросом.
Заключительные мысли
SQL ORDER BY — невероятно полезный инструмент, который должен быть в наборе инструментов модуля записи T-SQL, и, надеюсь, он дал некоторое представление о том, как его можно использовать для поиска наименьшего значения, наибольшего значения, данных в алфавитном порядке, определенном порядке, и т.д.
Следующие шаги
- Ознакомьтесь с этими дополнительными советами:
- SQL ORDER BY Пункт
- ВЫБЕРИТЕ с ЗАКАЗАТЬ ПО
- Расширенное использование SQL Server ORDER BY Пункт
- Избегайте ORDER BY в представлениях SQL Server
- SQL Server 101
- Оператор SQL Server IN
- SQL Server НЕ В операторе
- SQL Server не равен оператору
- Настройка запросов с планами выполнения
- Некоторые сложные ситуации при работе с SQL Server NULL
- Присоединяйтесь к таблицам SQL Server, в которых столбцы содержат значения NULL