Базы данных
SQL для тестировщика: зачем он нужен и как создать таблицу в MySQL
SQL – язык запросов к реляционным базам данных. С его помощью тестировщик проверяет, что приложение действительно записало данные в базу, готовит тестовые данные и находит записи для воспроизведения бага, а на собеседовании junior-тестировщика почти всегда просят написать SELECT. Начинают с основных команд: CREATE создаёт базу и таблицу, INSERT добавляет строки, UPDATE меняет их, DELETE удаляет, а SELECT показывает содержимое.
- SELECT и JOIN
- по моему опыту, их просят написать почти на каждом собеседовании
- MySQL Community
- бесплатная версия сервера, на которой я показываю команды
- Песочница
- учебная база в браузере: запросы пишутся без установки и регистрации
Зачем тестировщику SQL
Почти любое приложение хранит данные в базе: пользователей, заказы, платежи. Интерфейс показывает только часть того, что записано, а тестировщик, который умеет написать запрос, видит саму запись. После регистрации он находит новую строку в таблице пользователей и сверяет её поля с тем, что вводил в форму.
SQL экономит время и при подготовке к проверке. Чтобы протестировать заказ в статусе "Отменён", не обязательно проходить весь путь через интерфейс: на тестовом стенде нужную строку добавляют или правят запросом. Так же по таблицам находят данные, на которых воспроизводится баг.
Ещё SQL спрашивают на собеседовании. По моему опыту, SELECT и JOIN просят написать почти на каждом интервью: дают таблицы с данными и задание вроде "покажите значения такого-то поля, где они больше пяти". Команды создания таблиц звучат реже, но без них не собрать себе базу для тренировки.
Типы данных в MySQL
Каждой колонке таблицы при создании назначают тип данных, и он определяет, что в неё можно записать. Названия типов почти те же, что в языках программирования, так что запомнить их полезно и для другой работы. Ниже самые ходовые, полный список длиннее.
Кроме типа у колонки есть признак NULL или NOT NULL. Он говорит, может ли значение остаться пустым: колонку NOT NULL при добавлении строки заполнять обязательно.
INT
Целые числа: идентификаторы, количество, номер курса.
DECIMAL, FLOAT и DOUBLE
DECIMAL хранит десятичную дробь точно, с заданным числом знаков после запятой, поэтому суммы денег держат в нём. FLOAT и DOUBLE – числа с плавающей точкой, они хранят значение приближённо.
Пример: сумма заказа в FLOAT
Тестировщик выполняет DESC orders и видит, что сумма заказа хранится в колонке FLOAT. В MySQL две строки с суммами 0.1 и 0.2 в такой колонке дают SUM(amount) = 0.30000000447034836, и сравнение с 0.3 возвращает 0, то есть ложь. В колонке DECIMAL(10,2) та же сумма равна 0.30, поэтому FLOAT у денежной колонки – повод для баг-репорта ещё до того, как расхождения появятся в отчётах.
CHAR и VARCHAR
Строки ограниченной длины. Предел пишут в скобках: в колонку VARCHAR(55) поместится не больше 55 символов.
TEXT
Длинный текст, до 65 535 байт. Для текста ещё длиннее есть MEDIUMTEXT и LONGTEXT.
DATE, TIME, DATETIME и YEAR
Дата, время, дата вместе со временем и год.
TIMESTAMP
Момент времени. MySQL хранит его как число секунд от полуночи 1 января 1970 года по UTC, а показывает в часовом поясе текущего соединения. Им удобно отмечать, когда запись создали или изменили.
BOOLEAN
Истина или ложь. В MySQL это синоним TINYINT(1): true хранится как 1, false как 0.
Основные команды: базы, таблицы и строки
Команды SQL делят на группы. Команды определения данных (DDL) создают, меняют и удаляют саму структуру, то есть базы, таблицы и колонки. Команды работы с данными (DML) добавляют, меняют и удаляют строки внутри таблиц. В уроке я разбираю обе группы, а SELECT с условиями и JOIN оставляю на два следующих урока.
Каждый запрос заканчивается точкой с запятой. Без неё консольный клиент MySQL не выполнит команду и будет ждать продолжения, поэтому длинный запрос можно спокойно разбить на несколько строк. Стрелка вверх возвращает предыдущие команды, и длинный запрос не приходится набирать заново.
SHOW DATABASES
Показывает базы на сервере. Часть из них система создаёт сама при установке.
CREATE DATABASE и DROP DATABASE
Создают и удаляют базу: CREATE DATABASE students; и DROP DATABASE test;.
USE
Выбирает базу для работы. Без него CREATE TABLE courses выдаст ошибку No database selected: сервер не знает, к какой базе относится таблица.
SHOW TABLES и DESC
Первая перечисляет таблицы выбранной базы. Вторая описывает одну таблицу: колонки, их типы, можно ли оставить значение пустым, первичный ключ и значения по умолчанию.
Пример: длина имени
Форма регистрации пропускает имя длиной 100 символов, а DESC users показывает у колонки name тип VARCHAR(50). Тестировщик вводит 51 символ: MySQL в строгом режиме, который включён по умолчанию, отвечает ошибкой Data too long for column 'name' at row 1, и вместо понятного сообщения пользователь видит сбой. В баг-репорте указывают оба лимита, чтобы команда решила, какой из них верный.
CREATE TABLE, ALTER TABLE и DROP TABLE
Создают таблицу, меняют набор её колонок и удаляют таблицу целиком.
INSERT, UPDATE и DELETE
Добавляют строки, меняют значения в них и удаляют строки.
SELECT
Показывает данные. SELECT * FROM courses; выводит все строки и колонки таблицы courses.
Пример: таблица курсов с нуля
В уроке я создаю базу студентов и в ней таблицу курсов с тремя колонками: идентификатор, факультет и номер курса. Ниже тот же путь по шагам. Повторить его можно в консоли MySQL или прямо в браузере, в SQL-песочнице по ссылке под примером.
1. Создать базу и перейти в неё
CREATE DATABASE students; и затем USE students;. Команда SHOW TABLES; после этого вернёт пустой список, потому что таблиц ещё нет.
2. Создать таблицу
CREATE TABLE courses (id INT NOT NULL PRIMARY KEY, faculty VARCHAR(55) NULL, number INT NULL);. Колонка id – первичный ключ, она обязательна и уникальна, а факультет и номер можно оставить пустыми.
3. Проверить структуру
DESC courses; покажет три колонки, их типы и пометку PRI у первичного ключа. SELECT * FROM courses; пока ничего не выведет: строк в таблице нет.
4. Добавить строки
INSERT INTO courses VALUES (1, 'bio', 1);. Значения идут в том же порядке, что колонки в таблице, а строки берут в кавычки. Так же добавляют остальные факультеты.
5. Изменить значение
UPDATE courses SET faculty = 'chem' WHERE id = 2; меняет факультет только в строке с id = 2.
6. Удалить строку
DELETE FROM courses WHERE faculty = 'chem'; удаляет строки с этим факультетом. Без WHERE команда очистит всю таблицу.
7. Убрать и вернуть колонку
ALTER TABLE courses DROP COLUMN id; убирает колонку, а ALTER TABLE courses ADD COLUMN id INT AFTER number; добавляет её после колонки number. Чтобы колонка встала первой, вместо AFTER number пишут FIRST.
Как тренироваться и что спросят на собеседовании
Домашнее задание из урока – поставить MySQL Community Server, создать несколько таблиц, добавить в них строки, поменять и удалить значения, а потом удалить сами таблицы и базу. Сервер бесплатный. При установке я выбираю вариант Server only, задаю пароль пользователя root и пишу запросы в консольном клиенте MySQL Command Line Client.
Без установки те же запросы выполняются в SQL-песочнице платформы. В ней лежит база интернет-магазина из курса SQL, данные можно менять и создавать свои таблицы, а кнопка возвращает базу к исходной. Песочница работает на SQLite, поэтому команд CREATE DATABASE, SHOW, USE и DESC в ней нет, новая колонка добавляется только в конец таблицы, а колонку первичного ключа, как id в примере выше, удалить нельзя: SQLite ответит ошибкой cannot drop PRIMARY KEY column. CREATE TABLE, INSERT, UPDATE, DELETE и SELECT пишутся так же, как в MySQL.
С DELETE и DROP стоит обращаться осторожнее, чем с остальными командами: одна строка без условия очищает таблицу или удаляет базу целиком. На рабочих базах права тестировщика обычно ограничены, но привычку перечитывать такой запрос перед запуском лучше завести сразу.
На собеседовании чаще дают SELECT: таблицу с данными и задание вывести значения одного поля по условию. Ответ на такое задание выглядит, например, так: SELECT faculty FROM courses WHERE number > 5;. Условия, сортировку и объединение таблиц через JOIN я разбираю в следующих уроках курса.
Видеоурок, песочница и задания
Я показываю установку MySQL и все команды этой страницы в двадцатом уроке курса "Тестировщик с нуля" на YouTube. В бесплатном базовом курсе по тестированию есть урок на эту тему, и после теории в нём идут задания.
Шпаргалка по SQL собирает SELECT, WHERE, JOIN и GROUP BY с примерами, а шпаргалка о базах данных объясняет таблицы, ключи и связи. В тренажёре запросы пишут на живых данных. Дальше, на задачах из рабочего дня тестировщика, SQL учит мой отдельный курс.
Курсы по теме
Вопросы и ответы
Зачем тестировщику знать SQL?
Чтобы проверять, что приложение действительно записало данные в базу, готовить тестовые данные без долгого пути через интерфейс и находить записи для воспроизведения бага. Кроме того, на собеседовании junior-тестировщика часто просят написать SELECT.
Какие SQL-запросы спрашивают на собеседовании тестировщика?
Чаще всего SELECT с условием и JOIN: дают таблицы с данными и просят вывести значения по условию, например те, что больше пяти. Команды создания и изменения таблиц спрашивают реже, но их стоит знать, чтобы собрать себе базу для тренировки.
Как создать таблицу в MySQL?
Выбрать базу командой USE, затем выполнить CREATE TABLE с названием таблицы и списком колонок в скобках: имя колонки, тип данных и признаки вроде NOT NULL и PRIMARY KEY. Например: CREATE TABLE courses (id INT NOT NULL PRIMARY KEY, faculty VARCHAR(55));. Структуру готовой таблицы показывает DESC courses;.
Чем DELETE отличается от DROP?
DELETE удаляет строки, и таблица остаётся на месте. DROP TABLE удаляет таблицу целиком вместе со структурой, DROP DATABASE удаляет всю базу. DELETE без условия WHERE очищает таблицу полностью, поэтому условие перед запуском стоит перечитать.
Где бесплатно потренироваться писать SQL-запросы?
Можно поставить бесплатный MySQL Community Server и создавать таблицы в консоли, как в моём уроке. Без установки запросы пишутся в SQL-песочнице Rusau Learn: в ней учебная база интернет-магазина, и регистрация не нужна.
Посмотреть программы курсов
Программа каждого курса открыта целиком: видны все модули, уроки и число шагов.
