Многотабличные запросы на чтение (соединения)
Язык SQL позволяет получать ответы на многотабличные запросы, которые соединяют данные из нескольких таблиц.
Чтобы понять, как в SQL реализуются многотабличные запросы, начнем с рассмотрения простого запроса, который соединяет данные из двух различных таблиц: вывести список жителей, имеющих телефоны, с указанием фамилии, имени, отчества, адреса квартиры и номера телефона.
Из рис. 3.15 видно, что три запрашиваемых элемента данных хранятся в двух различных таблицах:

1) в таблице PERSON содержатся фамилия, имя, отчество жителя и адрес его квартиры, но в ней отсутствует номер телефона;
2) в таблице TPHONE содержатся номера телефонов и адреса квартир, где они установлены, но в ней нет информации о жителях.
Однако между двумя этими таблицами существует связь по адресам квартир. Очевидно, чтобы получить требуемую таблицу результатов, в операторе SELECT надо учесть существующую связь между таблицами. Этот оператор должен выполнить предположительно следующие действия:
1) образовать пустую таблицу результатов из трех столбцов, содержащих значения FIO, ADR, NTEL, и начать просмотр таблицы TPHONE;
2) найти в таблицах TPHONE и PERSON пару строк, в которых совпадают значения столбцов ADR;
3) из найденной пары строк выбрать фамилию, имя, отчество(FIO),адрес квартиры(ADR), номер телефона(NTEL) и сформировать из этих значений одну новую строку в таблице результатов;
4) пока не просмотрены все строки в таблице TPHONE, переходить к шагу 2.
Конечно, это не единственный способ получить таблицу результатов данного запроса, но как бы она ни получалась, всегда имеются две особенности:
1) каждая строка таблицы результатов запроса формируется из пары строк: одна строка находится в таблице TPHONE, а другая - в таблице PERSON;
2) для нахождения данной пары строк производится сравнение содержимого соответствующих столбцов в этих таблицах.
Процесс формирования строк путем сравнения содержимого соответствующих столбцов называется соединением таблиц. Соединение таблиц задается в предложении WHERE, в котором условие поиска имеет вид сравнения столбцов из разных таблиц.
В нашем примере нужная таблица результатов формируется оператором:
SELECT FIO, ADR, NTEL
FROM PERSON, TPHONE
WHERE PERSON.ADR=TPHONE.ADR
Обратите внимание, что в операторе SELECT нет указаний о том, как должен выполняться запрос. В нем нет никаких упоминаний вроде «начните с жителей» или «начните с телефонов». Вместо этого в запросе указано, что должны представлять собой результаты запроса. Способ получения результатов определяет сама СУБД.
В многотабличном запросе можно комбинировать условие поиска, в котором задаются связанные столбцы, с другими условиями поиска, чтобы еще больше сузить результаты запроса.
Например, можно вывести список жителей, имеющих телефоны и получающих общий доход не меньший 1400 руб.:
SELECT FIO, ADR, NTEL
FROM PERSON, NTEL
WHERE PERSON.ADR=TPHONE.ADR
AND SUMD>=1400.00
Язык SQL позволяет соединять данные из трех или более таблиц, используя ту же методику, что и для соединения данных из двух таблиц. Например, следующий оператор выводит список жителей, имеющих телефоны и получающих общий доход не меньше 1400 руб., с указанием категорий квартиры и телефона:
SELECT FIO, ADR, KCATEGORY, NTEL, TCATEGORY
