Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OBDZ5_Lect13-14_SQL_Basics.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
514 Кб
Скачать
☆

Мова sql. Підзапити та вирази з’єднання Підзапити

Мова SQL дозволяє використовувати один запит як допоміжний для обчислень результатів іншого. Запит, який є частиною більш „крупного” запиту, називають підзапитом (subquery). Взаємна вкладеність запитів не обмежується. Крім UNION, існують наступні способи використання підзапитів:

  1. Підзапит повертає скалярне значення, яке порівнюється з з іншим значенням у реченні WHERE.

  2. Підзапит повертає відношення, яке використовується в реченні WHERE саме як відношення.

  3. Підзапит оперує відношеннями в реченні FROM.

Підзапити для обчислення скалярних значень

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

Приклад 5.7. Нехай як в одному з попередніх прикладів знову необхідно визначити ім’я продюсера фільму “Star Wars” з двох відношень бази фільмів:

Продюсер і фільм пов’язані сертифікаційним номером. Нехай підзапит знайде сертифікаційний № продюсера фільму “Star Wars”, а „основний” запит – його ім’я.

Можна вважати, що підзапит у рядках 4-6 поверне відношення з одним атрибутом і одним кортежем, як-от ‘12345’. Якщо підзапит повернув би кілька значень або не повернув би нічого, виникла би помилка часу виконання (runtime error).

Після виконання підзапиту виконується „основний” запит, приблизно такий:

Його результатом має бути рядок ‘George Lucas’.

Умови рівня відношення

Нехай підзапит R повертає множину кортежів з одним атрибутом (для оператора EXISTS це неважливо). Існують наступні оператори, які можна застосувати до відношення R.

Таблиця 5.14. Оператори умов рівня відношення

№

Умова

Дорівнює True, якщо і лише якщо

Еквівалентний вираз

1

EXISTS R

R не пусто

2

s IN R

s дорівнює одному з значень у R

3

s NOT IN R

s не дорівнює жодному зі значень у R

4

s > ALL R

s більше будь-якого значення в R

5

В попередньому виразі оператори порівняння можуть бути:

=, >=, <, <=, <>

Відповідно змінюється зміст умови

s<>ALL R ≡ s NOT IN R

6

s > ANY R

s більше бодай одного значення в R

7

В попередньому виразі оператори порівняння можуть бути:

=, >=, <, <=, <>

Відповідно змінюється зміст умови

s = ANY R ≡ s IN R

Крім того, до всіх цих операторів може застосовуватись NOT.

Ключові слова ALL, ANY у Jet SQL не існують, є лише IN, EXISTS. У Transact SQL вони є.

Наприклад: нехай по Цеху механізації треба видати дорожні листи, по яких працювали трактори (нехай у тракторів це слово є в назві). Для Jet SQL:

SELECT Dpd, Npd FROM vPd

WHERE MachId IN (SELECT Id FROM ClMach WHERE Name LIKE “Трактор*”)

Умови рівня кортежу

Нагадаємо, що кортеж у SQL – це список скалярних значень у круглих дужках, як-от

(123, ‘foo’) – компонентами кортежу є константи,

(name, address, netWorth) - компонентами кортежу є атрибути,

(name, address, 10000000) – мішаний кортеж у якому і константи, і атрибути.

Якщо кортеж t має компоненти, що відповідають атрибутам відношення R, розташованими в однаковому порядку, припустимо співставляти t та R за допомогою операторів EXISTS, IN, ALL, ANY, розглянутих вище. Наприклад:

t IN R

у R існує хоча б один кортеж, що співпадає з t

t<>ANY R

у R існує хоча б один кортеж, відмінний від t

Приклад 5.8. Пошук імен продюсерів кінофільмів, у яких знімався конкретний актор. Реляційна схема БД наступна:

а ось запит, який містить 2 вкладені підзапити:

Рис.5.15. Запит з укладеними підзапитами для визначення продюсерів, які співпрацювали з актором

Запит, який містить ієрархію вкладених запитів, слід аналізувати „зсередині назовні”.

  • Рядки 7-9. Підзапит відбирає з відношення StarsIn ті кортежі, які містять значення ‘Harrison Ford’, повертає значення компонентів movieTitle та movieYear.

  • Рядки 4-6. Результат – відношення з одним атрибутом, що містить набір сертифікаційних номерів продюсерів фільмів за участі Гарісона Форда.

Рис.5.16. Екземпляр відношення, що повертає “середній” підзапит прикладу 5.2.

  • „Основний” запит, рядки 1-3. З відношення MovieExec відбираються кортежі, значення компоненту cert# яких містяться в „середньому” запиті. В результуюче відношення відбирається компонента name.

Запит з підзапитами з цього прикладу припускає представлення у вигляді „плаского” запиту „selet-from-where”, у реченні FROM якого перелічені всі відношення, згадані в запиті прикладу 5.2 і його підзапитах. Зв’язки IN заміняються умовами рівності, які розміщуються в реченні WHERE.

Рис.5.17. Запит без підзапитів для рішення задачі прикладу 5.2.

Але у останнього рішення є особливість: якщо продюсер кілька разів співпрацював з актором, у відношенні-результаті буде кілька кортежів для цього продюсера.

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