SQL — язык запросов к базе данных: он показывает, что реально записано в базе, а не только то, что видно на сайте или в приложении. Даже API (способ, которым программы обмениваются данными) показывает не саму базу, а только то, что сервер РЕШИЛ отдать в ответе. Поэтому, когда нужно проверить факт — «данные действительно сохранились?», — тестировщику нужен SQL.
Чему научишься за этот урок:
— объяснять, зачем тестировщику вообще нужен SQL;
— называть, что такое таблица, первичный и внешний ключ;
— читать простую схему из нескольких связанных таблиц;
— называть основные типы данных в базе.
Зачем тестировщику SQL
Интерфейс может показать одно, API — другое, а реально в базе данных может быть третье. Например: пользователь нажал «Записаться на курс», интерфейс показал успех, API вернул код 201 (ответ сервера «создано успешно») — но если в самой базе данных запись так и не появилась (например, сервер отправил ответ, а при сохранении данных случилась ошибка), ни интерфейс, ни API об этом уже не расскажут. SQL позволяет тестировщику проверить факт напрямую — заглянуть в саму базу, а не доверять тому, что о ней рассказывают промежуточные слои.
Таблицы
Таблица — основная структура хранения данных в базе. У таблицы есть столбцы (поля, например «имя», «email») и строки (записи, каждая строка — один конкретный пользователь, курс, заказ и так далее).
Первичный и внешний ключи
Первичный ключ (primary key) — поле, которое уникально определяет строку в таблице: у каждой строки своё, ни у одной другой строки такого же значения нет. Чаще всего это поле id.
Внешний ключ (foreign key) — поле в одной таблице, которое ссылается на первичный ключ ДРУГОЙ таблицы. Именно внешние ключи связывают таблицы между собой.
Таблица users Таблица enrollments Таблица courses +----+-------+ +----+---------+-----------+ +----+----------------------+ | id | name | | id | user_id | course_id | | id | title | +----+-------+ +----+---------+-----------+ +----+----------------------+ | 1 | Иван | | 1 | 1 | 5 | | 5 | Ручное тестирование | | 2 | Мария | | 2 | 2 | 5 | | 7 | SQL для тестировщика | +----+-------+ +----+---------+-----------+ +----+----------------------+ enrollments.user_id -> users.id (внешний ключ) enrollments.course_id -> courses.id (внешний ключ)
На схеме выше таблица enrollments (записи на курсы) связывает users и courses: строка с id=1 означает «пользователь Иван (user_id=1) записан на курс «Ручное тестирование» (course_id=5)».
Чтобы попробовать запросы этой темы самому (не обязательно для контрольных вопросов, но полезно для практики), возьми готовый скрипт ниже. Он создаёт таблицы users, courses и enrollments и заполняет их несколькими строками. Вставь скрипт целиком в бесплатную онлайн-песочницу PostgreSQL (например, onecompiler.com/postgresql), свои запросы пиши под ним и запускай всё вместе: каждый запуск идёт с чистой базы, поэтому скрипт каждый раз нужен целиком. Контрольные вопросы и задания решаются и без песочницы — рассуждением по данным из условий.
CREATE TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(50), email VARCHAR(100), created_at TIMESTAMP);
CREATE TABLE courses (id INTEGER PRIMARY KEY, title VARCHAR(100), price DECIMAL(10, 2));
CREATE TABLE enrollments (id INTEGER PRIMARY KEY, user_id INTEGER REFERENCES users(id), course_id INTEGER REFERENCES courses(id), enrolled_at TIMESTAMP);
INSERT INTO users VALUES (1, 'Иван', 'ivan@example.com', '2026-01-10 09:15'), (2, 'Мария', 'maria@gmail.com', '2026-01-20 14:30'), (3, 'Олег', 'oleg@gmail.com', '2026-02-05 18:45'), (4, 'Анна', 'anna@mail.ru', '2026-02-14 11:00'), (5, 'Пётр', 'petr@gmail.com', '2026-03-01 08:20');
INSERT INTO courses VALUES (5, 'Ручное тестирование', 4000), (7, 'SQL для тестировщика', 5000), (9, 'Автотесты на Python', 6500);
INSERT INTO enrollments VALUES (1, 1, 5, '2026-01-11 10:00'), (2, 2, 5, '2026-01-31 19:30'), (3, 2, 7, '2026-02-03 12:00'), (4, 3, 7, '2026-02-28 21:10'), (5, 4, 5, '2026-03-01 09:00');
Типы данных
У каждого столбца таблицы есть тип данных, который определяет, что именно в нём может храниться:
INTEGER -> целое число (id, возраст, количество) VARCHAR/TEXT -> текстовая строка (имя, email, название) DATE/DATETIME -> дата или дата+время (дата регистрации) BOOLEAN -> да/нет, true/false (активен ли аккаунт) DECIMAL -> дробное число (цена курса)
Итог:
— SQL нужен тестировщику, чтобы проверить факт напрямую в базе данных, а не доверять тому, что показывает интерфейс или API;
— таблица состоит из столбцов (полей) и строк (записей);
— первичный ключ уникально определяет строку в своей таблице (чаще всего id);
— внешний ключ — поле, ссылающееся на первичный ключ ДРУГОЙ таблицы, связывает таблицы между собой;
— основные типы данных: INTEGER, VARCHAR/TEXT, DATE/DATETIME, BOOLEAN, DECIMAL.
Контрольный вопрос. Зачем тестировщику может понадобиться SQL, если уже есть интерфейс и API?
Подсказка: В начале урока прямо описан пример, где интерфейс и API «врут» независимо от базы — вспомни его.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Что такое таблица в базе данных?
Подсказка: В уроке прямо дано определение — это про столбцы и строки, а не про сеть.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Что такое первичный ключ таблицы?
Подсказка: Чаще всего это поле id — подумай, что его делает особенным для каждой строки.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Что делает внешний ключ?
Подсказка: Ключевое слово — «внешний»: подумай, на что он смотрит — внутрь своей таблицы или наружу, в другую.
Онлайн-проверка ответа появится позже
Контрольный вопрос. На схеме урока таблица enrollments содержит поля user_id и course_id. Какие из утверждений про эту схему верны (выбери все подходящие)?
Выберите все верные варианты.
Подсказка: Сверь каждое утверждение со схемой из урока — одно из четырёх путает первичный и внешний ключ местами.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Как называется тип данных для хранения дробного числа, например цены курса? Ответь одним словом по-английски, как в уроке.
Подсказка: Посмотри на список типов данных в уроке — какой из них назван именно для цены.
Онлайн-проверка ответа появится позже
Задание. В таблице courses столбец id уникально определяет каждую строку — ни у одного другого курса такого же id нет. Как называется такой ключ? Ответь двумя словами по-русски.
Подсказка: Это ключ, уникальный внутри СВОЕЙ таблицы, а не ссылающийся на другую.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. По схеме урока: таблица enrollments содержит строку с user_id=2 и course_id=5. Пользователь с id=2 — Мария. На какой курс записана Мария по этой строке? Ответь названием курса.
Подсказка: Найди в таблице courses строку с id, равным course_id из этой записи enrollments.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. Объясни в 2-3 предложениях: почему тестировщику мало проверить, что API вернул код 201 (успех) при записи на курс, и стоит дополнительно посмотреть в саму базу данных?
Подсказка: Вспомни пример из начала урока — там API и интерфейс могут «соврать» про базу данных, даже не желая этого.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Задание. Тестировщик видит новую таблицу payments со столбцами: id, user_id, amount, status, paid_at. По одним только НАЗВАНИЯМ столбцов и без документации предположи: (а) какой столбец — первичный ключ; (б) какой столбец, вероятнее всего, внешний ключ и на какую таблицу он может ссылаться; (в) какой тип данных подходит столбцу amount. Обоснуй каждый пункт в одном предложении.
Подсказка: Проведи прямую аналогию с уже разобранной схемой users/enrollments/courses — там были такие же по смыслу столбцы.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Что дальше
Теперь вы понимаете структуру таблиц и связи между ними. Дальше — запросы, которые достают из базы нужные данные, а не только показывают её схему.
Хотите глубже? Запрос SELECT во всех подробностях, с примерами — в статье «Запрос SELECT SQL. Получение информации из базы данных.».
