В предыдущих уроках мы рассматривали примеры, в которых соединялись только две таблицы. В этом уроке мы научимся соединять три и более таблицы в одном запросе.
Соединяем три таблицы
Представим, что мы разрабатываем сервис для заказа такси. В базе данных хранится информация о водителях, пассажирах и поездках:
Таблица-справочник 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-запросе. Логически можно представить, что каждая новая таблица соединяется с результатом предыдущего соединения.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.