📚 Центральный хаб по теме

Эта статья является частью большой коллекции материалов. Посетите центральную страницу "QA Testing: Полное Руководство 2025", чтобы увидеть все статьи, курсы и ресурсы по этой теме в одном месте.

Основные команды SQL для тестировщика: полное руководство 2025

Основные команды 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
  • 📚 Материалы курса остаются с вами навсегда
🚀 Записаться на курс SQL

Начните карьеру QA Automation Engineer с уверенных знаний SQL!

📚 Читайте также

📖 QA Ментор

Индивидуальное менторство по тестированию с нуля

📖 QA собеседования в США

Подготовка к интервью QA Engineer

📖 Карьера QA в США

Как стать QA инженером в Америке

🎯 Заключение

Теперь вы знаете все основные команды SQL для тестировщика! Эти основы SQL для тестировщиков помогут вам:

  • ✅ Эффективно проверять данные в базах данных
  • ✅ Готовить тестовые данные для различных сценариев
  • ✅ Находить баги, которые не видны через UI
  • ✅ Увеличить свою ценность как QA специалиста
  • ✅ Перейти на позицию QA Automation Engineer

Помните: практика — ключ к успеху. Используйте эти команды SQL каждый день, и скоро вы станете экспертом!

💎 Записаться на курс SQL для QA

🚀 Готовы начать обучение?

Если вам понравилась эта статья, запишитесь на курс!
Индивидуальное обучение 1 на 1, практические задания, поддержка 24/7. Начните свой путь в IT уже сегодня!

📚 QA Manual

SQL включен в курс

Узнать о курсе →

📚 QA Automation Individual

Полный стек для QA

Узнать о курсе →
💬 Задать вопрос в Telegram