Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Базы данных

Внутреннее объединение запросов на выборку

При извлечении данных из одной или нескольких таблиц допускается вложение запроса SELECT внутрь другого запроса SELECT. Количество внутренних (вложенных) запросов SELECT ограничено и зависит от используемой версии языка SQL.

Для подключения внутреннего запроса допускается использование ключевых слов ANY, SOME, ALL, EXISTS и IN.

Назначение ключевых слов EXISTS и IN рассмотрено ранее (примеры 5.22 и 9.22).

а. Ключевые слова ANY и SOME

Эти ключевые слова идентичны и взаимно заменяемы, т. е. выполняют одинаковое действие. Два разных слова были введены для удобства пользователей (как интуитивно понятные).

Ключевое слово ANY (или SOME) возвращает «истину», если для сравниваемого поля из главного запроса находится любое (any) значение поля из подчиненного запроса.

Пример 9.30. Таблица BOOK (см. пример 5.2) содержит сведения о проданных книгах. Предъявить сведения о всех покупках книг, в которых цена (Price) за один экземпляр больше средней цены, хотя бы для одного наименования товара.

SELECT * FROM Book B1 WHERE Bl.Price > ANY (SELECT AVG(B2.Price) FROM Book B2))

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

Младший запрос просматривает таблицу BOOK и определяет среднюю цену экземпляра книги. Для каждой записи, извлеченной из таблицы BOOK старшим запросом, выполняется проверка на превышение цены проданных экземпляров относительно средней цены. Если установлен факт превышения, то ключевое слово ANY возвращает «истину» и запись помещается в выборку и потом предъявляется на экран.

Если воспользоваться данными приложения «CATALOG 2», то результат будет таким, как показано на рис. 9.1. Только в двух издательствах [1,6] изданы книги, цена одного экземпляра которых превышает среднюю цену.

Key_book |Name_book

Keyjown 1 Keyjzd

I Year

Vol

Price

Foto

Annot

?R

?

5 Базы данных

1

1

2002

376

240 (BLOB)

BD_01.rtf

6 Программирование баз данных в Delphi 7

2

6

2003

459

280

(BLOB)

lnf_ec_03.rtf

=

Ключевые слова ANY и SOME предоставляют оригинальную возможность сортировки выборки данных. Например, надо вывести на экран сведения о всех авторах и их книгах.

Пример 9.31. Вариант без сортировки выборки.

SELECT Fam, Name_book, Town, Izd, Price

FROM Book B, Fam F, Izd I, Town T, Per P, Author A WHERE A.Key fam = F.KeyFam AND B.KeyTown = T.KeyTown AND B.Keylzd - I.Keylzd AND B.KeyBook = P.KeyBook AND P.Key_Author = A.Key_Author

AND (B.Name book < ANY (SELECT B2.Name_book FROM Book B2))

Результат выборки вложенного (младшего) запроса сравнивается с названием книги, выбранным главным (старшим) запросом. И для данных приложения «CATALOG 2» будет получена выборка, приведенная на рис. 9.2, т. е. фамилии авторов не упорядочены.

Fam

Мате_Ьоок

Town

|lzd

Price

А

?

Агальцов

Математические методы в программировании

Москва

ИД '•Форум"

95

Агальцов

Информатика для экономистов

Москва

ИД "Форум"

120

Агальцов

Б азы данных

Москва

Мир

240

Титов

Информатика для экономистов

Москва

ИД "Форум"

120

Волдайская

Математические методы в программировании

Москва

ИД "Форум"

95

Г воздева

В ведение в специальность программиста

Москва

ИД "Форум"

65

0

Рис. 9.2. Результат работы запроса примера 9.31

Пример 9.32. Вариант с сортировкой выборки.

SELECT Fam, Name book, Town, Izd, Price

FROM Book B, Fam F, Izd I, Town T, Per P, Author A WHERE A.Key_fam = F.Key_Fam AND B.Key Town = T.Key Town AND B.Key lzd = I.Key lzd AND B.Key Book = P.Key Book AND P.Key_Author = A.Key_Author

AND (Fam < ANY (SELECT B2.Name_book FROM Book B2))

Результат выборки вложенного (младшего) запроса сравнивается с фамилией автора книги, выбранной главным (старшим) запросом. И для данных приложения «САТАЬСЮ !» будет получена следующая выборка, приведенная на рис. 9.3. Фамилии авторов упорядочены.

Fam |Wame_book

Town

Izd

Price

А.

?

Агальцов Математические методы в программировании

Москва

ИД "Форум"

95

Агальцов _И нформатика для э кономистов

Москва

ИД "Форум"

120

1

Агальцов Б азы данных

Москва

Мир

240

Водцайская Математические методы в программировании

Москва

ИД "Форум"

95

Гвоэдева Введение в специальность программиста

Москва

ИД "Форум"

65

Попов Компьютерные сети

Москва

ИД "Форум"

75

V

Рис. 9.3. Результат работы запроса примера 9.32

В некоторых случаях ключевое слово ANY можно заменить на ключевое слово IN или EXISTS. Так, в условии примера 9.31 можно использовать ключевое слово IN.

Пример 9.33. Вариант без сортировки выборки и с использованием ключевого слова IN.

SELECT Fam, Name book, Town, Izd, Price

FROM Book B, Fam F, Izd I, Town T, Per P, Author A WHERE A.Key_fam = F.Key_Fam AND B.KeyTown = T.KeyTown AND B.Keylzd = I.Keylzd AND B.Key Book = P.Key Book AND P.Key_Author = A.Key_Author AND (IN (SELECT B2.Name_book FROM Book B2))

Результат работы запроса будет аналогичный (см. рис. 9.2).

Пример 9.34. Вариант без сортировки выборки и с использованием ключевого слова EXISTS.

SELECT Fam, Name_book, Town, Izd, Price

FROM Book B, Fam F, Izd I, Town T, Per P, Author A WHERE A.Key fam = F.KeyFam AND B.Key Town = T.Key Town AND B Key lzd = I Key lzd AND B.Key Book = P.Key Book AND P.Key_Author = A.Key_Author AND EXISTS (SELECT B2.Name_book FROM Book B2))

Результат работы запроса будет аналогичный (см. рис. 9.2).

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Пред   СОДЕРЖАНИЕ   След >
 

Популярные страницы