В одной из первых статей я писал, что навык работы с Базами Данных и знание SQL - жизненно важное умения для аналитика данных. Понимая, что аудитория канала может обладать совершенно разным уровнем навыков работы с SQL, я подумал, что логично будет выстроить SQL-ликбез таким образом, чтобы в его рамках нашлось что-то интересное как для совсем-совсем новичков, так и для матерых аналитиков.
Что будет по теме SQL далее на этом канале? Я возьму сайт-тренажер (на всякий случай, это не реклама, если она когда-либо в будущем и будет, то это будет явно отмечено), и пойду по порядку заданий от элементарнейших к сложным, попутно объясняя нюансы запросов и проектирования БД. Преимущество этого тренажера в том, что писать запросы и получать результаты могут даже незарегистрированные юзеры. Правда, я в нем до этого ничего не делал, но на первый взгляд все довольно наглядно.
Первые задачи, конечно же, не вызовут трудностей и у джуниор-аналитиков, если их разбудить после отмечания первой зарплаты в 3 часа утра, но даже в них я постараюсь дать более широкое представление о работе с SQL-базами данных.
Задача 1 про пассажиров авиакомпаний. Есть вот такая структура в БД, состоящая из 4-х таблиц:
Что можно сказать, глядя на нее? Архитекторы баз данных всегда стараются сделать их чтение и понимание максимально простым, поэтому названия таблиц и полей, очевидно, должны быть понятными и интерпретируемыми.
Таблица Trip содержит общую информацию о рейсах, Pass_in_trip - о пассажирах на конкретном рейсе, Company содержит наименования авиакомпаний и, наконец, Passenger - имена пассажиров.
Такие структуры баз данных могут рассказать не только состав полей в таблицах и связи между ними: например, по иконке ключика около полей id можно сделать вывод о том, что поля id являются первичным ключом (PRIMARY KEY) этих таблиц, а это в свою очередь означает, что поля id уникальны. То есть в таблице Passenger один пассажир не встретится более одного раза. Такие нюансы важно понимать при анализе БД и последующих запросах, т.к. они напрямую могут повлиять на результат.
Задача - Вывести имена всех когда-либо обслуживаемых пассажиров авиакомпаний. Это, очевидно, осуществляется самым элементарным запросом к БД:
SELECT name FROM Passenger
При этом нужно отметить, что по условию не до конца понятно, если есть два разных пассажира (с разными id) по имени Ivan Ivanov, в результате должно быть две строки Ivan Ivanov или одна? Запрос выше выдаст две строки.
Следующий запрос может вывести только уникальные значения имен пассажиров:
SELECT DISTINCT name FROM Passenger
[DISTINCT позволяет получить список из уникальных значений]
Но все-таки задача в том, чтобы вывести имена уникальных пассажиров, а не уникальные имена пассажиров, поэтому используем первый запрос. А вообще заказчикам нужно ставить задачи без возможных двойных толкований )
Спасибо за прочтение, подписывайтесь на телеграм )