Что такое SQL простыми словами: реляционная база, таблицы и запросы
Что такое SQL и реляционная база данных: таблица, строка и колонка, первый запрос с результатом, JOIN, команды языка, СУБД и диалекты, что SQL умеет и чего не умеет.
Содержание статьи
Менеджер продукта спрашивает: сколько пользователей пришло из каждого канала? Данные лежат в таблице на 4 613 строк, по строке на человека. В Excel вы бы построили сводную таблицу. В базе данных вы пишете четыре строки на SQL, и база возвращает ответ из четырёх строк: organic — 1 747, referral — 1 037, paid_search — 1 015, partner — 814. SQL — язык, на котором задают такие вопросы базе данных. Ниже — что он собой представляет, как устроена реляционная база, из чего состоит запрос, чем PostgreSQL отличается от ClickHouse и с чего начать. Все запросы выполнены на учебной базе SQL-курса, их можно повторить в песочнице и получить те же числа.
Что такое SQL в одном абзаце
SQL (Structured Query Language, язык структурированных запросов) — язык, на котором читают и меняют данные в реляционных базах. Он декларативный: вы описываете, какой результат нужен, а не как его получить. «Дай число пользователей по каждому каналу» — это запрос. В каком порядке читать строки, какой индекс взять и как считать группы, решает сама база.
Язык придумали в IBM в 1970-х. В 1974 году Дональд Чемберлин и Рэймонд Бойс описали его под названием SEQUEL, позже название сократили до SQL. В основе лежит реляционная модель данных, которую Эдгар Кодд предложил в 1970 году. Стандарт появился в 1986 году в ANSI и в 1987-м в ISO. Действующая редакция — SQL:2023, ISO/IEC 9075:2023.
Читают название двумя способами: «эс-кью-эль» и «сиквел». Оба правильные, в русской речи чаще звучит первый.
- SQL — язык запросов, а не программа. Программа, которая хранит данные и выполняет запросы, называется СУБД: PostgreSQL, MySQL, ClickHouse, DuckDB.
- Реляционная база хранит данные в таблицах. Строка — один объект, колонка — одно его свойство.
- Запрос — это текст. Его можно сохранить, отправить коллеге и выполнить завтра с тем же результатом.
- Аналитик большую часть времени пишет один вид запросов —
SELECT: читает, фильтрует, группирует и соединяет таблицы.
Что такое реляционная база данных
Реляционная база — это набор таблиц со строгой структурой. У каждой таблицы есть имя и фиксированный набор колонок, у каждой колонки — тип. Таблицы связаны между собой через значения: в таблице платежей записан user_id, и по нему платёж находит своего владельца в таблице пользователей.
Слово «реляционная» часто объясняют как «таблицы связаны друг с другом». Это не совсем так. В модели Кодда отношение (relation) — это и есть таблица: множество строк с одинаковым набором колонок. Связи между таблицами — важная часть реляционных баз, но название пришло из математики, а не из них.
Учебная база SQL-курса, на которой посчитаны примеры, — это реляционная база SaaS-сервиса. В ней пять таблиц: пользователи, события в продукте, платежи, подписки и участники эксперимента. Всего 45 185 строк.
| Таблица | Одна строка — это | Строк |
|---|---|---|
| users | зарегистрированный пользователь | 4 613 |
| events | действие в продукте | 35 341 |
| payments | платёж | 1 251 |
| subscriptions | подписка | 912 |
| experiment_exposures | участник эксперимента | 3 068 |
Таблица, строка, колонка: из чего состоит таблица SQL
Таблица users хранит пользователей. Одна строка — один человек. Колонок пять: user_id — номер пользователя, signup_date — дата регистрации, channel — откуда пришёл, country — страна, device — устройство.
У каждой колонки есть тип. user_id — INTEGER, целое число. signup_date — DATE, дата. Остальные три — VARCHAR, текст. Тип не даёт записать в дату слово «вчера» и определяет, что с колонкой можно делать: даты вычитать, числа складывать, текст сравнивать.
Если значение неизвестно, в ячейке стоит NULL. Это не ноль и не пустая строка, а отметка «значения нет». В учебной базе страна не заполнена у 55 человек из 4 613. Поэтому count(*) вернёт 4 613, а count(country) — 4 558: вторая функция считает только заполненные значения.
У каждой строки должен быть признак, по которому её можно найти однозначно. В users это user_id: 4 613 строк, 4 613 разных номеров. Такая колонка называется первичным ключом, а колонка, которая ссылается на неё из другой таблицы, — внешним ключом.
Первый запрос и его результат
Самый простой полезный запрос — посмотреть несколько строк таблицы. Он отвечает на вопрос «как выглядят данные», и с него начинается работа с любой незнакомой таблицей.
Читается он почти как английская фраза. SELECT — какие колонки показать. FROM — из какой таблицы. ORDER BY — в каком порядке. LIMIT — сколько строк вернуть. Без ORDER BY база вправе отдать строки в любом порядке, и «первые пять» при следующем запуске могут оказаться другими.
| user_id | signup_date | channel | country | device |
|---|---|---|---|---|
| 1 | 2026-06-01 | partner | RU | desktop |
| 2 | 2026-06-01 | referral | RU | mobile |
| 3 | 2026-06-01 | partner | BY | mobile |
| 4 | 2026-06-01 | organic | RU | desktop |
| 5 | 2026-06-01 | organic | AM | desktop |
SELECT user_id, signup_date, channel, country, device
FROM users
ORDER BY user_id
LIMIT 5;Что такое SQL-запрос: части и порядок выполнения
Запрос состоит из частей, каждая отвечает за своё. Ниже запрос, в котором работают все основные: он берёт регистрации августа, считает их по каналам, оставляет каналы, где больше 300 человек, сортирует и возвращает три строки.
Пишутся части в одном порядке, а выполняются логически в другом. Сначала база берёт таблицу (FROM), отбрасывает лишние строки (WHERE), собирает группы (GROUP BY), отбрасывает лишние группы (HAVING), вычисляет колонки результата (SELECT), сортирует (ORDER BY) и обрезает (LIMIT). Поэтому в WHERE нельзя написать count(*) > 300: групп на этом шаге ещё нет, для такого условия и существует HAVING.
Из того же порядка следует, что в WHERE по стандарту нельзя сослаться на псевдоним, который задан в SELECT. PostgreSQL на такой запрос отвечает ошибкой column "doubled" does not exist. DuckDB, на котором работает песочница курса, это разрешает. Такие мелкие расхождения между базами называют диалектами.
| Часть | Что делает | Обязательна |
|---|---|---|
| SELECT | перечисляет колонки и выражения результата | да |
| FROM | называет таблицу или соединение таблиц | почти всегда |
| WHERE | оставляет строки, для которых условие истинно | нет |
| GROUP BY | собирает строки в группы для count, sum, avg | нет |
| HAVING | оставляет группы по условию на агрегат | нет |
| ORDER BY | задаёт порядок строк результата | нет |
| LIMIT | ограничивает число строк | нет |
SELECT channel, count(*) AS users -- 5. что показать
FROM users -- 1. откуда
WHERE signup_date >= DATE '2026-08-01' -- 2. какие строки
GROUP BY channel -- 3. как сгруппировать
HAVING count(*) > 300 -- 4. какие группы оставить
ORDER BY users DESC -- 6. порядок
LIMIT 3; -- 7. сколько строк
-- organic 672, paid_search 533, referral 393
-- partner (297) отсеял HAVINGКак SQL соединяет таблицы
Сила реляционной базы видна, когда ответ лежит в двух таблицах. Вопрос «сколько выручки принёс каждый канал» требует платежей из payments и канала из users. В Excel это ВПР по 1 251 строке платежей. В SQL — одно соединение, JOIN, по общей колонке user_id.
Результат: organic — $14 114, referral — $9 326, partner — $4 732, paid_search — $2 467. В сумме $30 639, ровно столько, сколько во всей таблице платежей. Эта сверка — первая привычка аналитика: после соединения итог должен совпасть с итогом исходной таблицы.
Соединение не всегда безопасно. Если у одной строки слева несколько пар справа, строк становится больше, и сумма растёт вместе с ними. В учебной базе соединение платежей с событиями по user_id даёт 11 667 строк и «выручку» $284 913 — в 9,3 раза больше настоящей. Запрос при этом выполняется без ошибок. Как этого избежать, разобрано в статьях про JOIN и про ключи.
Результат запроса выше. Сумма по каналам — $30 639, как во всей таблице payments. Учебная база SQL-курса.
SELECT u.channel,
count(DISTINCT p.user_id) AS payers,
sum(p.amount) AS revenue
FROM payments p
JOIN users u ON u.user_id = p.user_id
GROUP BY u.channel
ORDER BY revenue DESC;
-- organic 410 / 14114, referral 278 / 9326,
-- partner 138 / 4732, paid_search 86 / 2467Какие команды есть в SQL
Команды SQL принято делить на группы по тому, что они делают. Деление учебное, в стандарте оно устроено сложнее, но на собеседованиях и в тестах спрашивают именно его.
Аналитику почти всё время нужна одна группа — чтение данных. Создавать таблицы и менять строки приходится реже: для своих промежуточных расчётов, для витрин, иногда для загрузки файла. Права доступа и транзакции обычно остаются инженерам и администраторам.
| Группа | Команды | Для чего | Как часто нужна аналитику |
|---|---|---|---|
| DQL — запросы | SELECT | прочитать и посчитать данные | каждый день |
| DML — изменение данных | INSERT, UPDATE, DELETE | добавить, изменить, удалить строки | иногда |
| DDL — определение структуры | CREATE, ALTER, DROP | создать или изменить таблицу | иногда |
| DCL — доступ | GRANT, REVOKE | выдать или отозвать права | редко |
| TCL — транзакции | BEGIN, COMMIT, ROLLBACK | выполнить изменения целиком или никак | редко |
СУБД и диалекты: PostgreSQL, MySQL, ClickHouse, DuckDB
SQL — язык, а выполняет его конкретная программа, СУБД (система управления базами данных). Основа у всех общая: SELECT, WHERE, GROUP BY, JOIN работают одинаково. Расходятся функции, особенно для дат и строк, и отдельные правила. Такие варианты языка называют диалектами.
Первую половину курса можно пройти, не замечая диалекта. Разница вылезает на датах: начало месяца в PostgreSQL и DuckDB — date_trunc('month', d), в ClickHouse — toStartOfMonth(d) (есть и date_trunc), в SQL Server — DATETRUNC(month, d) начиная с версии 2022, а в MySQL такой функции нет, и начало месяца собирают через DATE_FORMAT.
Второе частое место — ограничение числа строк. LIMIT 5 понимают PostgreSQL, MySQL, ClickHouse и DuckDB. SQL Server пишет SELECT TOP 5. Стандартную форму FETCH FIRST 5 ROWS ONLY понимает, например, PostgreSQL.
| СУБД | Где обычно встречается | Первые 5 строк | Начало месяца |
|---|---|---|---|
| PostgreSQL | база продукта, аналитические реплики | LIMIT 5 | date_trunc('month', d) |
| MySQL | веб-приложения и сайты | LIMIT 5 | DATE_FORMAT(d, '%Y-%m-01') |
| SQL Server | корпоративные системы на стеке Microsoft | TOP 5 | DATETRUNC(month, d), с версии 2022 |
| ClickHouse | большие журналы событий, аналитика в реальном времени | LIMIT 5 | toStartOfMonth(d) |
| DuckDB | анализ файлов на ноутбуке, встроенная аналитика | LIMIT 5 | date_trunc('month', d) |
Реляционные и нереляционные базы данных
Не все базы хранят данные в таблицах. Документные базы вроде MongoDB хранят записи как вложенные документы, похожие на JSON. Хранилища «ключ — значение» вроде Redis быстро отдают значение по известному ключу, но считать по многим записям сразу почти не умеют. Графовые базы вроде Neo4j хранят узлы и связи между ними.
Такие базы выбирают разработчики под задачу приложения. Аналитик с ними работает реже: данные из них обычно выгружают в аналитическое хранилище, и там они снова лежат в таблицах, которые читают на SQL.
| Модель | Как хранит | Пример | Язык запросов |
|---|---|---|---|
| реляционная | таблицы с фиксированными колонками | PostgreSQL, MySQL, ClickHouse | SQL |
| документная | вложенные документы с разной структурой | MongoDB | свой язык запросов |
| ключ — значение | пары «ключ → значение» | Redis | команды по ключу |
| графовая | узлы и связи | Neo4j | Cypher |
Что SQL умеет, а чего нет
SQL хорошо делает то, что нужно для большинства рабочих вопросов: отбирает строки, считает суммы и доли по группам, соединяет таблицы, работает с датами, сравнивает строку с предыдущей через оконные функции. Считает он там, где лежат данные, поэтому таблица на сотни миллионов строк не должна помещаться в память вашего ноутбука.
Хуже SQL справляется с тем, что лежит за пределами таблиц. Графики строят в BI-системе или в Python. Статистические тесты, регрессии и модели удобнее считать в Python или R. Разбор свободного текста и сложная пошаговая логика на SQL пишутся тяжело.
И главное ограничение: SQL не проверяет смысл. Запрос с лишним соединением, забытым фильтром на неполный день или NULL в неожиданном месте выполнится и вернёт правдоподобное число. Ошибку находят не по сообщению базы, а сверкой с контрольным числом, посчитанным другим путём.
- Умеет: фильтры, группировки, соединения, даты, окна, подзапросы, промежуточные шаги через CTE.
- Умеет плохо: графики, статистические тесты, модели, разбор текста.
- Не умеет: понять, что вы спросили не то. Это остаётся за аналитиком.
Кому нужен SQL
Аналитику данных и продуктовому аналитику SQL нужен каждый день: почти любой вопрос о продукте начинается с выборки из базы. Менеджеру продукта и маркетологу он даёт возможность проверить цифру самому, не дожидаясь очереди к аналитику. Разработчику и тестировщику — посмотреть, что на самом деле записалось в базу.
Объём у всех разный. Продуктовому аналитику нужны соединения, окна, даты и уверенная проверка своих чисел. Менеджеру часто хватает SELECT, WHERE, GROUP BY и одного JOIN, чтобы ответить на свой вопрос и не ошибиться в знаменателе.
С чего начать изучение SQL
Порядок почти всегда один. Сначала SELECT, FROM и WHERE: научиться доставать нужные строки. Затем агрегаты и GROUP BY: считать людей, события и деньги и не путать одно с другим. Потом JOIN: соединять таблицы и следить, чтобы строки не размножались. Дальше CASE, NULL и CTE, работа с датами, подзапросы и оконные функции.
Практиковаться лучше на базе, похожей на рабочую, и на вопросах, которые задал бы менеджер. Учебная база курса устроена так: пользователи, события, платежи, подписки и эксперимент. В песочнице курса любой запрос из этой статьи выполняется без установки и регистрации. Первые главы курса — устройство базы, SELECT и WHERE — открыты бесплатно.
Частые вопросы
SQL — это язык программирования? Это язык запросов. На нём описывают, какие данные нужны, а не последовательность шагов. У многих СУБД есть процедурные расширения — например, PL/pgSQL в PostgreSQL, — где уже есть переменные, циклы и условия, но аналитику они нужны редко.
Чем SQL отличается от MySQL? SQL — язык, MySQL — одна из программ, которые его выполняют. Так же, как PostgreSQL, ClickHouse или DuckDB.
Сколько времени нужно, чтобы выучить SQL? Базовые запросы — SELECT, WHERE, GROUP BY, JOIN — осваивают за несколько недель регулярной практики. Уверенность в собственных числах приходит дольше: она строится на задачах, где ответ можно проверить.
Нужна ли математика? Для запросов — школьная арифметика и проценты. Статистика понадобится позже, когда вы начнёте сравнивать группы и проверять эксперименты.
Итог
SQL — язык, на котором задают вопросы реляционной базе. База хранит данные в таблицах, строка — объект, колонка — свойство, ключи связывают таблицы. Запрос описывает результат, а СУБД решает, как его получить. Основа языка одинакова в PostgreSQL, MySQL, ClickHouse и DuckDB, различаются функции и мелкие правила.
Лучший следующий шаг — выполнить запросы из этой статьи самому и получить те же числа: 4 613 пользователей, четыре канала, $30 639 выручки. Потом — разобраться, как устроены ключи, и перейти к SELECT и WHERE на задачах.
Материалы по теме
CASE WHEN в SQL: сегменты, условные метрики и порядок условий
CASE WHEN в SQL на учебной базе продукта: синтаксис, сегменты пользователей, почему порядок WHEN меняет ответ, ELSE и NULL, CASE внутри COUNT, в GROUP BY и ORDER BY.
Функции даты в SQL: текущая дата, разница дат, EXTRACT и формат
Справочник функций даты в SQL на учебной базе: текущая дата, часть даты, date_trunc, разница дат в днях, часах и месяцах, интервалы, формат вывода и отличия СУБД.
Ошибки в SQL-запросах: тексты сообщений, причины и исправления
Частые ошибки SQL с дословными текстами PostgreSQL и DuckDB: GROUP BY, column does not exist, ambiguous, division by zero, типы и даты, и пять запросов, которые молча врут.