SQL с нуля: Практический курс для начинающих аналитиков

Курс предназначен для абсолютных новичков, желающих освоить SQL для решения аналитических задач. Вы на практике научитесь понимать структуру баз данных, создавать таблицы, писать запросы, объединять и группировать данные.

1. Введение в базы данных и создание таблиц

Введение в базы данных и создание таблиц

Представьте, что вы решили открыть небольшую кофейню. В первый день к вам пришли десять покупателей. Вы легко записали их заказы в блокнот. Через месяц клиентов стало сто, и вы перенесли учет в таблицу Excel. Но через год ваша кофейня превратилась в федеральную сеть: ежедневно совершаются сотни тысяч транзакций, обновляются остатки на складах, начисляются бонусы по программам лояльности. Обычная электронная таблица зависнет при попытке открыть такой объем информации.

Для работы с массивами данных, которые требуют надежного хранения, быстрого поиска и одновременного доступа множества пользователей, используются базы данных (БД).

Что такое реляционные базы данных и СУБД

Сами по себе данные — это просто файлы на жестком диске сервера. Чтобы мы могли с ними удобно работать, существует специальная программа — Система управления базами данных (СУБД). Именно она принимает наши команды, находит нужную информацию и возвращает результат. Самые популярные СУБД в аналитике — это PostgreSQL, MySQL и Microsoft SQL Server.

В современной аналитике чаще всего используются реляционные базы данных. Слово «реляционный» происходит от английского relation (отношение), но на практике это означает, что данные хранятся в виде двумерных таблиц, которые связаны между собой.

!Иерархия хранения данных: от сервера до конкретной ячейки

Чтобы общаться с СУБД, аналитики используют SQL (Structured Query Language — язык структурированных запросов). Это универсальный язык, который понимают почти все реляционные базы данных. С его помощью можно создавать таблицы, добавлять в них информацию, изменять ее и, самое главное, извлекать нужные срезы данных для анализа.

Анатомия таблицы

Вся информация в реляционной базе данных организована в таблицы. Структура любой таблицы состоит из двух базовых элементов:

  • Столбцы (поля) — задают структуру данных. Каждый столбец имеет имя и описывает один конкретный атрибут. Например, в таблице клиентов могут быть столбцы «Имя», «Возраст», «Электронная почта».
  • Строки (записи) — содержат сами данные. Одна строка соответствует одному уникальному объекту (одному клиенту, одному заказу, одному товару).
  • Ключевым понятием в структуре таблицы является первичный ключ (Primary Key). Это столбец (или комбинация столбцов), который уникально идентифицирует каждую строку.

    > Первичный ключ работает как номер паспорта человека или VIN-номер автомобиля. В базе данных могут быть десятки клиентов с именем «Иван Иванов», но у каждого из них будет свой уникальный идентификатор (ID), например, 1042 и 8931. Благодаря этому база данных никогда их не перепутает.

    Типы данных: зачем базе строгие правила

    В отличие от Excel, где в одну колонку можно записать и число, и текст, и дату, SQL требует строгой дисциплины. При создании таблицы вы обязаны указать тип данных для каждого столбца.

    Это необходимо по двум причинам. Во-первых, база данных должна знать, сколько места на диске выделить под эту информацию. Во-вторых, типы данных защищают от ошибок: система просто не позволит записать слово «Вторник» в колонку, предназначенную для цены товара.

    Рассмотрим основные типы данных, с которыми аналитик сталкивается каждый день:

    INT (Integer*) — целые числа. Используется для количества товаров, возраста, идентификаторов (ID). Пример: 42, 1000, -5. VARCHAR(n) (Variable Character*) — текстовые строки переменной длины, где — максимальное количество символов. Если вы зададите VARCHAR(50), система разрешит сохранить текст длиной до 50 символов. Используется для имен, адресов, email. Пример: "Алексей", "test@example.com". * DECIMAL(p, s) — точные дробные числа. Параметр означает общее количество цифр, а — количество цифр после запятой. Например, DECIMAL(5, 2) означает, что число может состоять максимум из 5 цифр, из которых 2 находятся после запятой. Максимальное значение для такого типа составит 999.99. Идеально подходит для хранения денег. * DATE — дата в формате Год-Месяц-День. Пример: '2023-10-25'.

    !Попробуйте ввести разные значения — и увидите, как база данных отклоняет некорректные данные

    Ограничения (Constraints)

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

    * PRIMARY KEY — указывает, что этот столбец является первичным ключом. Значения в нем должны быть уникальными и не могут быть пустыми. * NOT NULL — запрещает оставлять ячейку пустой. Если при добавлении нового клиента вы не укажете его имя (а для столбца задано правило NOT NULL), база данных выдаст ошибку и отменит операцию. * UNIQUE — гарантирует, что все значения в столбце уникальны. В отличие от первичного ключа, таких столбцов в таблице может быть несколько. Отлично подходит для номеров телефонов или адресов электронной почты. * CHECK — проверяет данные на соответствие определенному условию. Например, можно задать правило , чтобы никто случайно не установил отрицательную цену на товар.

    Создание первой таблицы: команда CREATE TABLE

    Теперь, когда мы знаем из чего состоит таблица, давайте напишем наш первый SQL-запрос. Для создания таблиц используется команда CREATE TABLE.

    Синтаксис выглядит следующим образом:

    Давайте решим практическую задачу. Нам нужно создать таблицу employees (сотрудники) для нашей компании. Мы хотим хранить уникальный номер сотрудника, его полное имя, должность, дату приема на работу и зарплату.

    Вот как будет выглядеть SQL-запрос:

    Разберем этот запрос построчно, чтобы понять логику работы базы данных:

  • CREATE TABLE employees ( — мы даем команду СУБД создать новую таблицу с именем employees и открываем скобку для перечисления столбцов.
  • employee_id INT PRIMARY KEY — создаем столбец для ID. Он будет хранить целые числа (INT) и служить уникальным идентификатором каждой записи (PRIMARY KEY).
  • full_name VARCHAR(100) NOT NULL — столбец для имени. Это текст длиной до 100 символов. Правило NOT NULL означает, что мы не можем добавить в базу «безымянного» сотрудника.
  • job_title VARCHAR(50) — должность сотрудника. Здесь нет ограничения NOT NULL, значит, если должность пока не определена, ячейка может остаться пустой (в SQL пустота обозначается специальным маркером NULL).
  • hire_date DATE NOT NULL — дата найма. Обязательна для заполнения.
  • salary DECIMAL(10, 2) CHECK (salary >= 30000) — зарплата. Мы выделили 10 цифр, из которых 2 под копейки. Ограничение CHECK гарантирует, что в базу нельзя внести зарплату ниже 30 000 (например, ниже минимального размера оплаты труда).
  • ); — закрываем скобку и ставим точку с запятой. Точка с запятой в SQL означает конец команды.
  • Выполнение этого запроса создаст пустой, но строго размеченный «каркас». База данных подготовит место на диске и включит все механизмы проверки. Теперь, если другая программа или пользователь попытается добавить в эту таблицу данные, СУБД пропустит их через фильтры: проверит, не занят ли уже такой employee_id, убедится, что имя не пустое, а зарплата соответствует условию.

    Понимание того, как создаются таблицы и какие типы данных в них используются — это фундамент аналитики. Когда вы будете писать запросы для извлечения данных, вы всегда будете отталкиваться от структуры таблиц. Зная, что в столбце хранится тип DATE, вы сможете применять к нему математические операции с датами (например, вычислять стаж работы), а зная о наличии PRIMARY KEY, сможете безошибочно связывать эту таблицу с другими.