Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
66
Добавлен:
23.11.2017
Размер:
97.28 Кб
Скачать

9.3. Многотабличные запросы на чтение (соединения)

Язык SQL позволяет получать ответы на многотабличные запросы, которые соединяют данные из нескольких таблиц.

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

Из рис. 9.3 видно, что три запрашиваемых элемента данных хранятся в двух различных таблицах:

  1. в таблице PERSON содержится фамилия, имя, отчество жителя и адрес его квартиры, но в ней отсутствует номер телефона;

  2. в

    NOM

    FIO

    ADR

    ИВАНОВ…

    810-012

    1

    . . . . . . .

    . . . . . . .

    PERSON

    NTEL

    ADR

    . . . . . . . .

    531-41-51

    810-012

    TPHONE

    (Связь таблиц

    связанные столбцы)

    Рис. 9.3 Запрос, который использует две таблицы.

    таблицеTPHONE содержатся номера телефонов и адреса квартир, где они установлены, но в ней нет информации о жителях.

Вывести список жителей, имеющих телефоны, с указанием фамилии, имени, отчества, адреса квартиры и номера телефона

Однако между двумя этими таблицами существует связь по адресам квартир. Очевидно, чтобы получить требуемую таблицу результатов, в оператореSELECT надо учесть существующую связь между таблицами. Этот оператор должен выполнить предположительно следующие действия:

  1. образовать пустую таблицу результатов из трех столбцов, содержащих значения FIO, ADR, NTEL и начать просмотр таблицы TPHONE;

  2. найти в таблицах TPHONE и PERSON пару строк, в которых совпадают значения столбцов ADR;

  3. из найденной пары строк выбрать фамилию, имя, отчество(FIO),адрес квартиры(ADR), номер телефона(NTEL) и сформировать из этих значений одну новую строку в таблице результатов;

  4. пока не просмотрены все строки в таблице TPHONE, переходить к шагу 2.

Конечно, это не единственный способ получить таблицу результатов данного запроса, но как бы она не получалась, всегда имеются две особенности:

  1. каждая строка таблицы результатов запроса формируется из пары строк: одна строка находится в таблице THONE, а другая - в таблице PERSON;

  2. для нахождения данной пары строк производится сравнение содержимого соответствующих столбцов в этих таблицах.

Процесс формирования строк путем сравнения содержимого соответствующих столбцов называется соединением таблиц. Соединение таблиц задается в предложении WHERE, в котором условие поиска имеет вид сравнения столбцов из разных таблиц.

В нашем примере нужная таблица результатов формируется оператором:

SELECT FIO, ADR, NTEL

From person, tphone

WHERE PERSON.ADR=TPHONE.ADR

Обратите внимание, что в операторе SELECT нет указаний о том, как должен выполняться запрос. В нем нет никаких упоминаний вроде “начните с жителей” или “начните с телефонов”. Вместо этого в запросе указано, что должны представлять собой результаты запроса. Способ получения результатов определяет сама СУБД.

В многотабличном запросе можно комбинировать условие поиска, в котором задаются связанные столбцы, с другими условиями поиска, чтобы еще больше сузить результаты запроса.

Например, можно вывести список жителей, имеющих телефоны и получающих общий доход не меньший 400 руб.:

SELECT FIO, ADR, NTEL

Соседние файлы в папке БД лабы