
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 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 ограничивают число таблиц; чаще всего их количество ограничивается восемью.