Блог
SQL
5 SQL-ловушек, на которых тестировщики ошибаются на собеседовании

5 SQL-ловушек, на которых тестировщики ошибаются на собеседовании

На собеседовании тестировщика SQL редко проверяют сложными запросами. Чаще дают короткий запрос и спрашивают: «Что он вернёт?» Запрос выглядит правильным, синтаксических ошибок в нём нет, а результат неожиданный. Именно на таких вопросах проверяют, понимает ли кандидат, как база на самом деле обрабатывает данные.

Ниже пять ловушек, которые чаще всего встречаются на собеседованиях Junior и Middle QA. Для каждой: запрос, что он вернёт, почему и как написать правильно.

1. NOT IN и NULL в подзапросе

Задача: найти сотрудников, которые никем не руководят. Анна руководит Борисом и Верой, Борис — Глебом. Ожидаемый ответ: Вера и Глеб.
Запрос с NOT IN и таблица employees, где у Анны manager_id = NULL
Запрос вернёт ноль строк.

Подзапрос возвращает список руководителей: NULL, 1, 1, 2. NOT IN проверяет, что id не равен ни одному значению из списка. Для Веры база сравнивает 3 с каждым значением, и сравнение 3 с NULL даёт не «да» и не «нет», а «неизвестно». WHERE пропускает строку только при «да», поэтому не проходит никто.

Как правильно:
SELECT name
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM employees m
  WHERE m.manager_id = e.id
);
Правило: если в колонке подзапроса может быть NULL, используйте NOT EXISTS.

2. LEFT JOIN, который превращается в обычный JOIN

Задача: вывести всех клиентов и их оплаченные заказы. Клиенты без оплат тоже должны попасть в список.
Запрос с LEFT JOIN и условием в WHERE, таблицы customers и orders
Запрос вернёт одну строку — Анну.

Сначала выполняется соединение, потом WHERE проверяет каждую строку. У Бориса статус cancel, у Веры заказов нет и статус NULL. Условие o.status = 'paid' отсеивает обоих, и LEFT JOIN работает как обычный JOIN.

Как правильно — перенести условие в ON:
SELECT c.name, o.status
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
 AND o.status = 'paid';
Результат: все три клиента, у Бориса и Веры статус пустой.
Потренируйтесь на задачах
В SQL Arena больше тысячи задач с автопроверкой на настоящих таблицах: от первого SELECT до оконных функций и задач с собеседований. Задачи уровня Easy бесплатны, регистрация без карты.
Открыть SQL Arena

3. AVG и COUNT пропускают NULL

Задача: посчитать среднюю оценку товара. Две оценки из четырёх не заполнены.
Запрос SELECT AVG(rating) и таблица reviews с двумя NULL
Запрос вернёт 4,5, а не 2,25. AVG не учитывает NULL и делит сумму на 2, а не на 4.

То же правило работает в COUNT: COUNT(*) считает все строки, а COUNT(колонка) — только заполненные. Если «нет оценки» в вашей задаче означает ноль, скажите это базе явно:
SELECT AVG(COALESCE(rating, 0)) FROM reviews;  -- 2,25
Для тестировщика это важно при проверке отчётов: цифра выглядит правдоподобно, ошибки нет, а среднее завышено.

4. Сравнение с NULL через знак «равно»

Задача: найти клиентов, у которых не указан телефон.
Запрос WHERE phone = NULL и таблица clients
Запрос вернёт ноль строк и не покажет никакой ошибки.

NULL означает «значение неизвестно», поэтому NULL не равен ничему, даже другому NULL. Сравнение phone = NULL всегда даёт «неизвестно».

Как правильно:
SELECT name
FROM clients
WHERE phone IS NULL;

5. OR без скобок

Задача: найти книги и игры дешевле 500.
Запрос с OR и AND без скобок и таблица products
Запрос вернёт три товара: в выборку попала книга за 900.

AND выполняется раньше OR, как умножение раньше сложения. База читает условие так: «все книги ИЛИ (игры дешевле 500)». Цена проверилась только у игр.

Как правильно:
SELECT name, price
FROM products
WHERE (cat = 'books' OR cat = 'games')
  AND price < 500;
Правило: если в условии есть и OR, и AND, всегда ставьте скобки.

Как подготовиться

Все пять ловушек объединяет одно: запрос выполняется без ошибок, а результат неверный. На собеседовании важно не только знать правильный ответ, но и объяснить, почему база поступает именно так. Это показывает, что вы понимаете, как работают данные, а не запомнили синтаксис.

Лучший способ подготовиться — решать такие задачи руками. В тренажёре нашей школы SQL Arena больше 1 000 задач с проверкой прямо в браузере, от простых SELECT до оконных функций, с ловушками вроде этих.
Потренируйтесь на задачах
В SQL Arena больше тысячи задач с автопроверкой на настоящих таблицах: от первого SELECT до оконных функций и задач с собеседований. Задачи уровня Easy бесплатны, регистрация без карты.
Открыть SQL Arena
Курс «Инженер по ручному тестированию»
Учим с нуля до трудоустройства: персональный ментор, задания в Jira, подготовка к собеседованиям и поддержка на испытательном сроке.
Узнать о курсе
По всем вопросам:
Quality Academy
Используя данный сайт, вы даёте согласие на использование файлов cookie.
ОК, ЗАКРЫТЬ