Order sql: Сортировка данных в SQL, оператор order by

SQL ORDER BY | ПРЕДЕЛ SQL — базовый SQL

В этой статье рассматриваются два новых предложения SELECT:

  • ORDER BY упорядочивает результаты запроса.
  • LIMIT ограничивает результирующий набор фиксированным числом строк.

SQL ЗАКАЗАТЬ ПО

Для каждого запроса можно определить разные порядки.

ORDER BY влияет только на порядок возврата результирующих записей. Это не влияет на результаты запроса.

Вот таблица Customer , используемая в примерах ORDER BY и LIMIT : имя_клиента адрес электронной почты last_order_date 100 Джон Доу [email protected] 28.09.2020 101 Мэри Стэнтон [email protected] 28.09.2020 102 Дипали Гупта dipali.

[email protected] 10.10.2020 103 Питер Кан [email protected] 10.05.2020

Вы хотите получить отчет с атрибутами имя_клиента , адрес электронной почты и дата_последнего_заказа , заказанный имя_клиента . Вот запрос 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

  1. FROM/JOIN
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ЗАКАЗАТЬ ДО
  7. 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 не читает предложения сверху вниз. Вместо этого он получает ответ, выполняя следующие шаги:

  1. Предложения FROM и JOIN объединяют таблицы «Продукты» и «Заказы» для получения общих данных, представляющих интерес.
  2. Предложение WHERE удаляет записи, в которых ручки не были куплены.
  3. Предложение GROUP BY группирует записи по имени.
  4. Предложение HAVING удаляет группы, которые тратят более 2000 на ручки.
  5. Предложение SELECT выводит покупателей и их соответствующую сумму, потраченную на ручки.
  6. Предложение ORDER BY сортирует результаты по общей сумме, потраченной на ручки, в порядке убывания.
  7. Предложения 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.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *