SQL имел бы очень маленькое практическое применение, если бы позволял получать данные только из одной таблицы.
При проектировании структуры данных стараются исключать дублирование данных (см нормальные формы).
Посмотрим на таблицу городов (city
)
SELECT *
FROM city
city_id | name | timezone_id |
---|---|---|
1 | Москва | 2 |
2 | Санкт-Петербург | 2 |
3 | Новосибирск | 5 |
... | ... | ... |
В ней нет никакой информации o часовом поясе, только его идентификатор. Чтобы получить информацию о часовом поясе, нужно соединить таблицу городов (city
) с таблицей часовых поясов (timezone
) по идентификатору (timezone_id
), т.е. для каждой записи из таблицы городов нужно получить ровно одну запись из таблицы часовых поясов с соответствующим идентификатором.
Рассмотрим запрос соединения таблиц городов и часовых поясов:
SELECT *
FROM city
JOIN timezone
ON timezone.timezone_id = city.timezone_id
city_id | name | timezone_id | timezone_id | time_offset |
---|---|---|---|---|
1 | Москва | 2 | 2 | UTC+3 |
2 | Санкт-Петербург | 2 | 2 | UTC+3 |
3 | Новосибирск | 5 | 5 | UTC+6 |
... | ... | ... | ... | ... |
SELECT * -- выбрать все поля
FROM city -- из таблицы city
JOIN timezone -- присоединить таблицу timezone
ON timezone.timezone_id = city.timezone_id
-- для каждой записи из city сопоставить запись
-- из timezone с совпадающим timezone_id
Обрати внимание на столбцы полученного результата, состоящего из 5 столбцов
city_id
- идентификатор города из таблицыcity
;name
- название города из таблицыcity
;timezone_id
- идентификатор часового пояса из таблицыcity
;timezone_id
- идентификатор часового пояса из таблицыtimezone
;time_offset
- время относительно UTC из таблицыtimezone
.
Столбец timezone_id
встретился дважды в результате, потому что он есть в каждой из таблиц.
Синтаксис соединения таблиц:
SELECT список_полей
FROM таблица1
JOIN таблица2 ON условия_присоединения_таблицы2
JOIN таблица3 ON условия_присоединения_таблицы3
...