Как написать SQL запрос для объединения двух таблиц с машинами и номерами, чтобы найти конкретную марку?
Что проверяют
Умеете ли вы связать две таблицы по ключу и понимаете ли, какие строки при этом пропадут или задвоятся. Для QA это ежедневная задача: проверить в базе, что записалось после действия в интерфейсе. Следом часто просят найти машины без номера.
Как отвечать
Сначала проговорите структуру, раз её не дали: cars (id, brand, model) и plates (id, car_id, number), где car_id ссылается на cars.id. Затем запрос: SELECT c.brand, c.model, p.number FROM cars c JOIN plates p ON p.car_id = c.id WHERE c.brand = 'Toyota'.
Дальше покажите, что понимаете его поведение:
JOIN(он жеINNER JOIN): вернёт только машины, у которых есть номер. Машина без номера в выборку не попадёт;LEFT JOIN: оставит все машины марки, у машин без номера вp.numberбудетNULL. Найти именно их можно условиемWHERE p.id IS NULL;- регистр и пробелы: в данных встречается и
toyota, иTOYOTAс пробелом. В PostgreSQL сравнение строк чувствительно к регистру, поэтому для проверки берутlower(trim(c.brand)) = 'toyota'илиILIKE; - задвоение: если у машины несколько номеров (история перерегистраций), она выйдет несколькими строками. Тогда нужно условие на актуальный номер или
COUNT(DISTINCT c.id), если считаете машины.
Сильный ход для тестировщика: сразу назвать данные, которые вы подготовили бы для проверки запроса. Машина без номера, номер без машины (если внешнего ключа нет), марка в разном регистре, машина с двумя номерами.
Где спотыкаются
Ставят условие на правую таблицу в WHERE после LEFT JOIN, например WHERE p.number LIKE 'А%'. Строки с NULL отсекаются, и LEFT JOIN фактически превращается во внутренний.
Пишут строку в двойных кавычках: WHERE brand = "Toyota". В PostgreSQL двойные кавычки означают имя колонки, и запрос падает с ошибкой.
Проверяют пустое значение через = NULL. Такое сравнение никогда не бывает истинным, нужно IS NULL.