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 |
Питер Кан | pcan@canmarkets. com | 10.05.2020 |
Вы можете легко изменить критерии заказа. Вот тот же отчет, упорядоченный по атрибуту last_order_date
:
ВЫБЕРИТЕ имя_клиента, адрес электронной почты, дату_последнего_заказа ОТ клиента ЗАКАЗАТЬ ПО last_order_date
Результат:
имя_клиента | адрес электронной почты | last_order_date |
---|---|---|
Мэри Стэнтон | [email protected] | 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 Джон Доу [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
Написав значительное количество сценариев SQL, вы, вероятно, достигнете плато производительности. Вы извлекаете информацию, используя одни и те же стратегии, и сталкиваетесь с одними и теми же типами ошибок.
К счастью, вы можете улучшить свой опыт написания запросов, если поймете, как оцениваются предложения в SQL.
7 этапов порядка выполнения SQL
- FROM/JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- ЗАКАЗАТЬ ДО
- LIMIT/OFFSET
Здесь мы обсудим порядок выполнения в SQL и почему это важно.
Каков порядок выполнения SQL?
Запросы SQL придерживаются определенного порядка при оценке предложений, аналогично тому, как математические операции придерживаются PEMDAS или BODMAS.
С точки зрения пользователя, запросов начинаются с первого предложения и заканчиваются последним предложением. Однако при выполнении запросы не читаются сверху вниз.
Порядок выполнения предложений в запросах следующий.
1. FROM/JOIN
Предложения FROM и/или JOIN выполняются в первую очередь для определения интересующих данных.
2. WHERE
Предложение WHERE выполняется для фильтрации записей, не соответствующих ограничениям.
3. GROUP BY
Предложение GROUP BY выполняется для группировки данных на основе значений в одном или нескольких столбцах.
4. HAVING
Предложение HAVING выполняется для удаления созданных сгруппированных записей, не соответствующих ограничениям.
5. SELECT
Предложение SELECT выполняется для получения всех нужных столбцов и выражений.
6. ORDER BY
Предложение ORDER BY выполняется для сортировки производных значений в порядке возрастания или убывания.
7. LIMIT/OFFSET
Наконец, операторы LIMIT и/или OFFSET выполняются для сохранения или пропуска указанного количества строк.
Подробнее о SQLКак использовать SQL в Python
Пример порядка выполнения SQL
Чтобы проиллюстрировать порядок выполнения в SQL, лучше всего использовать пример. У нас есть две таблицы под названием «Заказы» и «Продукты», в которых подробно описаны покупки канцелярских товаров.
Таблица заказов. | Изображение: таблица Aashish NairProducts. | Изображение: Аашиш Наир Используя эти таблицы, мы хотим выяснить, кто потратил вторую по величине сумму денег на ручки.
Мы можем получить ответ с помощью следующего запроса:
-- Найти человека, который потратил вторую по величине сумму на ручки
ВЫБЕРИТЕ O.имя,
СУММ(O.количество*P.цена) AS total_spent
ОТ Заказы О
ПРИСОЕДИНЯЙТЕСЬ к продуктам P
ON O.product_id = P.id
ГДЕ P.name = 'Перо'
СГРУППИРОВАТЬ ПО O.name
ЗАКАЗАТЬ ПО total_spent DESC
ПРЕДЕЛ 1 СМЕЩЕНИЕ 1;
Вывод кода. | Изображение: Aashish Nair Ответ успешно выведен, но как он вообще получен?
Как указывалось ранее, пользователь может читать запрос, начиная с предложения SELECT и заканчивая предложением OFFSET, но SQL не читает предложения сверху вниз. Вместо этого он получает ответ, выполняя следующие шаги:
- Предложения FROM и JOIN объединяют таблицы «Продукты» и «Заказы» для получения общих данных, представляющих интерес.
- Предложение WHERE удаляет записи, в которых ручки не были куплены.
- Предложение GROUP BY группирует записи по имени.
- Предложение HAVING удаляет группы, которые тратят более 2000 на ручки.
- Предложение SELECT выводит покупателей и их соответствующую сумму, потраченную на ручки.
- Предложение ORDER BY сортирует результаты по общей сумме, потраченной на ручки, в порядке убывания.
- Предложения LIMIT и OFFSET пропускают первую строку и сохраняют только следующую запись, которая содержит человека, потратившего второе место на ручки.
Произошла ошибка.
Невозможно выполнить JavaScript. Попробуйте посмотреть это видео на сайте www.youtube.com или включите JavaScript, если он отключен в вашем браузере.
Учебник по порядку выполнения SQL. | Видео: ByteByteGo Подробнее о SQLRecursive SQL-выражении с визуальным объяснением
Почему важен порядок выполнения SQL
Порядок выполнения в SQL на первый взгляд может показаться неважным. В конце концов, если запросы приносят желаемые результаты, кого волнует, как оцениваются предложения?
Однако пользователям, незнакомым с порядком выполнения, будет сложно писать более сложные запросы, потому что любые возникающие проблемы будет труднее отлаживать. Тем, кто хочет с большей легкостью устранять ошибки, будет полезно понять порядок, в котором читаются предложения в SQL.
Например, распространенной ошибкой в SQL является неправильное указание псевдонимов столбцов.
Мы можем выделить эту ошибку, используя таблицы «Заказы» и «Продукты», чтобы ответить на другой вопрос: Кто из тех, кто потратил менее 50 долларов, потратил на заказ больше всего денег?
Мы можем рассчитать общие деньги, потраченные на заказ, умножив переменную цены в таблице «Продукты» на переменную количества в таблице «Заказы» и назвав это выражение псевдонимом total_spent
.
Посмотрим, какой ответ выдаст следующий запрос:
-- покупки с общей суммой расходов менее 50
ВЫБЕРИТЕ O.имя,
(P.цена * O.количество) AS total_spent
ОТ Заказы О
ПРИСОЕДИНЯЙТЕСЬ к продуктам P
ON O.product_id = P.id
ГДЕ total_spent < 50
ЗАКАЗАТЬ ПО total_spent DESC
Вывод кода. | Изображение: Аашиш Наир Это вызывает ошибку. Что происходит?
Пользователь, незнакомый с порядком выполнения, может не заметить проблему с использованием псевдонима столбца «total_spent»
в предложении WHERE, поэтому запрос может показаться правильным на первый взгляд.
Однако, если вы знаете порядок выполнения в SQL, становится ясно, что, поскольку псевдоним столбца создается в предложении SELECT, которое вычисляется после предложения WHERE, SQL не будет содержать этот псевдоним при оценке предложения WHERE. Это то, что создает ошибку.
Теперь, когда мы можем определить источник ошибки, мы можем исправить ее, не используя псевдоним столбца в выражении предложения WHERE.