Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 8БД.doc
Скачиваний:
27
Добавлен:
30.05.2020
Размер:
71.68 Кб
Скачать

8. Лекція

ТЕМА: Побудова нетривіальних запитів

МЕТА: Дати визначення підзапиту. Наести приклади формування вкладених підзапитів. Показати спосіб побудови підзапитів, що повертають множинні і одиничні значення з використанням операторів EXISTS, ALL, ANY.

ПЛАН

1 Поняття підзапиту

2 Використовування підзапитів, що повертають безліч значень

3 Використовування операцій IN і NOT IN

4 Використовування ключових слів ANY і ALL

1 Поняття підзапиту

Часто неможливо вирішити поставлену задачу шляхом одного запиту. Це особливо актуально, коли при використовуванні умови пошуку в пропозиції WHERE значення, з яким треба порівнювати, наперед не визначено і повинне бути обчислено у момент виконання оператора SELECT. У такому разі приходять на допомогу закінчені оператори SELECT, упроваджені в тіло іншого оператора SELECT. Внутрішнім підзапитом є також оператор SELECT, а кодування його пропозицій підкоряється тим же правилам, що і основного оператора SELECT. Зовнішній оператор SELECT використовує результат виконання внутрішнього оператора для визначення змісту остаточного результату всієї операції. Внутрішні запити можуть бути поміщені безпосередньо після оператора порівняння ( = < >, <=, >=, <> ) в пропозиції WHERE і HAVING зовнішнього оператора SELECT – вони одержують назву підзапитів або вкладених запитів. Крім того, внутрішні оператори SELECT можуть застосовуватися в операторах INSERT, UPDATE і DELETE.

Підзапит – це інструмент створення тимчасової таблиці, вміст якої витягується і обробляється зовнішнім оператором. Текст підзапиту повинен бути укладений в дужки. До підзапитів застосовуються наступні правила і обмеження:

  • фраза ORDER не використовується, хоча і може бути присутня в зовнішньому підзапиті;

  • список в пропозиції SELECT складається з імен окремих стовпців або складених з них виразів – за винятком випадку, коли в підзапиті присутнє ключове слово EXISTS;

  • за умовчанням імена стовпців в підзапиті відносяться до таблиці, ім'я якої вказано в пропозиції FROM. Проте допускається посилання і на стовпці таблиці, вказаної у фразі FROM зовнішнього запиту, для чого застосовуються кваліфіковані імена стовпців (тобто з вказівкою таблиці);

  • якщо підзапит є одним з двох операндів, що беруть участь в операції порівняння, то запит повинен указуватися в правій частині цієї операції.

Існує два типи підзапитів:

Скалярний підзапит повертає єдине значення. У принципі, він може використовуватися скрізь, де вимагається вказати єдине значення.

Табличний підзапит повертає безліч значень, тобто значення одного або декількох стовпців таблиці, розміщені в більш ніж одному рядку. Він можливий скрізь, де допускається наявність таблиці.

Використовування підзапитів, що повертають одиничне значення

Приклад 7.1. Визначити дату продажу максимальної партії товару.

SELECT Дата, Кількість

FROM Операція

WHERE Кількість = (SELECT Max (Кількість) FROM Операція)

Приклад 7.1. Визначення дати продажу максимальної партії товару.

У вкладеному підзапиті визначається максимальна кількість товару. В зовнішньому підзапиті – дата, для якої кількість товару виявилася рівною максимальному. Необхідно відзначити, що не можна прямо використовувати пропозицію WHERE Кількість = Max(Кількість), оскільки застосовувати узагальнюючі функції в пропозиціях WHERE заборонено. Для досягнення бажаного результату слід створити підзапит, що обчислює максимальне значення кількості, а потім використовувати його в зовнішньому операторі SELECT, призначеному для вибірки дат операцій, де кількість товару співпала з максимальним значенням.

Приклад 7.2. Визначити дати операцій, що перевищили по кількості товару середнє значення і вказати для цих операцій перевищення над середнім рівнем.

SELECT Дата, Кількість Кількість - (SELECT Avg(Кількість)

FROM Операція) AS Перевищення

FROM Операція

WHERE Кількість > (SELECT Avg(Кількість) FROM Операція)

Приклад 7.2. Визначення дати операцій, що перевищили по кількості товару середнє значення і вказати для цих операцій перевищення над середнім рівнем.

В приведеному прикладі результат підзапиту, що є середнім значенням кількості товару по всіх операціях взагалі, використовується в зовнішньому операторі SELECT як для обчислення відхилення кількості від середнього рівня, так і для відбору відомостей про дати.

Приклад 7.3. Визначити клієнтів, що вчинили операції з максимальною кількістю товару.

SELECT Клієнт.Прізвище

FROM Клієнт INNER JOIN Операція ON Клієнт.КодКлієнта = Операція.КодКлієнта

WHERE Операція.Кількість = (SELECT Max(Операція.Кількість)

FROM Операція)

Приклад 7.3. Визначення клієнтів, що вчинили операції з максимальною кількістю товару.

Тут показаний приклад використовування підзапиту при вибірці даних з різних таблиць.

Приклад 7.4. Визначити клієнтів, в операціях яких кількість товару відрізняється від максимального не більше ніж на 10%.

SELECT Клієнт.Прізвище, Операція.Кількість

FROM Клієнт INNER JOIN Операція ON Клієнт.КодКлієнта = Операція.КодКлієнта

WHERE Операція.Кількість>=0.9* (SELECT Max(Операція.Кількість)

FROM Операція)

Приклад 7.4. Визначення клієнтів, в операціях яких кількість товару відрізняється від максимального не більше ніж на 10%.

Покажемо, як застосовуються підзапити в пропозиції HAVING.

Приклад 7.5. Визначити дати, коли середня кількість проданого за день товару виявилася більше 20 одиниць.

SELECT Операція.Дата, Avg(Операція.Кількість) AS Среднє_за_день

FROM Операція

GROUP Операція.Дата

HAVING Avg(Операція.Кількість) >20

Приклад 7.5. Визначення дати, коли середня кількість проданого за день товару виявилася більше 20 одиниць.

За кожний день визначається середня кількість товару, яка порівнюється з числом 20. Додамо в запит підзапит.

Приклад 7.6. Визначити дати, коли середня кількість проданого за день товару виявилася більше середнього показника по всіх операціях взагалі.

SELECT Операція.Дата Avg(Операція.Кількість) AS Среднєє_за_день

FROM Операція

GROUP Операція.Дата

HAVING Avg(Операція.Кількість) > (SELECT Avg(Операція.Кількість)

FROM Операція)

Приклад 7.6. Визначення дати, коли середня кількість проданого за день товару виявилася більше середнього показника по всіх операціях взагалі.

Внутрішній підзапит визначає середній по всіх операціях показник, з яким в зовнішньому запиті порівнюється середня за кожний день кількість товару.

Соседние файлы в папке лекции