SQL: Join

Теория: Соединение трех и более таблиц

В предыдущих уроках мы рассматривали примеры, в которых соединялись только две таблицы. В этом уроке мы научимся соединять три и более таблицы в одном запросе.

Соединяем три таблицы

Представим, что мы разрабатываем сервис для заказа такси. В базе данных хранится информация о водителях, пассажирах и поездках:

Таблица-справочник drivers хранит информацию о водителях:

drivers

driver_iddriver_namephone
1Иванов А.Б.+71112223344
2Петрова В.Г.+71113334455

Таблица-справочник passengers хранит информацию о пассажирах:

passengers

passenger_idpassenger_namephone
101Орлов Д.Е.+72229998877
102Соколова Ж.З.+72228889900
103Ястребов И.К.+73339995566

Таблица-связка rides хранит информацию о поездках:

rides

ride_iddriver_idpassenger_idprice
10011101567
10021102234
100321031234
10042103765

View on DB Fiddle

Допустим, нам нужно получить информацию о поездках в удобном виде: с именами водителя, пассажира и стоимостью поездки. Эту задачу мы можем решить, если выполним соединение трех таблиц:

SELECT
    drv.driver_name AS driver, -- имя водителя
    pas.passenger_name AS passenger, -- имя пассажира
    rd.price AS ride_price -- стоимость поездки
FROM rides AS rd
INNER JOIN drivers AS drv
    ON -- первое соединение
        rd.driver_id = drv.driver_id
INNER JOIN passengers AS pas ON -- второе соединение
    rd.passenger_id = pas.passenger_id

Чтобы выполнить соединение с третьей таблицей, мы добавили в запрос еще одну секцию INNER JOIN ... ON .... Добавляя секции, мы можем соединить произвольное число таблиц.

Результат выполнения запроса:

Соединение трех таблиц

driverpassengerride_price
Иванов А.Б.Орлов Д.Е.567.00
Иванов А.Б.Соколова Ж.З.234.00
Петрова В.Г.Ястребов И.К.1234.00
Петрова В.Г.Ястребов И.К.765.00

View on DB Fiddle

Здесь мы сначала соединили первые две таблицы: rides INNER JOIN drivers = rides_and_drivers. Затем результат соединили с третьей таблицей: rides_and_drivers INNER JOIN passengers.

На практике СУБД может поменять порядок соединения таблиц в целях оптимизации, но результат будет содержать те же строки.

Выводы

В этом уроке мы научились соединять несколько таблиц. Каждая новая таблица в соединении описывается отдельной секцией INNER JOIN ... ON ... в SQL-запросе. Логически можно представить, что каждая новая таблица соединяется с результатом предыдущего соединения.

Рекомендуемые программы