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

From person, ntel

WHERE PERSON.ADR=TPHONE.ADR

AND SUMD>=400.00

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

SELECT FIO, ADR, KCATEGORY, NTEL, TCATEGORY

From person, flat, tphone

WHERE PERSON.ADR=FLAT.ADR

AND FLAT.ADR=TPHONE.AND

AND SUMD>=400.00

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

Рис. 9.4. Первичные и внешние ключи

Если в БД имеется таблица PROFIT, хранящая перечень различных источников (SOURCE) и размеров (MONEYS) доходов, пронумерованных с использованием числового идентификатора ID, и таблица HAVE_D, показывающая связь жителя (NOM) с его доходами (ID), то можно получить ответ на запрос обо всех доходах, которые получает житель с заданным номером (или известной фамилией, именем, отчеством):

SELECT NOM, FIO, SOURCE, MONEYS, COMMENT

From person, profit, have_d

WHERE PERSON.NOM=HAVE_D.NOM

AND PROFIT.ID=HAVE_D.ID

AND PERSON.NOM=12

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

SELECT A.NOM, A.FIO, B.SOURCE, B.MONEYS, C.COMMENT

From person a , profit b, have_d c

WHERE A.NOM=C.NOM AND B.ID=C.ID

AND A.NOM=12

Псевдонимом может быть любое допустимое имя.

В многотабличном запросе вместо списка возвращаемых столбцов может быть использована звездочка *, которая означает включение в таблицу результатов всех столбцов из всех таблиц, указанных в предложении FROM. Например, таблица результатов следующего запроса состоит из 9 столбцов(6 - из PERSON, 3 - из TPHONE):

SELECT * FROM PERSON, TPHONE

WHERE PERSON.ADR=TPHONE.ADR

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

SELECT PERSON.*, NTEL

From person, tphone

WHERE PERSON.ADR=TPHONE.ADR

Самосоединение. Возможность использования псевдонимов для таблиц позволяет соединить таблицу саму с собой. Например, найти пары жителей-однофамильцев, не проживающих вместе, позволяет следующий запрос:

SELECT A.FIO, A.ADR, COPY.FIO, COPY.ADR

FROM PERSON A, PERSON COPY

WHERE A.FIO=COPY.FIO

AND A.ADR < COPY.ADR

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

SELECT A.FIO, COPY.FIO, A.SUMD

FROM PERSON A, PERSON COPY

WHERE A.SUMD=COPY.SUMD

Из-за симметричности условия поиска таблица результатов содержит избыточные данные для каждой пары жителей X и Y:

PERSON.FIO

COPY.FIO

PERSON.SUMD

X

X

Y

Y

X

Y

X

Y

N

N

N

N

Из каждой четверки строк интерес представляет только одна строка, а именно:

Чтобы исключить избыточность, условие поиска нужно дополнить проверкой PERSON.FIO<COPY.FIO, чтобы сделать условие поиска асимметричным:

SELECT A.FIO, COPY.FIO, A.SUMD

FROM PERSON A, PERSON COPY

WHERE A.SUMD = COPY.SUMD

AND A.FIO < COPY.FIO

С увеличением количества таблиц в запросе резко возрастает объем работы, необходимой для выполнения запроса. В самом языке SQL нет ограничений на число таблиц, указанных в одном запросе. Но некоторые реализации SQL ограничивают число таблиц; чаще всего их количество ограничивается восемью.

Вопросы для самоконтроля

  1. Приведите пример использования предложения ORDER BY в операторе SELECT (для учебной БД).

  2. Для чего предназначен оператор UNION?

  3. Перечислите требования к таблицам результатов запросов, объединяемым оператором UNION.

  4. Приведите пример использования оператора UNION (для учебной БД).

  5. Для учебной БД приведите пример многотабличного запроса на языке SQL со словесной формулировкой и эквивалентным выражением на языке реляционной алгебры.

  6. В каком предложении оператора SELECT задаются псевдонимы таблиц?

  7. Приведите пример использования псевдонимов таблиц в операторе SELECT (для учебной БД).

  8. Для учебной БД приведите пример использования самосоединения в запросе на языке SQL.

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