SQL для новичков: первые запросы, которые приносят результат

С нуля к делу: 12 готовых рецептов SELECT-запросов, фильтры, сортировка, группировки и простой JOIN. В статье вы увидите первую пользу от SQL.

Разработка

6 мин

Что такое SQL в двух словах?

SQL (Structured Query Language) — язык, чтобы спрашивать базу данных о фактах: «Сколько заказов?», «Какие товары дороже 50?», «Кто не сделал ни одной покупки?».

Базовый набор команд для чтения:

  • SELECT — какие столбцы взять;

  • FROM — из какой таблицы;

  • WHERE — какие строки оставить;

  • ORDER BY — как отсортировать;

  • LIMIT — сколько строк вернуть;

  • JOIN — как склеить таблицы между собой;

  • GROUP BY + агрегаты (COUNT, SUM, AVG, MIN, MAX) — сгруппировать и посчитать.

Наша мини-база для примеров

Таблица users

id

name

email

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? Напишите, что хотите разобрать в следующей статье.

Комментарии