SQL для тестировщика – Часть 1: SELECT и WHERE
QA❤️4LifeРасширенная шпаргалка по SQL для тестировщика: в короткой версии был обзор, здесь разбираем каждый оператор – что делает, для чего нужен и где подстерегает ловушка. Полезно и в ежедневной работе, и на собеседованиях.
Канал: QA❤️4Life
Автор: Евгений Гусинец
SQL для тестировщика – Часть 1 из 5: SELECT и WHERE
Демо-схема для всех примеров серии:
- users (id, email, status, created_at)
- orders (id, user_id, sum, status, created_at)
- payments (id, order_id, amount, created_at)
SELECT: база
Что делает. Выбирает столбцы из таблицы. Перечисляйте столбцы явно, а не через *: запрос читается быстрее, не тянет лишний трафик и не ломается, когда схему меняют.
SELECT id, email, status FROM users;
Зачем тестировщику. Проверяешь конкретные поля – запрашивай только их. Алиасы AS сокращают длинные имена: SELECT u.email AS mail FROM users u.
WHERE: сравнения
Что делает. Фильтрует строки до того, как что-то посчитается. Операторы: =, <> (не равно, пишут ещё и !=), >, <, >=, <=.
SELECT id, sum FROM orders WHERE sum > 10000;
Зачем. Выборка граничных значений – классика проверок: большие суммы, свежие записи, конкретный статус.
AND / OR / NOT и скобки
Что делает. Комбинирует условия. AND сильнее OR: без скобок условие склеится не так, как вы думаете.
SELECT id, sum FROM orders WHERE status = 'paid' AND (sum > 1000 OR sum < 100);
Зачем. Скобки – бесплатная страховка от логических багов в собственном запросе. Проверка сама должна быть корректной.
IN / NOT IN
Что делает. Заменяет цепочку OR по одному полю. NOT IN – всё, кроме списка.
SELECT id, email
FROM users
WHERE status IN ('active', 'banned');Зачем. Проверка на наборе статусов или id. Ловушка NOT IN с NULL – в части 4, там она заслуживает отдельного разбора.
LIKE / NOT LIKE
Что делает. Поиск по шаблону: % – любое количество символов, _ – ровно один. Регистрозависимость зависит от СУБД, в PostgreSQL есть регистронезависимый ILIKE.
SELECT id, email FROM users WHERE email LIKE '%test%';
Зачем. Найти тестовые аккаунты, битые данные по маске, email без собаки (NOT LIKE '%_@%._%').
BETWEEN и главная ловушка с датами
Что делает. Диапазон включительно с обеих сторон.
SELECT id FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
Зачем. Проверки за период. Ловушка: BETWEEN '2024-01-01' AND '2024-01-31' при поле с временем отсечёт весь 31-й после полуночи. Правильный паттерн – нижняя граница включительно, верхняя исключительно, как в примере выше.
IS NULL / IS NOT NULL
Что делает. Проверка на пустое значение. NULL – это «значения нет», и он не равен ничему, даже другому NULL: сравнение = NULL всегда молча вернёт пустоту.
SELECT id, email FROM users WHERE email IS NULL;
Зачем. NULL в поле, где его быть не должно, – кандидат в баги. Проверка NULL-значений – обязательная часть любого теста данных.
ORDER BY
Что делает. Сортирует результат: ASC по возрастанию (по умолчанию), DESC по убыванию. Можно по нескольким столбцам через запятую.
SELECT id, created_at FROM orders ORDER BY created_at DESC, id DESC;
Зачем. «Покажи свежие записи первыми» – самый частый запрос при разборе бага.
LIMIT / OFFSET
Что делает. Обрезает результат: LIMIT – сколько строк отдать, OFFSET – сколько пропустить. В SQL Server то же самое – TOP.
SELECT id, email FROM users ORDER BY id DESC LIMIT 50;
Зачем. Не выгружать миллион строк, когда хватает последних пятидесяти.
DISTINCT
Что делает. Убирает дубликаты строк результата.
SELECT DISTINCT status FROM orders;
Зачем. Быстро увидеть полный набор значений поля. Счёт по уникальным – COUNT(DISTINCT id) – раскрываем в части 2.
Резюме части 1
- Столбцы перечисляй явно,
*– только для быстрого взгляда. - Скобки в
AND/ORставь всегда, приоритет обманчив. - Диапазон дат – «>= начало AND < конец»: BETWEEN с датой без времени теряет хвост дня.
- NULL проверяется только через
IS NULL. ORDER BY … DESC LIMIT N– способ увидеть последние записи.