Этот урок открывает блок «SQL на собеседовании». Теорию ты прошёл в блоке про теорию баз данных, здесь мы смотрим на те же идеи глазами интервьюера: какие вопросы задают, что ответить за тридцать секунд и где кандидаты спотыкаются. Первый вопрос почти всегда один и тот же: в каком порядке выполняется запрос.
Учебная база блока
Все уроки блока работают на одной маленькой базе компании: отделы, сотрудники, клиенты и заказы. Скопируй скрипт в psql или в SQLite и повторяй запросы руками: ответ, который ты получил сам, запоминается лучше прочитанного.
CREATE TABLE departments (
id integer PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE employees (
id integer PRIMARY KEY,
name text NOT NULL,
department_id integer REFERENCES departments (id),
manager_id integer REFERENCES employees (id),
salary integer NOT NULL,
hired_at date NOT NULL
);
CREATE TABLE customers (
id integer PRIMARY KEY,
name text NOT NULL,
city text
);
CREATE TABLE orders (
id integer PRIMARY KEY,
customer_id integer NOT NULL REFERENCES customers (id),
amount integer NOT NULL,
created_at date NOT NULL
);
INSERT INTO departments VALUES
(1, 'Разработка'), (2, 'Продажи'), (3, 'Поддержка'), (4, 'Маркетинг');
INSERT INTO employees VALUES
(1, 'Анна', 1, NULL, 300000, '2019-03-01'),
(2, 'Борис', 1, 1, 250000, '2020-06-15'),
(3, 'Вера', 1, 1, 250000, '2021-01-10'),
(4, 'Глеб', 2, NULL, 200000, '2018-11-20'),
(5, 'Дина', 2, 4, 150000, '2022-02-01'),
(6, 'Егор', 3, NULL, 120000, '2023-05-05'),
(7, 'Жанна', NULL, 1, 180000, '2024-01-15');
INSERT INTO customers VALUES
(1, 'Ольга', 'Казань'), (2, 'Павел', 'Пермь'),
(3, 'Роман', 'Казань'), (4, 'Света', NULL);
INSERT INTO orders VALUES
(1, 1, 5000, '2026-01-05'),
(2, 1, 3000, '2026-01-20'),
(3, 2, 7000, '2026-02-02'),
(4, 1, 3000, '2026-02-15'),
(5, 3, 1200, '2026-03-01');
В данные специально заложены неудобные случаи, на которых держатся вопросы собеседований: у Бориса и Веры одинаковая зарплата, Жанна без отдела, в «Маркетинге» никого нет, у Светы нет города и нет ни одного заказа, а у Ольги два заказа на одну сумму.
Как спрашивают
В каком порядке выполняются части запроса
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT?
Часто следом: «Почему псевдоним из SELECT нельзя использовать в WHERE?»
Короткий ответ
Запрос пишется в одном порядке, а выполняется в другом. Логически сначала FROM и JOIN собирают строки, потом WHERE их фильтрует, GROUP BY раскладывает по группам, HAVING фильтрует группы, затем SELECT вычисляет колонки, DISTINCT убирает повторы, ORDER BY сортирует, а LIMIT отрезает первые строки. Псевдоним появляется на шаге SELECT, поэтому WHERE, который работает раньше, о нём не знает.
дальше после входа
Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.
Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.