← Теория

🗄 Блок 06 — Базы данных Ozon

SQL · SELECT · JOIN · GROUP BY · Индексы · Транзакции · PostgreSQL

📋 1. SQL — основные запросы

CRUD-операции

ОперацияSQLЧто делает
CreateINSERT INTOДобавить запись
ReadSELECTПрочитать данные
UpdateUPDATEОбновить запись
DeleteDELETEУдалить запись

SELECT — основные конструкции

SELECT колонки
FROM таблица
WHERE условие
GROUP BY колонка
HAVING условие_после_группировки
ORDER BY колонка ASC/DESC
LIMIT количество
OFFSET пропуск

WHERE — фильтрация

SELECT * FROM users
WHERE age > 18
  AND city = 'Moscow'
  AND name LIKE 'А%'
  AND role IN ('admin', 'qa');
ОператорЧто делаетПример
=Равноcity = 'Moscow'
!= или <>Не равноstatus != 'deleted'
>Большеage > 18
LIKEПоиск по шаблонуname LIKE 'А%' (начинается на А)
INВ спискеrole IN ('admin', 'qa')
BETWEENВ диапазонеage BETWEEN 18 AND 30
IS NULLПустое значениеemail IS NULL
На собе: "Основные операторы: WHERE — фильтрация, GROUP BY — группировка, ORDER BY — сортировка, LIMIT — ограничение количества строк."

🔗 2. JOIN — объединение таблиц

JOIN — объединяет данные из двух таблиц по общему ключу.

Виды JOIN

ТипЧто берётВизуально
INNER JOINТолько совпадения в обеих таблицах∩ (пересечение)
LEFT JOINВСЁ из левой + совпадения из правой⊂ (левая целиком)
RIGHT JOINВСЁ из правой + совпадения из левой⊃ (правая целиком)
FULL JOINВСЁ из обеих таблиц∪ (всё)

Пример

-- Все пользователи и их заказы
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- u.id = o.user_id — ключ связи
-- LEFT — покажет ВСЕХ юзеров,
-- даже если заказов нет (NULL в o.total)

Когда какой JOIN

На собе: "INNER JOIN — только совпадения. LEFT JOIN — все из левой таблицы + совпадения из правой (если нет — NULL). LEFT JOIN используется чаще всего."

📊 3. GROUP BY и агрегатные функции

GROUP BY — группирует строки по значению колонки. Используется с агрегатными функциями.

Агрегатные функции

ФункцияЧто делаетПример
COUNTКоличество строкCOUNT(*) — всего, COUNT(email) — без NULL
SUMСуммаSUM(total)
AVGСреднееAVG(age)
MINМинимумMIN(price)
MAXМаксимумMAX(price)

Пример

-- Сколько заказов у каждого юзера
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 3; -- только те, у кого > 3 заказов

WHERE vs HAVING

WHEREHAVING
КогдаДо группировкиПосле группировки
С чем работаетС отдельными строкамиС агрегатными результатами
ПримерWHERE age > 18HAVING COUNT(*) > 3
На собе: "GROUP BY группирует данные. С ним используют COUNT, SUM, AVG. WHERE фильтрует до группировки, HAVING — после. HAVING работает с агрегатными функциями."

🚀 4. Индексы

Индекс — структура данных для быстрого поиска. Как алфавитный указатель в книге: вместо перелистывания всех страниц — сразу открываешь нужную.

Что делает индекс

Когда нужен индекс

Когда НЕ нужен

Виды индексов

ТипКогда
B-Tree (по умолчанию)Равенство, диапазон, LIKE 'abc%'
UniqueУникальные значения (email, id)
Composite (составной)По нескольким колонкам сразу
Primary KeyГлавный ключ — автоматически индексируется
На собе: "Индекс ускоряет поиск — вместо перебора всех строк БД сразу находит нужную. Нужен для колонок в WHERE и JOIN. Минус: замедляет INSERT/UPDATE, потому что индекс нужно пересчитывать."

🔒 5. Транзакции

Транзакция — группа операций, которая выполняется целиком или не выполняется вообще.

Пример

BEGIN; -- начали транзакцию

UPDATE accounts SET balance = balance - 100
  WHERE user_id = 1; -- списали

UPDATE accounts SET balance = balance + 100
  WHERE user_id = 2; -- зачислили

COMMIT; -- всё успешно → сохранили
-- или ROLLBACK; -- ошибка → отменили всё

ACID — свойства транзакции

БукваСвойствоЧто значитПример
AAtomicity (Атомарность)Все операции или ни однойПеревод: списание + зачисление — вместе или никак
CConsistency (Консистентность)Данные всегда корректныБаланс не может уйти в минус
IIsolation (Изолированность)Транзакции не мешают друг другуДва перевода одновременно — не конфликтуют
DDurability (Стойкость)После COMMIT — данные сохранены навсегдаДаже если сервер упал — данные на месте
На собе: "Транзакция — группа операций «всё или ничего». COMMIT — сохранить, ROLLBACK — отменить. ACID: Atomicity (атомарность), Consistency (консистентность), Isolation (изолированность), Durability (стойкость)."

🐘 6. PostgreSQL — особенности

PostgreSQL — объектно-реляционная СУБД. Одна из самых популярных. Ты с ней уже работаешь!

Ключевые особенности

ФичаЧто значит
JSONBХранит JSON, можно искать внутри
МассивыКолонка может хранить массив: INTEGER[]
SERIAL / BIGSERIALАвтоинкрементный ID
UUIDУникальный идентификатор
UPSERTINSERT ... ON CONFLICT — вставить или обновить

Полезные запросы для QA

-- Посмотреть структуру таблицы
\d table_name

-- Найти юзера по email
SELECT * FROM users WHERE email = 'test@mail.com';

-- Посчитать записи
SELECT COUNT(*) FROM orders WHERE status = 'pending';

-- Последние 10 заказов
SELECT * FROM orders ORDER BY created_at DESC LIMIT 10;

-- Уникальные значения
SELECT DISTINCT status FROM orders;
На собе: "Работала с PostgreSQL — делала SELECT-запросы для проверки данных. Использовала WHERE, JOIN, ORDER BY, LIMIT. Читала данные для валидации результатов тестов."

🔑 7. Primary Key, Foreign Key, Normalization

Primary Key (PK)

Foreign Key (FK)

users: orders:
id (PK) | name id (PK) | user_id (FK) | total
1 | Анна 1 | 1 | 500
2 | Иван 2 | 1 | 300
3 | 2 | 100

-- user_id в orders ссылается на id в users

Нормализация (зачем)

На собе: "Primary Key — уникальный идентификатор строки. Foreign Key — ссылка на PK другой таблицы, обеспечивает связь. Нормализация — чтобы не дублировать данные."

💬 Вопросы для самопроверки