Единые определения на весь курс. Термины даю с английским ключевым словом — оно и есть синтаксис.
Отношение / таблица (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 — «значение неизвестно / отсутствует». Это не 0 и не пустая строка.
Трёхзначная логика (three-valued logic) — сравнения с NULL дают unknown, а не true/false. Поэтому x = NULL никогда не истинно; нужно x IS NULL.
COALESCE(a, b, …) — первое не-NULL значение. NULLIF(a, b) — NULL, если a = b.
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.
Подзапрос (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).