- •9.1. Сортировка таблицы результатов запроса
- •From person
- •From person
- •9.2. Объединение результатов нескольких запросов
- •9.3. Многотабличные запросы на чтение (соединения)
- •From person, tphone
- •From person, ntel
- •From person, flat, tphone
- •From person, profit, have_d
- •From person a , profit b, have_d c
- •From person, tphone
9.3. Многотабличные запросы на чтение (соединения)
Язык SQL позволяет получать ответы на многотабличные запросы, которые соединяют данные из нескольких таблиц.
Чтобы понять, как в SQL реализуются многотабличные запросы, начнем с рассмотрения простого запроса, который соединяет данные из двух различных таблиц: вывести список жителей, имеющих телефоны, с указанием фамилии, имени, отчества, адреса квартиры и номера телефона.
Из рис. 9.3 видно, что три запрашиваемых элемента данных хранятся в двух различных таблицах:
в таблице PERSON содержится фамилия, имя, отчество жителя и адрес его квартиры, но в ней отсутствует номер телефона;
в
NOM
FIO
ADR
ИВАНОВ…
810-012
1
. . . . . . .
. . . . . . .
PERSON
NTEL
ADR
. . . . . . . .
531-41-51
810-012
TPHONE
(Связь таблиц
связанные столбцы)
Рис. 9.3 Запрос, который использует две таблицы.
таблицеTPHONE содержатся номера телефонов и адреса квартир, где они установлены, но в ней нет информации о жителях.
Вывести
список жителей, имеющих телефоны, с
указанием фамилии, имени, отчества,
адреса квартиры и номера телефона
Однако между двумя этими таблицами существует связь по адресам квартир. Очевидно, чтобы получить требуемую таблицу результатов, в оператореSELECT надо учесть существующую связь между таблицами. Этот оператор должен выполнить предположительно следующие действия:
образовать пустую таблицу результатов из трех столбцов, содержащих значения FIO, ADR, NTEL и начать просмотр таблицы TPHONE;
найти в таблицах TPHONE и PERSON пару строк, в которых совпадают значения столбцов ADR;
из найденной пары строк выбрать фамилию, имя, отчество(FIO),адрес квартиры(ADR), номер телефона(NTEL) и сформировать из этих значений одну новую строку в таблице результатов;
пока не просмотрены все строки в таблице TPHONE, переходить к шагу 2.
Конечно, это не единственный способ получить таблицу результатов данного запроса, но как бы она не получалась, всегда имеются две особенности:
каждая строка таблицы результатов запроса формируется из пары строк: одна строка находится в таблице THONE, а другая - в таблице PERSON;
для нахождения данной пары строк производится сравнение содержимого соответствующих столбцов в этих таблицах.
Процесс формирования строк путем сравнения содержимого соответствующих столбцов называется соединением таблиц. Соединение таблиц задается в предложении WHERE, в котором условие поиска имеет вид сравнения столбцов из разных таблиц.
В нашем примере нужная таблица результатов формируется оператором:
SELECT FIO, ADR, NTEL
From person, tphone
WHERE PERSON.ADR=TPHONE.ADR
Обратите внимание, что в операторе SELECT нет указаний о том, как должен выполняться запрос. В нем нет никаких упоминаний вроде “начните с жителей” или “начните с телефонов”. Вместо этого в запросе указано, что должны представлять собой результаты запроса. Способ получения результатов определяет сама СУБД.
В многотабличном запросе можно комбинировать условие поиска, в котором задаются связанные столбцы, с другими условиями поиска, чтобы еще больше сузить результаты запроса.
Например, можно вывести список жителей, имеющих телефоны и получающих общий доход не меньший 400 руб.:
SELECT FIO, ADR, NTEL