Все материалы
Продуктовая аналитикагайдстарт

Что такое SQL простыми словами: реляционная база, таблицы и запросы

Что такое SQL и реляционная база данных: таблица, строка и колонка, первый запрос с результатом, JOIN, команды языка, СУБД и диалекты, что SQL умеет и чего не умеет.

КПКейсПрактика23 сентября 2026 г.13 мин

Менеджер продукта спрашивает: сколько пользователей пришло из каждого канала? Данные лежат в таблице на 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_idsignup_datechannelcountrydevice
12026-06-01partnerRUdesktop
22026-06-01referralRUmobile
32026-06-01partnerBYmobile
42026-06-01organicRUdesktop
52026-06-01organicAMdesktop
Пять первых пользователей по номеру
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
ЧастьЧто делаетОбязательна
SELECTперечисляет колонки и выражения результатада
FROMназывает таблицу или соединение таблицпочти всегда
WHEREоставляет строки, для которых условие истиннонет
GROUP BYсобирает строки в группы для count, sum, avgнет
HAVINGоставляет группы по условию на агрегатнет
ORDER BYзадаёт порядок строк результатанет
LIMITограничивает число строкнет
Регистрации августа по каналам, где их больше 300
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 принято делить на группы по тому, что они делают. Деление учебное, в стандарте оно устроено сложнее, но на собеседованиях и в тестах спрашивают именно его.

Аналитику почти всё время нужна одна группа — чтение данных. Создавать таблицы и менять строки приходится реже: для своих промежуточных расчётов, для витрин, иногда для загрузки файла. Права доступа и транзакции обычно остаются инженерам и администраторам.

Группы команд 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 5date_trunc('month', d)
MySQLвеб-приложения и сайтыLIMIT 5DATE_FORMAT(d, '%Y-%m-01')
SQL Serverкорпоративные системы на стеке MicrosoftTOP 5DATETRUNC(month, d), с версии 2022
ClickHouseбольшие журналы событий, аналитика в реальном времениLIMIT 5toStartOfMonth(d)
DuckDBанализ файлов на ноутбуке, встроенная аналитикаLIMIT 5date_trunc('month', d)

Реляционные и нереляционные базы данных

Не все базы хранят данные в таблицах. Документные базы вроде MongoDB хранят записи как вложенные документы, похожие на JSON. Хранилища «ключ — значение» вроде Redis быстро отдают значение по известному ключу, но считать по многим записям сразу почти не умеют. Графовые базы вроде Neo4j хранят узлы и связи между ними.

Такие базы выбирают разработчики под задачу приложения. Аналитик с ними работает реже: данные из них обычно выгружают в аналитическое хранилище, и там они снова лежат в таблицах, которые читают на SQL.

Реляционная и нереляционные модели
МодельКак хранитПримерЯзык запросов
реляционнаятаблицы с фиксированными колонкамиPostgreSQL, MySQL, ClickHouseSQL
документнаявложенные документы с разной структуройMongoDBсвой язык запросов
ключ — значениепары «ключ → значение»Redisкоманды по ключу
графоваяузлы и связиNeo4jCypher

Что 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 на задачах.

Продолжить чтение
Вся библиотека