Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect2_m3_ipovs_ipovs_bd_230100.doc
Скачиваний:
12
Добавлен:
27.03.2016
Размер:
94.21 Кб
Скачать

From person, flat, tphone

WHERE PERSON.ADR=FLAT.ADR

AND FLAT.ADR=TPHONE.ADR

AND SUMD>=1400.00

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

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

SELECT NOM, FIO, SOURCE, MONEY

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.MONEY

FROM PERSON A , PROFIT B, HAVE_D C

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

AND A.NOM=12

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

В многотабличном запросе вместо списка возвращаемых столбцов может быть использована звездочка «*», которая означает включение в таблицу результатов всех столбцов из всех таблиц, указанных в предложении FROM. Например, таблица результатов следующего запроса состоит из девяти столбцов (шесть - из PERSON, три - из 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 ограничивают число таблиц; чаще всего их количество ограничивается восемью.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]