SELECT: базовые запросы
SELECT: базовые запросы
SELECT — самая важная SQL-команда для тестировщика. С её помощью вы читаете данные из базы: проверяете результаты действий, ищете нужные записи, изучаете состояние системы.
Базовый синтаксис SELECT
SELECT столбцы
FROM таблица
WHERE условие
ORDER BY столбец [ASC | DESC]
LIMIT количество
OFFSET смещение;
Минимальный запрос — выбрать все строки и все столбцы:
SELECT * FROM users;
Выбрать только нужные столбцы:
SELECT id, name, email FROM users;
*— удобно для изучения, но в реальных запросах лучше указывать конкретные столбцы.
WHERE: фильтрация строк
WHERE оставляет только строки, удовлетворяющие условию.
-- Найти пользователя по email
SELECT * FROM users WHERE email = 'anna@example.com';
-- Найти активных пользователей
SELECT * FROM users WHERE is_active = true;
-- Найти заказы на сумму больше 1000 рублей
SELECT * FROM orders WHERE total > 1000;
Операторы сравнения
| Оператор | Смысл | Пример |
|---|---|---|
= | Равно | status = 'paid' |
!= или <> | Не равно | status != 'cancelled' |
> | Больше | total > 500 |
< | Меньше | total < 100 |
>= | Больше или равно | quantity >= 1 |
<= | Меньше или равно | price <= 1000 |
Логические операторы AND / OR / NOT
-- Активные пользователи, зарегистрированные после 2024 года
SELECT * FROM users
WHERE is_active = true AND created_at >= '2024-01-01';
-- Заказы в статусе 'pending' или 'paid'
SELECT * FROM orders
WHERE status = 'pending' OR status = 'paid';
-- Неотменённые заказы
SELECT * FROM orders
WHERE NOT status = 'cancelled';
При смешивании AND и OR используйте скобки:
(A OR B) AND C
LIKE: поиск по шаблону
LIKE ищет строки по шаблону. Два специальных символа:
%— любое количество любых символов (в т.ч. ноль)_— ровно один любой символ
-- Email заканчивается на @gmail.com
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- Имя начинается с 'Ан'
SELECT * FROM users WHERE name LIKE 'Ан%';
-- Имя из ровно 4 символов
SELECT * FROM users WHERE name LIKE '____';
-- Имя содержит 'тр' в любом месте
SELECT * FROM users WHERE name LIKE '%тр%';
В PostgreSQL
LIKEчувствителен к регистру. ИспользуйтеILIKEдля регистронезависимого поиска.
IN: список значений
IN заменяет несколько условий OR:
-- Заказы в нескольких статусах
SELECT * FROM orders
WHERE status IN ('pending', 'paid');
-- Эквивалентно:
SELECT * FROM orders
WHERE status = 'pending' OR status = 'paid';
-- Исключить статусы
SELECT * FROM orders
WHERE status NOT IN ('cancelled', 'refunded');
BETWEEN: диапазон значений
-- Заказы на сумму от 500 до 5000 рублей
SELECT * FROM orders
WHERE total BETWEEN 500 AND 5000;
-- Регистрации за январь 2024
SELECT * FROM users
WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31 23:59:59';
BETWEEN включает граничные значения.
IS NULL / IS NOT NULL
-- Пользователи без номера телефона
SELECT * FROM users WHERE phone IS NULL;
-- Заказы с указанной датой доставки
SELECT * FROM orders WHERE delivered_at IS NOT NULL;
ORDER BY: сортировка
-- По дате регистрации, старые первыми (ASC — по умолчанию)
SELECT * FROM users ORDER BY created_at ASC;
-- По сумме заказа, дорогие первыми
SELECT * FROM orders ORDER BY total DESC;
-- Многоуровневая сортировка
SELECT * FROM orders ORDER BY status ASC, created_at DESC;
LIMIT и OFFSET: ограничение результата
-- Первые 10 записей
SELECT * FROM users LIMIT 10;
-- Записи с 11-й по 20-ю (вторая страница по 10 записей)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;
-- Последние 5 заказов
SELECT * FROM orders ORDER BY created_at DESC LIMIT 5;
OFFSETначинается с 0. Для страницы N (начиная с 1):OFFSET = (N - 1) * LIMIT
DISTINCT: уникальные значения
-- Список статусов, которые есть в таблице
SELECT DISTINCT status FROM orders;
-- Уникальные категории товаров
SELECT DISTINCT category FROM products;
Практические примеры для тестировщика
-- Проверить, что пользователь зарегистрировался
SELECT id, name, email, created_at FROM users
WHERE email = 'newuser@example.com';
-- Найти все заказы конкретного пользователя
SELECT * FROM orders
WHERE user_id = 5
ORDER BY created_at DESC;
-- Найти товары, которых нет в наличии
SELECT id, name, price FROM products
WHERE stock = 0;
-- Последние 10 заказов с суммой выше 3000 рублей
SELECT * FROM orders
WHERE total > 3000
ORDER BY created_at DESC
LIMIT 10;
Итоги
SELECT столбцы FROM таблица— основа любого запроса чтенияWHERE— фильтрует строки по условию- Операторы:
=,!=,>,<,>=,<=,AND,OR,NOT LIKE— поиск по шаблону (%— любые символы,_— один символ)IN— проверка на вхождение в список значенийBETWEEN— диапазон значений (включительно)IS NULL / IS NOT NULL— проверка на отсутствие значенияORDER BY ... ASC/DESC— сортировкаLIMIT/OFFSET— ограничение и пагинация результатовDISTINCT— убирает дубликаты из результата