- •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
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 ограничивают число таблиц; чаще всего их количество ограничивается восемью.
Вопросы для самоконтроля
Приведите пример использования предложения ORDER BY в операторе SELECT (для учебной БД).
Для чего предназначен оператор UNION?
Перечислите требования к таблицам результатов запросов, объединяемым оператором UNION.
Приведите пример использования оператора UNION (для учебной БД).
Для учебной БД приведите пример многотабличного запроса на языке SQL со словесной формулировкой и эквивалентным выражением на языке реляционной алгебры.
В каком предложении оператора SELECT задаются псевдонимы таблиц?
Приведите пример использования псевдонимов таблиц в операторе SELECT (для учебной БД).
Для учебной БД приведите пример использования самосоединения в запросе на языке SQL.