SQL запросы: примеры и структура
SQL запросы — это инструкции базе данных: какие данные взять, откуда, как отфильтровать, сгруппировать и отсортировать. Разберём SQL запрос на конкретном примере, а затем посмотрим, как перейти от простого SELECT к запросам с условиями, JOIN и агрегатами.
Обновлено · Команда SQL Arena
Что потренируете
- SELECT и выбор нужных колонок
- FROM и источники данных
- WHERE и фильтрация строк
- GROUP BY и HAVING
- ORDER BY и порядок результата
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
Есть таблицы клиентов и заказов. Для каждого клиента посчитайте только оплаченные заказы. Выведите имя клиента как name, количество оплаченных заказов как paid_orders и их общую сумму как total_amount. Оставьте клиентов с общей суммой не меньше 1400 и отсортируйте результат по сумме от большей к меньшей.
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;
| # | name | paid_orders | total_amount |
|---|---|---|---|
| 1 | Mark | 1 | 3500.00 |
| 2 | Elena | 1 | 2700.00 |
| 3 | Anna | 2 | 2000.00 |
| 4 | Nina | 1 | 1600.00 |
Есть таблицы клиентов и заказов. Для каждого клиента посчитайте только оплаченные заказы. Выведите имя клиента как name, количество оплаченных заказов как paid_orders и их общую сумму как total_amount. Оставьте клиентов с общей суммой не меньше 1400 и отсортируйте результат по сумме от большей к меньшей.
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;
Как написать 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 запроса помогает разбирать ошибки намного быстрее, чем запоминание отдельных конструкций.
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;
| name | paid_orders | total_amount |
|---|---|---|
| Mark | 1 | 3500.00 |
| Elena | 1 | 2700.00 |
| Anna | 2 | 2000.00 |
| Nina | 1 | 1600.00 |
| Oleg | 2 | 1400.00 |
Типичные ошибки при написании SQL запросов
Фильтровать агрегат через WHERE
Условие WHERE SUM(o.amount) >= 1400 не сработает: на этапе WHERE группы и их суммы ещё не рассчитаны. Для условий по COUNT, SUM, AVG и другим агрегатам после GROUP BY используется HAVING.
Забыть условие JOIN
Если соединить customers и orders без ON o.customer_id = c.id, можно получить комбинации несвязанных строк. Количество и сумма заказов станут завышенными, а запрос при этом может формально выполниться без ошибки.
Считать любой SELECT сложным запросом
Простой SQL запрос может состоять только из SELECT и FROM, иногда с WHERE. Сложность появляется не из-за количества строк кода, а из-за нескольких источников, агрегатов, вложенной логики и необходимости правильно учитывать порядок обработки данных.
Задачи по теме в тренажёре
Курс «SQL с нуля»После одного примера полезнее не читать ещё двадцать готовых запросов, а написать их самостоятельно. В SQL Arena есть 1 192 задачи с автопроверкой. У каждой свои таблицы, а решение проверяется на скрытых данных, поэтому запрос должен быть корректным не только для строк, которые видны на экране. Можно начать с простых SQL запросов вроде фильтрации и вычислений, а затем перейти к более сложным. Среди задач этой подборки есть «Крупный заказ или обычный», «Числовой код без сбоев», «Что было внутри сессии», «Затянувшиеся сессии покупателей», «Округлить, не перечисляя», «Медиана в огромном журнале покупок», «Платформы на городской витрине» и «Оплата в масштабе журнала». Для практики доступны PostgreSQL, MySQL, ClickHouse и BigQuery, каждый в отдельной браузерной песочнице.
- EasyбесплатноКрупный заказ или обычныйbigquery
- EasyбесплатноЧисловой код без сбоевbigquery
- EasyбесплатноЧто было внутри сессииbigquery
- EasyбесплатноЗатянувшиеся сессии покупателейbigquery
- MediumPremiumОкруглить, не перечисляяbigquery
- HardPremiumМедиана в огромном журнале покупокbigquery
- ExpertPremiumПлатформы на городской витринеbigquery
- MediumPremiumОплата в масштабе журнала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 задачи