- •Тема 5. Запити на мові sql
- •Діалекти sql
- •Типи даних в sql
- •Прості запити на мові sql
- •Проекція в sql
- •Порівняння рядків
- •Значення дати і часу в sql
- •Значення null і операції з ним
- •Значення unknown і операції з ним
- •Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
- •Розрізнення одноіменних атрибутів кількох відношень
- •Змінні кортежів та псевдоніми відношень
- •Об’єднання запитів
- •Мова sql. Підзапити та вирази з’єднання Підзапити
- •Підзапити для обчислення скалярних значень
- •Умови рівня відношення
- •Умови рівня кортежу
- •Корельовані підзапити
- •Підзапити в реченнях from
- •Вирази з’єднання в sql
- •Перехресне з’єднання
- •Тета-з’єднання
- •Натуральне з’єднання
- •Зовнішнє тета-з’єднання
- •З’єднання у діалектах Jet sql та Transact sql
- •Приклад правого зовнішнього з’єднання для Oracle:
Мова sql. Підзапити та вирази з’єднання Підзапити
Мова SQL дозволяє використовувати один запит як допоміжний для обчислень результатів іншого. Запит, який є частиною більш „крупного” запиту, називають підзапитом (subquery). Взаємна вкладеність запитів не обмежується. Крім UNION, існують наступні способи використання підзапитів:
Підзапит повертає скалярне значення, яке порівнюється з з іншим значенням у реченні WHERE.
Підзапит повертає відношення, яке використовується в реченні WHERE саме як відношення.
Підзапит оперує відношеннями в реченні 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.
Але у останнього рішення є особливість: якщо продюсер кілька разів співпрацював з актором, у відношенні-результаті буде кілька кортежів для цього продюсера.
