Раздел 10 · Databases

Порядок выполнения SQL-запроса

junior~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Этот урок открывает блок «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.