База данных — это место, где хранится информация в структурированном виде. Она похожа на таблицу Excel: есть строки (записи) и столбцы (поля). Но база данных обычно находится на сервере, и к ней можно обращаться из разных программ.
SQL (Structured Query Language) — язык, на котором мы пишем запросы к базе данных. С помощью запроса можно:
- получить нужные данные (например, все продажи за вчера);
- добавить, изменить или удалить записи;
- соединить данные из нескольких таблиц.
Для работы с SQL нужна СУБД (система управления базами данных). Самые популярные: MySQL, PostgreSQL, SQLite. Везде SQL почти одинаковый.
Получение данных: SELECT и FROM
Самый частый запрос — получить данные из таблицы.
SELECT * FROM sales;
SELECT — говорим, что хотим выбрать данные.
- — означает «все поля» (столбцы).
FROM — указываем, из какой таблицы берём данные.
sales — имя таблицы.
Если нужны не все столбцы, а только некоторые, перечисляем их через запятую:
SELECT product_name, price FROM sales;
Уникальные значения — если нужно убрать дубликаты, используем DISTINCT:
SELECT DISTINCT category FROM products;
Эта команда покажет только разные категории (например, «Смартфоны», «Ноутбуки») без повторений.
Условия: WHERE
Чтобы выбрать не все строки, а только те, которые подходят под условие, добавляем WHERE.
Числовые условия: =, <> (не равно), >, <, >=, <=.
SELECT * FROM sales WHERE amount > 100;
Покажет продажи, где количество товара больше 100.
Текстовые условия: LIKE (похоже на) или NOT LIKE.
SELECT * FROM products WHERE category LIKE 'смартфон';
Покажет только товары из категории «смартфон».
Список значений: IN.
SELECT * FROM products WHERE category IN ('смартфон', 'планшет');
Подойдут товары, у которых категория — смартфон или планшет.
Важно помнить про типы данных:
- числа (integer, decimal) — пишем без кавычек: price > 5000
- текст (varchar) — в кавычках: name LIKE 'iPhone'
- даты (date) — обычно в кавычках: order_date = '2025-01-01'
Сортировка: ORDER BY
Чтобы отсортировать результат, используем ORDER BY. По умолчанию сортировка по возрастанию (от меньшего к большему). Для убывания добавляем DESC.
SELECT * FROM products ORDER BY price DESC;
Товары от дорогих к дешёвым.
SELECT * FROM sales ORDER BY sale_date;
Продажи от самой ранней даты к поздней.
Ограничение количества строк: LIMIT
Если нужно посмотреть только первые несколько строк (например, топ-10), пишем LIMIT.
SELECT * FROM products ORDER BY price DESC LIMIT 5;
Пять самых дорогих товаров.
Соединение таблиц: JOIN
Данные аналитика часто лежат в разных таблицах. Например:
- таблица sales — продажи (код товара, дата, количество)
- таблица products — описание товара (код товара, название, цена)
Нам нужно вывести продажу вместе с названием товара. Для этого соединяем таблицы по общему ключу (обычно это код товара).
INNER JOIN — берём только те записи, которые есть в обеих таблицах. Если, например, товар ни разу не продавался, он не попадёт в результат.
SELECT s.sale_date, p.product_name, s.quantity
FROM sales AS s
INNER JOIN products AS p ON s.product_code = p.product_code;
AS s и AS p — короткие имена (алиасы) для таблиц, чтобы не писать длинные названия.
ON — указываем, по каким полям соединяем.
LEFT JOIN — берём все записи из левой таблицы (которая указана после FROM), а из правой — только те, которые соединились. Если данных в правой таблице нет, вместо них будет NULL. Это полезно, чтобы не терять строки из основной таблицы.
SELECT p.product_name, s.sale_date
FROM products AS p
LEFT JOIN sales AS s ON p.product_code = s.product_code;
Здесь мы увидим все товары, даже те, которые никогда не продавались (у них в колонке sale_date будет пусто).
RIGHT JOIN используется редко (его можно заменить на LEFT, поменяв таблицы местами).
Агрегатные функции
Агрегатные функции вычисляют одно значение по группе строк:
- SUM() — сумма
- COUNT() — количество строк
- AVG() — среднее арифметическое
- MIN() — минимум
- MAX() — максимум
SELECT SUM(amount) FROM sales;
-- общая сумма проданных товаров (в штуках)
SELECT COUNT(*) FROM sales;
-- сколько всего продаж (строк в таблице sales)
SELECT AVG(price) FROM products;
-- средняя цена товара
SELECT MIN(price), MAX(price) FROM products;
-- минимальная и максимальная цена
Группировка: GROUP BY
Агрегатные функции сами по себе дают одну итоговую строку. Но часто нужно посчитать суммы или количество по категориям, дням, товарам. Тогда используем GROUP BY.
SELECT category, COUNT(*) AS cnt
FROM products
GROUP BY category;
Покажет, сколько товаров в каждой категории. AS cnt даёт понятное имя столбцу.
SELECT product_code, SUM(quantity) AS total_sold
FROM sales
GROUP BY product_code;
Сколько всего штук каждого товара продано.
SELECT sale_date, COUNT(*) AS orders_count
FROM sales
GROUP BY sale_date
ORDER BY sale_date;
Количество продаж по дням.
Важно: в SELECT при использовании GROUP BY можно перечислять только те столбцы, которые входят в GROUP BY, или агрегатные функции. Например, нельзя просто взять product_name, если группируем по product_code (если несколько товаров с одинаковым кодом — но код обычно уникален).
Объединение результатов нескольких запросов: UNION
UNION позволяет склеить результаты двух или более запросов один под другим. Важно, чтобы в каждом запросе было одинаковое количество столбцов и совместимые типы данных.
SELECT product_name FROM products
UNION
SELECT customer_name FROM customers;
Выведет в одном столбце все названия товаров и все имена клиентов (уникальные, дубликаты убираются). Если нужны все строки с повторами, используйте UNION ALL.
Пример для аналитика: нужно получить список всех уникальных email-ов и из таблицы клиентов, и из таблицы сотрудников.
SELECT email FROM clients
UNION
SELECT email FROM employees;
Правильный порядок операторов в запросе
Когда вы пишете сложный запрос, соблюдайте эту последовательность (именно так SQL понимает команды):
- SELECT — какие поля выводим
- DISTINCT — если нужны уникальные значения
- FROM — откуда берём данные (основная таблица)
- JOIN — соединения с другими таблицами
- ON — условия соединения (после каждого JOIN)
- WHERE — фильтрация строк
- GROUP BY — группировка
- HAVING — фильтрация после группировки (редко, не рассматривали)
- ORDER BY — сортировка
- LIMIT — ограничение количества строк
Пример комплексного запроса
SELECT
p.category,
SUM(s.quantity) AS total_quantity
FROM sales AS s
INNER JOIN products AS p ON s.product_code = p.product_code
WHERE s.sale_date >= '2025-01-01'
GROUP BY p.category
ORDER BY total_quantity DESC
LIMIT 3;
Что делает: берёт продажи с начала января, соединяет с товарами, группирует по категориям, считает общее количество проданных единиц в каждой категории, сортирует от большего к меньшему и показывает только топ‑3 категории.
Коротко о подзапросах и HAVING (для расширения)
Подзапрос — запрос внутри запроса. Например, найти товары, цена которых выше средней:
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
HAVING — как WHERE, но для групп. Используется после GROUP BY:
SELECT category, SUM(quantity) AS total
FROM sales
JOIN products ON sales.product_code = products.product_code
GROUP BY category
HAVING total > 1000;
Покажет только те категории, где сумма продаж превышает 1000 штук.
Этих знаний достаточно для большинства аналитических задач: вы сможете выгружать данные, фильтровать, соединять таблицы, делать сводки и сортировать результаты. SQL — практический инструмент, поэтому главное — постоянно писать запросы и проверять, что получается.