1. Основы реляционных баз данных и проектирование первого запроса SELECT
Основы реляционных баз данных и проектирование первого запроса SELECT
Представьте себе крупнейший мировой маркетплейс, где каждую секунду совершаются тысячи транзакций, обновляются остатки на складах в сотнях городов и меняются статусы доставки. Если бы эти данные хранились в обычных текстовых файлах или гигантских таблицах Excel, система бы коллапсировала под собственным весом в первый же час работы. Проблема не только в объеме, но и в связях: как быстро узнать, какой именно курьер везет заказ пользователю, который зарегистрировался пять лет назад, если информация о курьерах, заказах и пользователях разбросана по разным местам? Решением этой задачи стали реляционные базы данных — технология, которая удерживает каркас цифрового мира уже более сорока лет.
Анатомия реляционной модели: почему таблицы «общаются»
В основе реляционного подхода лежит простая, но гениальная идея Эдгара Кодда, математика из IBM, который в 1970 году предложил хранить данные в виде набора взаимосвязанных таблиц. Само слово "реляционный" происходит от английского relation (отношение), что в математическом смысле и означает таблицу.
Главный принцип здесь — декомпозиция. Мы не пытаемся впихнуть все атрибуты мира в одну "плоскую" таблицу. Вместо этого мы разделяем сущности. В базе данных интернет-магазина будет отдельная таблица для Users (пользователи), отдельная для Products (товары) и отдельная для Orders (заказы).
Чтобы эти таблицы не превратились в изолированные острова, используются ключи.
user_id или order_number. Главное требование: он никогда не повторяется и не может быть пустым.Orders обязательно будет колонка user_id. Она не содержит имени или адреса клиента, а лишь указывает на соответствующую строку в таблице Users.Такая структура обеспечивает целостность данных. Если пользователь сменит фамилию, нам нужно обновить ровно одну строчку в таблице Users. Во всех миллионах его заказов фамилия "обновится" автоматически, так как заказы лишь ссылаются на ID этого пользователя. В аналитике это критически важно: вы всегда работаете с актуальным состоянием системы, а не с разрозненными копиями данных.
Декларативность SQL: приказывай, а не объясняй
SQL (Structured Query Language) — это язык, на котором мы общаемся с реляционными СУБД (системами управления базами данных), такими как PostgreSQL, MySQL, Oracle или SQL Server. Его ключевое отличие от языков программирования вроде Python или Java заключается в его декларативности.
В императивном программировании вы пишете алгоритм: "Открой файл, создай цикл, проверь каждую строку, если условие совпадает — положи в список". В SQL вы описываете желаемый результат: "Дай мне имена пользователей, которые совершили покупку вчера". Вы не указываете серверу, как именно перебирать файлы на диске или какие индексы использовать — СУБД сама планирует выполнение запроса.
Для аналитика это означает, что фокус смещается с написания кода на понимание структуры данных. Ваша задача — правильно сформулировать вопрос к базе.
Базовый синтаксис SELECT: фундамент любого отчета
Любой путь в анализе данных начинается с оператора SELECT. Это команда, которая приказывает базе данных "выбрать" или "извлечь" определенные столбцы. Но SELECT никогда не ходит в одиночку; его обязательным спутником является ключевое слово FROM, указывающее на источник данных.
Рассмотрим простейшую структуру:
Здесь column1 и column2 — это названия полей (столбцов), которые вы хотите увидеть в итоговой выгрузке, а table_name — имя таблицы, где они хранятся.
Выбор всех данных
Иногда, при первом знакомстве с новой таблицей, аналитику нужно взглянуть на все доступные данные. Для этого используется символ "звездочка":Символ * означает "все столбцы". Однако в профессиональной среде использование "звездочки" считается плохим тоном (антипаттерном), если только вы не делаете быстрый разовый просмотр. Почему?
Псевдонимы (Aliases) для чистоты кода
В реальных базах данных названия столбцов часто бывают техническими и неудобными для восприятия, напримерusr_reg_dt_utc. Чтобы сделать отчет понятным для конечного пользователя или BI-инструмента, используются псевдонимы с ключевым словом AS.Обратите внимание: мы можем не только переименовывать существующие поля, но и создавать вычисляемые столбцы прямо "на лету". В примере выше мы умножили месячную зарплату на 12, создав новый виртуальный столбец в итоговой выборке. Оригинальные данные в таблице при этом не изменились — SQL-запрос работает только на чтение.
Типы данных и их влияние на точность анализа
Прежде чем проектировать сложные запросы, аналитик должен понимать, с чем он работает. В реляционных базах каждый столбец имеет строго определенный тип. Если вы попытаетесь сложить "строку" с "числом", база выдаст ошибку.
Основные категории типов данных:
INTEGER (целые числа): ID, количество товаров, возраст.
- NUMERIC или DECIMAL (числа с фиксированной точностью): деньги. Здесь важно использовать именно этот тип, а не FLOAT, чтобы избежать ошибок округления ( должно быть строго , а не ).
VARCHAR(n): строки переменной длины (имена, адреса).
- TEXT: длинные тексты без жесткого ограничения.
DATE: только дата (2023-10-25).
- TIMESTAMP: дата и время с точностью до миллисекунд. Для аналитики глобальных сервисов критически важен подтип TIMESTAMP WITH TIME ZONE, чтобы не запутаться в заказах из Токио и Нью-Йорка.
BOOLEAN: принимает значения TRUE, FALSE или NULL.Загадка NULL: отсутствие информации
NULL — это не ноль и не пустая строка. Это специальное состояние, означающее "значение неизвестно" или "данные отсутствуют".
Если у клиента в базе поле middle_name равно NULL, это значит, что мы не знаем его отчества (или его нет). Любая математическая операция с NULL даст в результате NULL. Например, . Это важнейший нюанс при расчете средних чеков или суммарной выручки, о котором мы будем подробно говорить в темах про агрегацию.Проектирование запроса: от бизнес-задачи к коду
Профессиональная аналитика начинается не с написания SELECT, а с анализа структуры. Представим задачу: "Получить список всех уникальных должностей, которые занимают сотрудники в нашем филиале, и узнать их текущую ставку налога".
Шаг 1: Поиск источника
Мы открываем схему базы данных (ER-диаграмму) и находим таблицуemployees. Видим там столбцы job_title и tax_rate.Шаг 2: Обеспечение уникальности (DISTINCT)
Если в компании 50 менеджеров, обычныйSELECT job_title выведет слово "Менеджер" 50 раз. Нам же нужны уникальные значения. Для этого используется оператор DISTINCT.
DISTINCT работает по всей строке выборки. Если вы укажете SELECT DISTINCT job_title, department, то запрос вернет уникальные пары "должность + отдел".
Шаг 3: Ограничение выборки (LIMIT)
Когда вы работаете с таблицами на миллиарды строк (Big Data), выполнение простогоSELECT * может "подвесить" вашу рабочую станцию или создать избыточную нагрузку на сервер. Для первичного ознакомления всегда используйте LIMIT.
Этот запрос вернет только первые 10 строк. В разных СУБД синтаксис может отличаться (например, TOP 10 в SQL Server или FETCH FIRST 10 ROWS ONLY в Oracle), но концепция везде одинакова — беречь ресурсы.
Логический порядок выполнения запроса
Это один из самых важных моментов для понимания SQL. Тот порядок, в котором мы пишем запрос, не совпадает с тем порядком, в котором его выполняет база данных.
Мы пишем:
SELECT (что взять)FROM (откуда взять)База данных выполняет:
FROM (сначала нужно найти таблицу на диске)SELECT (из найденной таблицы вырезать нужные столбцы)Почему это важно? Если вы создали псевдоним в SELECT (например, salary * 12 AS annual_salary), вы не сможете использовать этот псевдоним в некоторых других частях запроса (например, в фильтрации, которую мы разберем в следующей главе), потому что на момент начала обработки данных база еще "не знает" о существовании вашего псевдонима. Она еще только открывает таблицу.
Практические аспекты: комментарии и форматирование
Работа аналитика — это командная работа. Ваш код будут читать коллеги, а через три месяца — и вы сами. Плохо отформатированный запрос — источник ошибок.
Сравните:
SELECT emp_id,f_name,l_name,sal FROM emps WHERE dept='sales' LIMIT 5;
И профессиональный стиль:
Используйте:
-- для однострочных комментариев./ ... / для многострочных комментариев.SELECT, если их больше трех.SELECT, FROM), а названия таблиц и колонок — в нижнем (это стандарт де-факто, хотя SQL нечувствителен к регистру ключевых слов).Подготовка данных для BI-инструментов
Аналитик часто пишет SQL-запросы не для того, чтобы просто посмотреть на цифры в консоли, а чтобы создать "витрину данных" для Tableau, Power BI или Superset. Инструменты визуализации любят чистые, плоские таблицы.
При проектировании первого запроса для BI учитывайте:
cnt_u_7d пишите active_users_weekly.Граничные случаи и частые ошибки новичков
Одной из самых частых ошибок является попытка выбрать столбец, которого нет в источнике, или опечатка в названии. SQL очень строг: одна пропущенная запятая между именами столбцов приведет к тому, что база воспримет второе имя как псевдоним для первого.
Пример ошибки:
В этом случае вы получите один столбец с заголовком user_name, но внутри будут данные из user_id. Это может привести к катастрофическим ошибкам в аналитических выводах.
Еще один нюанс — работа с регистрами в названиях таблиц. В некоторых СУБД (например, PostgreSQL) названия без кавычек автоматически приводятся к нижнему регистру. Если ваша таблица называется Users, а вы пишете FROM users, всё будет хорошо. Но если кто-то создал таблицу в двойных кавычках "Users", то запрос SELECT * FROM Users (без кавычек) может выдать ошибку "Table not found". Всегда придерживайтесь единого стиля именования в своей базе (обычно это snake_case).
Роль метаданных: как узнать, что внутри?
Прежде чем написать свой первый SELECT, профессиональный аналитик изучает информационную схему. В большинстве СУБД есть системная таблица information_schema.columns. Выполнив запрос к ней, вы можете получить список всех столбцов и их типов в незнакомой базе:
Это позволяет "прощупать" почву, не загружая сами данные. Понимание метаданных — это признак перехода от уровня "я просто копирую запросы" к уровню "я понимаю, как устроена система".
Реляционная модель и оператор SELECT — это точка входа в мир больших данных. Несмотря на кажущуюся простоту, именно здесь закладывается фундамент производительности и точности всех будущих отчетов. Понимание того, как данные распределены по таблицам и как правильно обращаться к ним, минимизируя нагрузку на систему, отличает профессионального аналитика от любителя. В следующей части мы научимся не просто забирать все данные из таблицы, а ювелирно отсекать лишнее, используя мощные инструменты фильтрации.