Зачем тестировщику SQL. Таблицы, ключи, связи, типы данных

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?

АSQL — это язык написания автотестов интерфейса
БЧтобы проверить факт напрямую в базе данных
ВSQL нужен только разработчикам, а не тестировщику

Подсказка: В начале урока прямо описан пример, где интерфейс и API «врут» независимо от базы — вспомни его.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Что такое таблица в базе данных?

АОтдельный файл с настройками на сервере базы
БСписок всех HTTP-запросов приложения к API
ВСтруктура данных со столбцами и строками

Подсказка: В уроке прямо дано определение — это про столбцы и строки, а не про сеть.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Что такое первичный ключ таблицы?

АНазвание самой таблицы в базе данных
БПоле, которое ссылается на другую таблицу
ВПоле, уникально определяющее строку

Подсказка: Чаще всего это поле id — подумай, что его делает особенным для каждой строки.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Что делает внешний ключ?

АУникально определяет строку внутри своей таблицы
БСсылается на первичный ключ другой таблицы
ВХранит тип данных для каждого столбца таблицы

Подсказка: Ключевое слово — «внешний»: подумай, на что он смотрит — внутрь своей таблицы или наружу, в другую.

Онлайн-проверка ответа появится позже

Контрольный вопрос. На схеме урока таблица enrollments содержит поля user_id и course_id. Какие из утверждений про эту схему верны (выбери все подходящие)?

Выберите все верные варианты.

Аuser_id — внешний ключ, ссылающийся на id в таблице users
Бcourse_id — внешний ключ, ссылающийся на id в таблице courses
ВПоле user_id в enrollments обязано быть уникальным, иначе связь нарушится
Гenrollments связывает пользователей и курсы между собой
Дid в таблице users — это внешний ключ
ЕВ таблице courses должно быть поле enrollment_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. Получение информации из базы данных.».

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева