SQL · Postgres

Глоссарий

Единые определения на весь курс. Термины даю с английским ключевым словом — оно и есть синтаксис.

Основа

Отношение / таблица (relation / table) — набор строк с одинаковыми столбцами. SQL работает множествами строк, а не по одной.

Строка / кортеж (row / tuple) — одна запись. Столбец / поле (column) — одна характеристика с типом.

Первичный ключ (primary key, PK) — столбец(ы), однозначно определяющие строку. Уникален и не NULL.

Внешний ключ (foreign key, FK) — столбец, ссылающийся на PK другой таблицы. Основа связей и JOIN.

Предикат (predicate) — условие, дающее true / false / unknown (например price > 50). Строка попадает в результат, только если предикат = true.

Части запроса

Порядок выполнения (logical order) — SQL пишется как SELECT … FROM … WHERE …, но выполняется иначе: FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT. Отсюда следует, почему в WHERE нельзя использовать алиас из SELECT.

WHERE — фильтр строк до группировки. HAVING — фильтр групп после GROUP BY.

Алиас (alias) — временное имя столбца или таблицы через AS (у таблиц AS можно опустить).

Проекция / фильтрация — «проекция» = выбор столбцов (SELECT), «фильтрация» = выбор строк (WHERE).

NULL

NULL — «значение неизвестно / отсутствует». Это не 0 и не пустая строка.

Трёхзначная логика (three-valued logic) — сравнения с NULL дают unknown, а не true/false. Поэтому x = NULL никогда не истинно; нужно x IS NULL.

COALESCE(a, b, …) — первое не-NULL значение. NULLIF(a, b) — NULL, если a = b.

JOIN

INNER JOIN — только совпавшие пары строк. LEFT JOIN — все строки левой таблицы + совпадения справа (иначе NULL). RIGHT / FULL — зеркально / обе стороны. CROSS JOIN — декартово произведение.

Self-join — таблица соединяется сама с собой (через алиасы).

Анти-join (anti-join) — «строки без пары»: обычно LEFT JOIN … WHERE right.id IS NULL или NOT EXISTS.

Semi-join — «строки, у которых есть пара, но без дублирования» — это EXISTS / IN.

Агрегация

Агрегатная функция — сворачивает много строк в одно значение: COUNT, SUM, AVG, MIN, MAX.

GROUP BY — делит строки на группы; агрегат считается по каждой группе.

COUNT(*) vs COUNT(col) — * считает строки; COUNT(col) не считает строки, где col = NULL.

Подзапросы и CTE

Подзапрос (subquery) — запрос внутри запроса. Скалярный — возвращает одно значение. Коррелированный (correlated) — ссылается на внешний запрос и считается для каждой внешней строки.

EXISTS / NOT EXISTS — есть ли хоть одна строка в подзапросе. Обычно быстрее и безопаснее (относительно NULL), чем IN / NOT IN.

CTE (Common Table Expression) — именованный подзапрос через WITH name AS (…). Улучшает читаемость; бывает рекурсивным.

Оконные функции

Оконная функция (window function) — считает значение по «окну» строк, не схлопывая строки (в отличие от GROUP BY). Задаётся через OVER (…).

PARTITION BY — делит на окна (аналог группы). ORDER BY внутри OVER — задаёт порядок для нумерации/накопления.

ROW_NUMBER / RANK / DENSE_RANK — нумерация/ранжирование. LAG / LEAD — значение из предыдущей/следующей строки. Frame — диапазон строк окна (ROWS BETWEEN …).

Изменение данных и схема

DML — INSERT, UPDATE, DELETE (данные). DDL — CREATE, ALTER, DROP (структура).

UPSERT — «вставь или обнови»: в Postgres INSERT … ON CONFLICT … DO UPDATE.

RETURNING — расширение Postgres: INSERT/UPDATE/DELETE … RETURNING возвращает изменённые строки.

Ограничение (constraint) — правило целостности: NOT NULL, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY.

Производительность и транзакции

Индекс (index) — вспомогательная структура (обычно B-tree) для быстрого поиска строк без полного скана.

EXPLAIN / EXPLAIN ANALYZE — план запроса (и реальные времена). Основной инструмент для «почему медленно».

Транзакция (transaction) — набор операций «всё или ничего»: BEGIN … COMMIT / ROLLBACK.

ACID — Atomicity, Consistency, Isolation, Durability — гарантии транзакций.

Уровень изоляции (isolation level) — насколько транзакции видят изменения друг друга (Read Committed, Repeatable Read, Serializable).