CodeRang
С чего начать

SQL запросы: примеры и структура

SQL запросы — это инструкции базе данных: какие данные взять, откуда, как отфильтровать, сгруппировать и отсортировать. Разберём SQL запрос на конкретном примере, а затем посмотрим, как перейти от простого SELECT к запросам с условиями, JOIN и агрегатами.

Обновлено · Команда SQL Arena

Что потренируете

  • SELECT и выбор нужных колонок
  • FROM и источники данных
  • WHERE и фильтрация строк
  • GROUP BY и HAVING
  • ORDER BY и порядок результата

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Найдите клиентов с оплатами от 1400

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

Запрос 1PostgreSQLv16
SELECT c.name,
       COUNT(o.id) AS paid_orders,
       SUM(o.amount) AS total_amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
HAVING SUM(o.amount) >= 1400
ORDER BY total_amount DESC;
Отправить
Результатcustomersorders
Ответ принят

Как написать SQL запрос шаг за шагом

Начните не с синтаксиса, а с результата. Здесь нужны три значения: имя клиента, число оплаченных заказов и их сумма. Поэтому в SELECT появляются c.name, COUNT(o.id) и SUM(o.amount). Таблицы две, поэтому после FROM customers добавляется JOIN orders. Условие o.customer_id = c.id связывает каждый заказ с его клиентом. Без этого условия база не поймёт, какие строки двух таблиц относятся друг к другу.

WHERE выполняет фильтрацию до группировки. Условие o.status = 'paid' исключает отменённые заказы, поэтому COUNT и SUM работают только с оплатами. Затем GROUP BY собирает оставшиеся строки по клиентам. HAVING применяется уже к получившимся группам: SUM(o.amount) >= 1400 оставляет только клиентов, которые прошли порог по общей сумме. Это важное различие: WHERE фильтрует исходные строки, HAVING — результат группировки.

В тексте SQL запрос пишется как SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY. Но логический порядок выполнения другой: сначала определяется источник и соединяются таблицы, затем применяется WHERE, строятся группы, проверяется HAVING, формируется SELECT и только после этого результат сортируется ORDER BY. Из-за этого, например, агрегат SUM нельзя просто поставить в WHERE. Понимание порядка выполнения SQL запроса помогает разбирать ошибки намного быстрее, чем запоминание отдельных конструкций.

SQLPostgreSQL v16
SELECT c.name,
       COUNT(o.id) AS paid_orders,
       SUM(o.amount) AS total_amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
HAVING SUM(o.amount) >= 1400
ORDER BY total_amount DESC;
Результат запроса
namepaid_orderstotal_amount
Mark13500.00
Elena12700.00
Anna22000.00
Nina11600.00
Oleg21400.00

Типичные ошибки при написании SQL запросов

01

Фильтровать агрегат через WHERE

Условие WHERE SUM(o.amount) >= 1400 не сработает: на этапе WHERE группы и их суммы ещё не рассчитаны. Для условий по COUNT, SUM, AVG и другим агрегатам после GROUP BY используется HAVING.

02

Забыть условие JOIN

Если соединить customers и orders без ON o.customer_id = c.id, можно получить комбинации несвязанных строк. Количество и сумма заказов станут завышенными, а запрос при этом может формально выполниться без ошибки.

03

Считать любой SELECT сложным запросом

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

Задачи по теме в тренажёре

Курс «SQL с нуля»

После одного примера полезнее не читать ещё двадцать готовых запросов, а написать их самостоятельно. В SQL Arena есть 1 192 задачи с автопроверкой. У каждой свои таблицы, а решение проверяется на скрытых данных, поэтому запрос должен быть корректным не только для строк, которые видны на экране. Можно начать с простых SQL запросов вроде фильтрации и вычислений, а затем перейти к более сложным. Среди задач этой подборки есть «Крупный заказ или обычный», «Числовой код без сбоев», «Что было внутри сессии», «Затянувшиеся сессии покупателей», «Округлить, не перечисляя», «Медиана в огромном журнале покупок», «Платформы на городской витрине» и «Оплата в масштабе журнала». Для практики доступны PostgreSQL, MySQL, ClickHouse и BigQuery, каждый в отдельной браузерной песочнице.

Справочник по теме

Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.

Частые вопросы

Как написать SQL запрос?

Сначала сформулируйте, какие строки и колонки должны оказаться в результате. Затем выберите таблицы в FROM, задайте связи через JOIN, ограничения строк через WHERE и только после этого добавляйте группировку, агрегаты и сортировку. Проверяйте запрос по частям, а не пытайтесь написать всю конструкцию сразу.

Как выглядит простой SQL запрос SELECT?

Базовый вариант выглядит как SELECT column FROM table. Затем можно добавить WHERE для фильтрации и ORDER BY для сортировки. Даже на простых запросах полезно явно выбирать нужные колонки вместо SELECT *.

Какой порядок выполнения SQL запроса?

Упрощённо: FROM и JOIN, затем WHERE, GROUP BY, HAVING, SELECT, ORDER BY и ограничение результата. Это не совпадает с порядком написания операторов. Разница особенно важна при работе с агрегатами и псевдонимами.

Какие бывают типы запросов SQL?

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

Попробуйте написать запрос сами

В бесплатном тарифе SQL Arena доступно 292 задачи на PostgreSQL, MySQL, ClickHouse и BigQuery без привязки карты. Если запрос не проходит проверку, можно разобрать причину и исправить его, а не просто сравнивать текст с готовым ответом.

Решать SQL задачи