8 Шагов по составлению SQL

8 Шагов по составлению SQL

Aleksandr Meshkov

Всем привет. Часто на собеседованиях сталкиваюсь с тем, что у кандадатов возникают сложности и решением задач по написанию запросов к БД, особенно, когда это касается конструкций JOIN.


Поэтому решил сделать для вас небольшой план, как лучше всего подходить к написанию подобных запросов.

Возьмем для примера простую задачу из SQL Academy, в которой необходимо “Вывести дату и время прилёта конкретного пассажира в конкретный город”

Что делаем?


  1. Найдите таблицу, откуда вам нужно вывести данные, определите нужные столбцы для вывода. Время прилета - time_in, следовательно таблица Trip. 
  2. Определите условия вывода, то есть каким условиям выводимые данные должны соответствовать. С городом все просто - town_to, таблица Trip. А вот с именем пассажира уже сложнее, так как имя пассажира - это name в таблице Passenger.
  3. Определите таблицы, откуда можно получить условия (Trip и Passenger).
  4. Определите связь с таблицей из пункта 1, а именно по каким ключам связаны таблицы. Тут обращаю внимание, что связь не всегда идет строго по ID (таблица 1 ID - таблица 2 ID), но и также связь может быть по конкретному столбцу таблицы (таблица 1 name - таблица 2 ID). Также тут важно понимать, что связь может идти не напрямую, а через промежуточные таблицы, в таком случае таблицы нужно связывать последовательно друг за другом начиная от таблицы пункта 1 и заканчивая таблицей из п 3.
  5. Как определить связи? Тут многие начинают путаться, особенно на собеседованиях. В каждой схеме БД типы взаимосвязей всегда проставляются в виде черточек между таблицами, если их нет, то всегда спросите интервьюера, как и какими типами взаимосвязей связаны таблицы. В нашем случае поле город прилета (town_to) уже находиться в таблице, откуда нужно вывести время прилета (таблица Trip), тут сложностей нет. Теперь идем по цепочке взаимосвязей таблиц для того, чтобы понять, как нам соединиться с таблице Passenger. Смотрим по серым черточкам, что Trip.id у нас связан с Pass_in_trip.trip, а Pass_in_trip.passenger связан с Passenger.id, как раз той таблицей, откуда нужно будет взять второе условие.
  6. Начинаем писать скрипт от вывода данных до условий по схеме БД через JOIN. Сначала пишем наше селект для выборки: SELECT time_in FROM Trip, далее начинаем связывать таблицу друг за другом, чтобы добраться до таблицы Passenger. JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip - связали первую таблицу со второй и теперь связываем вторую с третьей, откуда мы как раз возьмем имя пассажира - JOIN Passenger ON Pass_in_trip.passenger = Passenger.id
  7. Теперь когда все таблиwы связаны, добавляем финальные условия для выборки WHERE Trip.town_to = “Value” and Passenger.name = “Value”
  8. Теперь собрав все части воедино мы получаем наш скрипт, который делает нужную выборку - SELECT time_in FROM Trip JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip JOIN Passenger ON Pass_in_trip.passenger = Passenger.id WHERE Trip.town_to = “Value” and Passenger.name = “Value”


Report Page