Термины и определения
1. Что хранит строка реляционной таблицы?
Один экземпляр сущности или одно наблюдение: например, один заказ, клиент или визит.
Пример: В таблице orders строка может описывать один заказ, а столбцы — его дату, клиента и сумму.
Примечание: Модуль 1/5 · Модель. Сначала назовите смысл одной строки, затем читайте запрос.
2. Что хранит столбец таблицы?
Один тип признака для всех строк: например, order_date, customer_id или amount.
Пример: Столбец amount отвечает на один и тот же вопрос для каждого заказа — какова его сумма.
Примечание: Модуль 1/5 · Столбец — атрибут, а не отдельный объект.
3. Реляционная таблица
Именованная структура из строк и столбцов, где каждая строка имеет один и тот же набор столбцов.
Пример: customers и orders могут быть двумя таблицами, связанными через customer_id.
Примечание: Модуль 1/5 · Источник: PostgreSQL SQL tutorial.
4. Что делает SQL-запрос?
Описывает, какие данные получить или изменить; в этом наборе основной фокус — безопасное чтение запросов SELECT.
Пример: Запрос может попросить базу вернуть заказы выбранного периода, не меняя исходные строки.
Примечание: Модуль 1/5 · Сначала определите цель запроса: чтение или изменение.
5. Какой минимальный каркас запроса на чтение?
SELECT указывает результат, FROM — источник данных; WHERE при необходимости отбирает строки.
Пример: SELECT amount FROM orders WHERE amount > 1000;
Примечание: Модуль 1/5 · Восстановите порядок SELECT–FROM–WHERE без подсказки.
6. В каком порядке начинать объяснение запроса?
Сначала назвать итоговый вопрос бизнеса, затем источник, фильтры, группировку и поля результата.
Пример: «Запрос считает число оплаченных заказов по месяцам», а затем объясняет каждую конструкцию.
Примечание: Модуль 1/5 · Маленький шаг сегодня: 6/30 и один каркас SELECT–FROM–WHERE.
7. За что отвечает SELECT?
За список столбцов или выражений, которые должны появиться в результате.
Пример: SELECT customer_id, amount возвращает два указанных поля для прошедших фильтр строк.
Примечание: Модуль 2/5 · SELECT формирует столбцы результата.
8. За что отвечает FROM?
За таблицу, представление, подзапрос или соединение, из которого берутся исходные строки.
Пример: FROM orders сообщает, что исходный набор строк берётся из orders.
Примечание: Модуль 2/5 · FROM задаёт источник, а не фильтр.
9. За что отвечает WHERE?
За условие отбора отдельных исходных строк до группировки и вычисления агрегатов.
Пример: WHERE status = 'paid' оставляет только строки с оплаченной записью.
Примечание: Модуль 2/5 · WHERE фильтрует строки.
10. Как работают AND и OR?
AND требует истинности всех соединённых условий, OR — хотя бы одного; скобки делают замысел однозначным.
Пример: WHERE status = 'paid' AND (country = 'KZ' OR country = 'KG')
Примечание: Модуль 2/5 · Без скобок приоритет операторов легко прочитать неверно.
11. Как правильно проверить NULL?
Использовать IS NULL или IS NOT NULL, потому что NULL означает неизвестное или отсутствующее значение и не сравнивается обычным равенством.
Пример: WHERE shipped_at IS NULL находит строки без известной даты отправки.
Примечание: Модуль 2/5 · Не писать shipped_at = NULL.
12. Что делает DISTINCT?
Удаляет повторяющиеся комбинации значений из выбранных столбцов результата.
Пример: SELECT DISTINCT country FROM customers возвращает каждую встреченную страну один раз.
Примечание: Модуль 2/5 · DISTINCT не исправляет неверный JOIN; сначала проверьте причину дублей.
13. За что отвечает ORDER BY?
За порядок строк в результате: ASC по возрастанию, DESC по убыванию.
Пример: ORDER BY amount DESC выводит сначала наибольшие суммы.
Примечание: Модуль 3/5 · Без ORDER BY порядок результата не следует считать гарантированным.
14. Что делает COUNT(*)?
Считает число строк в каждой группе результата или во всём отфильтрованном наборе, если GROUP BY нет.
Пример: SELECT COUNT(*) FROM orders WHERE status = 'paid';
Примечание: Модуль 3/5 · COUNT(*) считает строки, прошедшие WHERE.
15. Что такое агрегатная функция?
Функция, которая сворачивает несколько строк в одно значение, например COUNT, SUM, AVG, MIN или MAX.
Пример: AVG(amount) вычисляет среднее по строкам текущей группы.
Примечание: Модуль 3/5 · Источник: PostgreSQL Aggregate Functions tutorial.
16. За что отвечает GROUP BY?
Объединяет строки с одинаковыми значениями указанных выражений, чтобы вычислить агрегаты отдельно для каждой группы.
Пример: GROUP BY customer_id позволяет получить COUNT(*) заказов по каждому клиенту.
Примечание: Модуль 3/5 · Одна строка результата обычно соответствует одной группе.
17. Чем HAVING отличается от WHERE?
WHERE фильтрует исходные строки до группировки, HAVING — уже сформированные группы после вычисления агрегатов.
Пример: WHERE status = paid отбирает заказы, а HAVING COUNT(*) >= 3 оставляет клиентов минимум с тремя заказами.
Примечание: Модуль 3/5 · Источник: PostgreSQL Table Expressions.
18. Какие поля допустимы рядом с агрегатом?
Неагрегированные поля результата обычно должны входить в GROUP BY, если только СУБД не выводит допустимую функциональную зависимость.
Пример: SELECT country, COUNT(*) ... GROUP BY country — понятный переносимый каркас.
Примечание: Модуль 3/5 · На собеседовании сначала используйте явный безопасный вариант.
19. Что такое ключ соединения?
Столбец или набор столбцов, по которым строку одной таблицы сопоставляют со строкой другой.
Пример: orders.customer_id сопоставляют с customers.id.
Примечание: Модуль 4/5 · Перед JOIN назовите обе стороны связи.
20. Первичный ключ
Столбец или набор столбцов, уникально идентифицирующий строку таблицы и не допускающий NULL.
Пример: customers.id может однозначно указывать на одного клиента.
Примечание: Модуль 4/5 · Первичный ключ задаётся ограничением таблицы.
21. Внешний ключ
Столбец или набор столбцов, чьи значения ссылаются на допустимый ключ другой или той же таблицы.
Пример: orders.customer_id может ссылаться на customers.id.
Примечание: Модуль 4/5 · Внешний ключ описывает допустимую связь данных.
22. Что возвращает INNER JOIN?
Только сочетания строк, для которых условие JOIN истинно с обеих сторон.
Пример: Клиент без заказов не попадёт в INNER JOIN customers и orders по customer_id.
Примечание: Модуль 4/5 · Представьте пересечение совпавших строк.
23. Что возвращает LEFT JOIN?
Все строки левой таблицы и совпавшие строки правой; если совпадения нет, поля правой стороны становятся NULL.
Пример: LEFT JOIN сохраняет клиента без заказов, подставляя NULL в поля orders.
Примечание: Модуль 4/5 · Левой является таблица, записанная до LEFT JOIN.
24. Почему JOIN может неожиданно умножить строки?
Если одной строке слева соответствует несколько строк справа или условие связи неполное, результат содержит отдельную строку для каждого совпадения.
Пример: Один клиент с тремя заказами даст три строки после JOIN с orders.
Примечание: Модуль 4/5 · Не лечите умножение DISTINCT, пока не проверена кардинальность связи.
25. Что такое псевдоним AS?
Короткое имя таблицы или выражения, упрощающее чтение и задающее понятное имя столбцу результата.
Пример: FROM customers AS c позволяет писать c.id; COUNT(*) AS order_count именует показатель.
Примечание: Модуль 5/5 · Хороший alias короче исходного имени, но остаётся понятным.
26. Каков полезный логический порядок чтения SELECT-запроса?
FROM и JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY; это модель понимания, а не обещание физического плана выполнения.
Пример: Сначала определите исходные строки, затем фильтры и группы, только потом читайте итоговые выражения.
Примечание: Модуль 5/5 · Оптимизатор может выполнять физические операции иначе.
27. Как заметить ошибку LEFT JOIN + WHERE?
Условие WHERE по правой таблице, исключающее NULL, может фактически убрать несопоставленные левые строки и сделать результат похожим на INNER JOIN.
Пример: LEFT JOIN orders o ... WHERE o.status = 'paid' исключит клиентов без совпавшего заказа.
Примечание: Модуль 5/5 · Спросите, должны ли сохраняться строки без совпадения.
28. Как проверить гранулярность результата?
Закончить фразу «одна строка результата — это…» и сверить её с ключами, JOIN и GROUP BY.
Пример: После GROUP BY customer_id одна строка должна описывать одного клиента, а не один заказ.
Примечание: Модуль 5/5 · Это помогает заметить дубли и неверную группировку.
29. Как объяснить запрос на собеседовании?
Одним предложением назвать результат, затем пройти по источникам, связям, фильтрам, группам и сортировке и отдельно указать допущения о NULL и дублях.
Пример: «Считаю оплаченные заказы по клиентам, сохраняя только группы от трёх заказов».
Примечание: Модуль 5/5 · Объяснение важнее механического перечисления ключевых слов.
30. Первый цикл SQL после 30 карточек
По памяти написать каркас SELECT–FROM–WHERE–GROUP BY–HAVING–ORDER BY и объяснить один JOIN на двух учебных таблицах.
Пример: Сегодня достаточно 6/30; завтра повторите только слабые карточки, затем выполните шесть коротких запросов без реальных персональных данных.
Примечание: Модуль 5/5 · Следующая ступень — практика на безопасном учебном наборе, не бесконечная серия и не обещание мгновенного мастерства.