В предыдущих уроках мы рассматривали примеры, в которых соединялись только две таблицы. В этом уроке мы научимся соединять три и более таблицы в одном запросе.
Соединяем три таблицы
Представим, что мы разрабатываем сервис для заказа такси. В базе данных хранится информация о водителях, пассажирах и поездках:
Таблица-справочник drivers
хранит информацию о водителях:
drivers
driver_id | driver_name | phone |
---|---|---|
1 | Иванов А.Б. | +71112223344 |
2 | Петрова В.Г. | +71113334455 |
Таблица-справочник passengers
хранит информацию о пассажирах:
passengers
passenger_id | passenger_name | phone |
---|---|---|
101 | Орлов Д.Е. | +72229998877 |
102 | Соколова Ж.З. | +72228889900 |
103 | Ястребов И.К. | +73339995566 |
Таблица-связка rides
хранит информацию о поездках:
rides
ride_id | driver_id | passenger_id | price |
---|---|---|---|
1001 | 1 | 101 | 567 |
1002 | 1 | 102 | 234 |
1003 | 2 | 103 | 1234 |
1004 | 2 | 103 | 765 |
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 ...
. Добавляя секции, мы можем соединить произвольное число таблиц.
Результат выполнения запроса:
Соединение трех таблиц
driver | passenger | ride_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-запросе. Логически можно представить, что каждая новая таблица соединяется с результатом предыдущего соединения.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.