Содержание статьи
Основные команды SQL для тестировщика — это фундамент, без которого современный QA специалист не может эффективно работать. SQL (Structured Query Language) позволяет тестировщикам проверять данные в базах данных, подготавливать тестовые данные, верифицировать backend логику и находить баги, которые невозможно обнаружить через UI.
В этом подробном руководстве вы найдёте все основы SQL для тестировщиков с практическими примерами, которые можно сразу применить в работе. Независимо от того, работаете ли вы с MySQL, PostgreSQL, Oracle или SQL Server — эти команды универсальны.
💡 Что вы узнаете: SELECT, INSERT, UPDATE, DELETE, JOIN, WHERE, GROUP BY, HAVING, подзапросы, индексы, транзакции и многое другое с реальными примерами для тестировщиков.
🎯 Зачем тестировщику нужен SQL?
Современный тестировщик SQL должен уметь работать с базами данных. Вот ключевые причины:
🔍 Верификация
- Проверка данных в БД
- Валидация логики
- Целостность данных
📊 Тестовые данные
- Создание больших датасетов
- Настройка сценариев
- Очистка после тестов
🐛 Поиск багов
- Проверка целостности данных
- Нахождение аномалий
- Валидация бизнес-логики
📖 SELECT - основа основ
SELECT — самая используемая команда. Она извлекает данные из таблиц.
Базовый синтаксис
-- Все столбцы
SELECT * FROM users;
-- Конкретные столбцы
SELECT id, email, first_name FROM users;
-- С алиасами
SELECT
id AS user_id,
CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
DISTINCT - уникальные значения
-- Уникальные страны
SELECT DISTINCT country FROM users;
-- Подсчёт уникальных
SELECT COUNT(DISTINCT email) FROM users;
LIMIT и OFFSET
-- Первые 10 записей
SELECT * FROM orders LIMIT 10;
-- Пагинация: пропустить 20, взять 10
SELECT * FROM orders LIMIT 10 OFFSET 20;
ORDER BY - сортировка
-- По возрастанию
SELECT * FROM products ORDER BY price ASC;
-- По убыванию
SELECT * FROM products ORDER BY price DESC;
-- По нескольким полям
SELECT * FROM users
ORDER BY country ASC, created_at DESC;
🔍 WHERE - фильтрация данных
WHERE фильтрует записи по условиям.
Операторы сравнения
-- Равенство
SELECT * FROM users WHERE email = 'test@example.com';
-- Неравенство
SELECT * FROM users WHERE status != 'inactive';
SELECT * FROM users WHERE status <> 'inactive';
-- Больше / Меньше
SELECT * FROM products WHERE price > 100;
SELECT * FROM products WHERE price >= 100;
SELECT * FROM orders WHERE total_amount < 50;
SELECT * FROM orders WHERE total_amount <= 50;
-- Множественные условия (AND, OR)
SELECT * FROM users
WHERE country = 'USA' AND age > 18;
SELECT * FROM orders
WHERE status = 'pending' OR status = 'processing';
BETWEEN - диапазон
-- Ценовой диапазон
SELECT * FROM products
WHERE price BETWEEN 100 AND 500;
-- Даты
SELECT * FROM orders
WHERE created_at BETWEEN '2025-01-01' AND '2025-12-31';
LIKE - поиск по шаблону
-- % - любые символы
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- _ - один символ
SELECT * FROM products WHERE sku LIKE 'PROD-___-2025';
-- Содержит 'test'
SELECT * FROM users WHERE email LIKE '%test%';
IS NULL / IS NOT NULL
-- NULL значения
SELECT * FROM users WHERE phone IS NULL;
-- Не NULL
SELECT * FROM users WHERE phone IS NOT NULL;
-- ❌ НЕПРАВИЛЬНО: WHERE phone = NULL
-- ✅ ПРАВИЛЬНО: WHERE phone IS NULL
🔗 JOIN - объединение таблиц
JOIN — критически важная команда для работы с несколькими таблицами.
INNER JOIN
Возвращает записи с совпадениями в обеих таблицах.
-- Базовый синтаксис
SELECT
orders.id,
orders.total_amount,
users.email
FROM orders
INNER JOIN users ON orders.user_id = users.id;
-- С алиасами
SELECT
o.id,
o.total_amount,
u.email,
u.first_name
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.status = 'completed';
LEFT JOIN
Все записи из левой таблицы + совпадения из правой.
-- Все пользователи + их заказы
SELECT
u.email,
COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.email;
-- Пользователи БЕЗ заказов
SELECT u.*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
Множественные JOIN
-- Три таблицы
SELECT
o.id AS order_id,
u.email,
p.name AS product,
oi.quantity
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id;
🧪 Практика: Найти orphaned records
-- Заказы без пользователей (баг!)
SELECT o.*
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE u.id IS NULL;
➕ INSERT - вставка данных
🧪 Создание тестовых данных
-- Создать тестового пользователя
INSERT INTO users (email, first_name, last_name, status)
VALUES ('qa.test@example.com', 'QA', 'Tester', 'active');
-- Создать 100 тестовых заказов
INSERT INTO orders (user_id, status, total_amount)
SELECT
1 AS user_id,
'pending' AS status,
FLOOR(RAND() * 1000) AS total_amount
FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3) t3
LIMIT 100;
🔄 UPDATE - обновление данных
UPDATE изменяет существующие записи.
Базовый UPDATE
-- Обновить одно поле
UPDATE users
SET status = 'inactive'
WHERE id = 123;
-- Несколько полей
UPDATE users
SET
first_name = 'John',
last_name = 'Smith',
updated_at = NOW()
WHERE id = 123;
UPDATE с условиями
-- Обновить все записи со статусом
UPDATE orders
SET status = 'cancelled'
WHERE created_at < NOW() - INTERVAL 30 DAY
AND status = 'pending';
-- С математическими операциями
UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics';
⚠️ ВАЖНО: Всегда используйте WHERE!
-- ❌ ОПАСНО: Обновит ВСЕ записи!
UPDATE users SET status = 'deleted';
-- ✅ ПРАВИЛЬНО: С WHERE
UPDATE users SET status = 'deleted' WHERE id = 123;
🗑️ DELETE - удаление данных
DELETE удаляет записи из таблицы.
Базовый DELETE
-- Удалить одну запись
DELETE FROM users WHERE id = 123;
-- Удалить по условию
DELETE FROM orders
WHERE status = 'cancelled'
AND created_at < NOW() - INTERVAL 90 DAY;
DELETE с J
Агрегатные функции выполняют вычисления на наборе значений и возвращают одно значение.
COUNT - подсчёт
-- Количество записей
SELECT COUNT(*) FROM users;
-- Количество не-NULL
SELECT COUNT(phone) FROM users;
-- Уникальные
SELECT COUNT(DISTINCT country) FROM users;
SUM - сумма
-- Общая сумма заказов
SELECT SUM(total_amount) FROM orders;
-- С условием
SELECT SUM(total_amount)
FROM orders
WHERE status = 'completed';
AVG - среднее
-- Средняя цена продуктов
SELECT AVG(price) FROM products;
-- По категориям
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category;
MIN и MAX
-- Минимальная и максимальная цена
SELECT
MIN(price) AS min_price,
MAX(price) AS max_price
FROM products;
-- Самый ранний и поздний заказ
SELECT
MIN(created_at) AS first_order,
MAX(created_at) AS last_order
FROM orders;
👥 GROUP BY и HAVING
GROUP BY группирует записи по одному или нескольким столбцам.
Базовый GROUP BY
-- Количество пользователей по странам
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;
-- Сумма заказов по пользователям
SELECT
user_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
GROUP BY user_id;
GROUP BY с несколькими полями
-- По стране и городу
SELECT
country,
city,
COUNT(*) AS user_count
FROM users
GROUP BY country, city
ORDER BY country, user_count DESC;
HAVING - фильтрация групп
HAVING фильтрует результаты ПОСЛЕ группировки (WHERE - до).
-- Пользователи с более чем 5 заказами
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;
-- Страны с >100 пользователями
SELECT
country,
COUNT(*) AS user_count
FROM users
GROUP BY country
HAVING COUNT(*) > 100
ORDER BY user_count DESC;
🧪 Практика: Поиск аномалий
-- Найти дублирующиеся email (баг!)
SELECT email, COUNT(*) as count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
-- Пользователи с подозрительно большим числом заказов
SELECT
user_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
WHERE created_at > NOW() - INTERVAL 1 DAY
GROUP BY user_id
HAVING COUNT(*) > 50;
🎯 Подзапросы (Subqueries)
Подзапрос — это SELECT внутри другого SQL запроса.
Подзапрос в WHERE
-- Пользователи, сделавшие хотя бы один заказ
SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);
-- Продукты дороже средней цены
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
Подзапрос в FROM
-- Использование подзапроса как таблицы
SELECT
customer_email,
total_orders,
total_spent
FROM (
SELECT
u.email AS customer_email,
COUNT(o.id) AS total_orders,
SUM(o.total_amount) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.email
) AS customer_stats
WHERE total_orders > 5;
UNION - объединение результатов
-- Объединить два запроса
SELECT email FROM users WHERE country = 'USA'
UNION
SELECT email FROM users WHERE country = 'Canada';
-- UNION ALL (с дубликатами)
SELECT product_name FROM orders_2024
UNION ALL
SELECT product_name FROM orders_2025;
CASE - условная логика
-- Классификация пользователей
SELECT
email,
CASE
WHEN order_count > 100 THEN 'VIP'
WHEN order_count > 10 THEN 'Regular'
ELSE 'New'
END AS customer_type
FROM (
SELECT u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.email
) AS customer_stats;
Транзакции
-- Начать транзакцию
START TRANSACTION;
-- Выполнить операции
INSERT INTO orders (user_id, total_amount) VALUES (1, 100);
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Подтвердить
COMMIT;
-- Или откатить при ошибке
ROLLBACK;
Индексы
-- Создать индекс
CREATE INDEX idx_user_email ON users(email);
-- Составной индекс
CREATE INDEX idx_order_user_status
ON orders(user_id, status);
-- Проверить использование индексов
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
🎓 Углубите знания SQL с профессиональным курсом
💎 Профессиональный курс SQL для тестировщиков
Эта статья даёт вам основные команды SQL для тестировщика, но чтобы стать настоящим экспертом и повысить свою ценность на рынке, вам нужна практика и глубокое понимание.
На курсе вы изучите:
- ✅ Основы SQL: все команды с практикой на реальных БД
- ✅ MySQL Workbench: работа с GUI инструментами
- ✅ Продвинутые запросы: подзапросы, JOIN, VIEW, процедуры
- ✅ Проектирование БД: нормализация, индексы, оптимизация
Формат обучения:
- ⏱️ 10 часов интенсивной практики
- 🎯 Индивидуальный подход: под ваш уровень и цели
- 💻 Практические задания: работа с реальными БД
- 📝 Сертификат о прохождении курса
- 💬 Поддержка 24/7 в Telegram
- 📚 Материалы курса остаются с вами навсегда
Начните карьеру QA Automation Engineer с уверенных знаний SQL!
📚 Читайте также
📖 QA Ментор
Индивидуальное менторство по тестированию с нуля
📖 QA собеседования в США
Подготовка к интервью QA Engineer
📖 Карьера QA в США
Как стать QA инженером в Америке
🎯 Заключение
Теперь вы знаете все основные команды SQL для тестировщика! Эти основы SQL для тестировщиков помогут вам:
- ✅ Эффективно проверять данные в базах данных
- ✅ Готовить тестовые данные для различных сценариев
- ✅ Находить баги, которые не видны через UI
- ✅ Увеличить свою ценность как QA специалиста
- ✅ Перейти на позицию QA Automation Engineer
Помните: практика — ключ к успеху. Используйте эти команды SQL каждый день, и скоро вы станете экспертом!