SQL для новичков: первые запросы, которые приносят результат
С нуля к делу: 12 готовых рецептов SELECT-запросов, фильтры, сортировка, группировки и простой JOIN. В статье вы увидите первую пользу от SQL.
Что такое SQL в двух словах?
SQL (Structured Query Language) — язык, чтобы спрашивать базу данных о фактах: «Сколько заказов?», «Какие товары дороже 50?», «Кто не сделал ни одной покупки?».
Базовый набор команд для чтения:
SELECT— какие столбцы взять;FROM— из какой таблицы;WHERE— какие строки оставить;ORDER BY— как отсортировать;LIMIT— сколько строк вернуть;JOIN— как склеить таблицы между собой;GROUP BY+ агрегаты (COUNT,SUM,AVG,MIN,MAX) — сгруппировать и посчитать.

Наша мини-база для примеров
Таблица users
id | name | city | |
|---|---|---|---|
1 | Anna Ivanova | anna@example.com | Moscow |
2 | Ivan Petrov | ivan@company.ru | Saint-P |
3 | Lee Kim | lee.kim@example.com | — |
Таблица products
id | title | price |
|---|---|---|
1 | Keyboard | 39.9 |
2 | Mouse | 19.9 |
3 | Monitor 24" | 149.0 |
Таблица orders
id | user_id | product_id | qty | created_at |
|---|---|---|---|---|
1 | 1 | 1 | 1 | 2025-09-01 |
2 | 1 | 3 | 1 | 2025-09-03 |
3 | 2 | 2 | 2 | 2025-09-05 |
Самый первый запрос:
SELECT *
FROM users;
SELECT name, city
FROM users;
Фильтрация: WHERE
SELECT name, email
FROM users
WHERE city = 'Moscow';
SELECT title, price
FROM products
WHERE price > 20;
SELECT title, price
FROM products
WHERE price BETWEEN 20 AND 150;
SELECT name, city
FROM users
WHERE city IN ('Moscow', 'Saint-P');
SELECT email
FROM users
WHERE email LIKE '%@example.com';
SELECT name
FROM users
WHERE city IS NULL;
Сортировка и ограничение: ORDER BY + LIMIT
SELECT title, price
FROM products
ORDER BY price ASC
LIMIT 2;
SELECT id, user_id, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 5;
Уникальные значения: DISTINCT
SELECT DISTINCT city
FROM users
WHERE city IS NOT NULL;
Группировки и агрегаты: GROUP BY
SELECT user_id, COUNT(*) AS orders_count
FROM orders
GROUP BY user_id;
SELECT p.title, SUM(o.qty * p.price) AS total_revenue
FROM orders o
JOIN products p ON p.id = o.product_id
GROUP BY p.title
ORDER BY total_revenue DESC;
SELECT p.title, SUM(o.qty * p.price) AS total_revenue
FROM orders o
JOIN products p ON p.id = o.product_id
GROUP BY p.title
HAVING SUM(o.qty * p.price) > 100;
Простые JOIN'ы без боли
SELECT u.name, p.title, o.qty, o.created_at
FROM orders o
JOIN users u ON u.id = o.user_id
JOIN products p ON p.id = o.product_id
ORDER BY o.created_at DESC;
SELECT u.name, MAX(o.created_at) AS last_order
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.name
ORDER BY last_order DESC NULLS LAST;

12 быстрых рецептов для работы
-- 1. Последние 5 заказов
SELECT * FROM orders ORDER BY created_at DESC LIMIT 5;
-- 2. Пользователи с доменом example.com
SELECT name, email FROM users WHERE email LIKE '%@example.com';
-- 3. Топ-3 товара по выручке
SELECT p.title, SUM(o.qty * p.price) AS revenue
FROM orders o JOIN products p ON p.id = o.product_id
GROUP BY p.title
ORDER BY revenue DESC
LIMIT 3;
-- 4. Пользователи без города
SELECT * FROM users WHERE city IS NULL;
-- 5. Товары в ценовом коридоре
SELECT * FROM products WHERE price BETWEEN 20 AND 150;
-- 6. Количество заказов по дням
SELECT DATE(created_at) AS day, COUNT(*) AS cnt
FROM orders
GROUP BY DATE(created_at)
ORDER BY day;
-- 7. Сколько разных городов
SELECT COUNT(DISTINCT city) FROM users WHERE city IS NOT NULL;
-- 8. Сумма корзины конкретного заказа
SELECT SUM(o.qty * p.price) AS total
FROM orders o JOIN products p ON p.id = o.product_id
WHERE o.id = :id;
-- 9. Все товары, которые покупал Иван
SELECT p.title
FROM orders o
JOIN users u ON u.id = o.user_id
JOIN products p ON p.id = o.product_id
WHERE u.name = 'Ivan Petrov';
-- 10. Заказы за последние 7 дней
SELECT * FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '7 DAY';
-- 11. Первые N строк для быстрой проверки
SELECT * FROM users LIMIT 10;
-- 12. Уникальные домены email
SELECT DISTINCT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;
Если хочется практики и коротких объяснений — в Кодик мы разбираем SQL на живых задачах, от простых выборок до аналитики с агрегациями. Без воды, с интерактивом.
Ещё у нас есть активный telegram-канал, где мы обсуждаем крутые идеи, делимся опытом и вместе разбираем задачи — учиться становится не только полезно, но и весело.
Вопрос в вам: Какая часть SQL пугает больше всего: JOIN, GROUP BY или загадочный NULL? Напишите, что хотите разобрать в следующей статье.