SlideShare a Scribd company logo
1 of 30
Мова вибірки даних
Запити з вкладеними підзапитами
1. Види вкладених підзапитів
Вкладений запит - це запит, що заключений у круглі дужки і
вкладений в пропозицію WITH, SELECT, FROM, WHERE або HAVING
основного (зовнішнього) запиту SELECT або інших запитів, що
використовують ці пропозиції. Вкладений запит також називають
підзапитом.
Вкладений запит у своїх пропозиціях може містити інший вкладений
запит тощо.
Умовно підзапити підрозділяють на три типи, кожен з яких є
звуженням попереднього:
• <табличний_підзапит> :: = запит SELECT, який повертає набір рядків і
стовпців;
• <підзапит_стовпця> :: = запит SELECT, який повертає значення тільки
одного стовпця, але, можливо, в декількох рядках;
• <скалярний_підзапит> :: = запит SELECT, який повертає значення
одного стовпця в одному рядку.
Види вкладених підзапитів
Використання підзапитів в пропозиції WITH має наступний вигляд:
При використанні вкладених запитів в пропозиції SELECT синтаксис
елементів, які повертаються має наступний вигляд:
Види вкладених підзапитів
При використанні вкладених запитів в пропозиції FROM його синтаксис
має наступний вигляд:
При використанні вкладених запитів в пропозиціях WHERE і HAVING
змінюється синтаксис деяких умов пошуку. Просте порівняння при
використанні вкладеного запиту реалізується наступною конструкцією:
Види вкладених підзапитів
Перевірка на членство в множині реалізується наступною
конструкцією:
При використанні вкладених запитів є можливість здійснювати перевірку на
існування за допомогою предиката EXISTS і перевірку на повернення
підзапитом єдиного значення за допомогою предиката SINGULAR. Умова
пошуку з перевіркою існування представляється в наступному вигляді:
Умова пошуку з перевіркою на єдиність значення, яке повертається
представляється в наступному вигляді:
Види вкладених підзапитів
Простим (некорельованим) вкладеним запитом називається такий, результат якого не
залежить від зовнішнього запиту. Дані з таблиць, зазначених у пропозиціях FROM зовнішнього
запиту і підзапиту, витягуються незалежно одні від одних. Прості вкладені запити обробляються
системою "знизу-вгору". Першим обробляється вкладений запит самого нижнього рівня.
Множина значень, що були отримані в результаті його виконання, використовується при
реалізації запиту більш високого рівня і т.д.
Пов'язаним (корельованим) вкладеним запитом називається такий, результат якого
залежить від результату зовнішнього запиту. Підзапит є пов'язаним, коли в ньому (в пропозиціях
WHERE, HAVING) зазначений стовпець таблиці зовнішнього запиту. Таке звернення до стовпців
зовнішнього запиту називається зовнішнім посиланням. Якщо бути точніше, зовнішнє посилання -
це ім'я стовпця однієї з таблиць, зазначених в пропозиції FROM зовнішнього запиту, але який не
входить ні в одну з таблиць пропозиції FROM підзапиту. У пов'язаних підзапитах слід вказувати
повні імена стовпців, причому якщо в зовнішньому і вкладеному запитах використовується одна і
та ж таблиця, то для стовпців повинні бути задані псевдоніми.
Запити з пов'язаними вкладеними запитами обробляються в зворотному порядку ("зверху-
вниз"), тобто спочатку вибирається перший рядок робочої таблиці, яка була сформована
основним запитом. Потім з неї вибираються значення тих стовпців, які використовуються в
підзапиті (підзапитах). Якщо ці значення задовольняють умовам вкладеного запиту, то обраний
рядок включається в результат. Після цього в зовнішньому запиті вибирається другий рядок і т.д.,
поки в результат не будуть включені всі рядки, що задовольняють підзапиту (послідовності
підзапитів).
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції WITH
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції WITH
Особливості використання нерекурсивних підзапитів в пропозиції WITH:
•Похідні таблиці, визначені в WITH, можуть посилатися одна на одну;
•Посилання на похідну таблицю (імя_производной_таблицы) може
використовуватися в будь-якій частині основного запиту (в пропозиціях
SELECT, FROM і т.д.);
•Одна і та ж похідна таблиця може використовуватися кілька разів на
основному запиті під різними псевдонімами;
•У багаторядкових запитах на оновлення (INSERT, UPDATE і DELETE)
підзапити можуть включати пропозицію WITH, визначену в похідних
таблицях;
•Похідні таблиці можуть використовуватися процедурною мовою.
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції WITH
Рекурсивні похідні таблиці в пропозиції WITH дозволяють створювати
рекурсивні запити.
Нехай в таблиці Abonent є наступні дані:
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції WITH
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції WITH
Особливості використання рекурсивних підзапитів в пропозиції WITH:
•Рекурсивна похідна таблиця має посилання на саму себе;
•Рекурсивна похідна таблиця - це об'єднання в одному запиті (UNION) рекурсивних
і нерекурсивних частин;
•Має бути присутня, принаймні, одна нерекурсівние частина;
•Нерекурсивні частини розташовуються на початку запиту, що містить об'єднання;
•Рекурсивні частини відокремлюються від нерекурсивних і від самих себе з
допомогою конструкції UNION ALL;
•Використання пропозицій DISTINCT, GROUP BY, HAVING, а також використання
агрегатних функцій не допускається у рекурсивних частинах запиту;
•Рекурсивна частина може мати тільки одне посилання на саму себе і тільки в
пропозиції FROM;
•Рекурсивне посилання не може брати участь у зовнішньому з'єднанні таблиць.
Запити з рекурсивними похідними таблицями виконуються наступним чином:
обирається перший рядок з нерекурсивної частини запиту; для цього рядка
виконується кожна рекурсивна частина з урахуванням поточних значень рядка як
параметрів; якщо поточна рекурсивна частина не повертає рядків, відбувається
повернення на крок назад і отримання наступного рядка з результуючого набору
нерекурсивної частини запиту.
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції SELECT
При використанні простого підзапиту результат, який ним повертається
вставляється у всі рядки, що формуються зовнішнім запитом. В пропозиції SELECT
може використовуватися тільки <скалярний_підзапит>, тобто підзапит, який повертає
тільки одне значення.
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції FROM
В пропозиції FROM можуть бути визначені не базові таблиці, а похідні
таблиці, що повертаються вкладеним запитом (<табличный_подзапрос>).
Похідні таблиці можуть бути вкладеними одна в одну і можуть бути включені
в з'єднання (неявне або явне) як звичайні таблиці або подання.
Слід врахувати, що:
•Для визначення похідних таблиць можна використовувати тільки прості
підзапити;
•Кожен стовпець у похідній таблиці повинен мати ім'я. Якщо в якості
елемента, що повертається в похідній таблиці використовується константа, то
для такого стовпця повинен бути введений псевдонім або повинні
вказуватися імена стовпців за допомогою наступної конструкції:
[AS] псевдоним (<список_столбцов>);
•Якщо використовується конструкція [AS] псевдоним (<список_столбцов>),
то кількість стовпців в дужках має бути такою ж, як і кількість стовпців в
пропозиції SELECT підзапиту.
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції FROM
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиції FROM
Похідна таблиця
Ar
Похідна таблиця
Ar
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиціях WHERE і HAVING
Залежно від того, в якій умові пошуку використовується підзапит, він може
являти собою <скалярный_подзапрос>, <подзапрос_столбца> або
<табличный_подзапрос>.
При простому порівнянні використовується <скалярный_подзапрос> або
<подзапрос_столбца>, якщо перед ним вказаний предикат ANY або ALL. Також
<подзапрос_столбца> використовується при перевірці на членство в множині.
У умови пошуку з предикатом EXISTS або з предикатом SINGULAR
використовується <табличный_подзапрос>.
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиціях WHERE і HAVING
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиціях WHERE і HAVING
2. Запити з простими (некорельованими) підзапитами.
Підзапити в пропозиціях WHERE і HAVING
3. Запити зі зв‘язаними (корельованими) підзапитами
Вкладений запит може посилатися на таблицю, зазначену в зовнішньому (основному) запиті
(незалежно від його рівня вкладеності). Такий вкладений запит називається співвіднесеним або
пов'язаним через те, що його результат залежить від значень, визначених в основному запиті.
При цьому вкладений запит виконується неодноразово, по одному разу для кожного рядка
таблиці основного (зовнішнього) запиту, а не один раз, як у випадку простого вкладеного запиту.
Рядок зовнішнього запиту, для якого внутрішній запит щоразу буде виконаний, називається
поточним рядком-кандидатом.
Процедура оцінки, що виконується при використанні пов'язаного вкладеного запиту,
складається з наступних кроків:
1. Вибрати рядок з таблиці, що вказана у зовнішньому запиті. Це буде поточний рядок-
кандидат.
2. Зберегти значення з цього рядка-кандидата в псевдонімі, який заданий у пропозиції
FROM зовнішнього запиту.
3. Виконати вкладений запит. Скрізь, де псевдонім, заданий для зовнішнього запиту,
знайдений, використовувати значення для поточного рядка-кандидата. Використання
значення з рядка-кандидата зовнішнього запиту у вкладеному запиті називається зовнішнім
посиланням.
4. Якщо зв'язаний підзапит використовується в пропозиції WHERE або HAVING, то
оцінити умову пошуку зовнішнього запиту на основі результатів вкладеного запиту, що
виконується на кроці 3. Він визначає чи вибирається рядок-кандидат для виводу. Якщо
зв'язаний поідзапит використовується в пропозиції SELECT, то виводяться поля, зазначені
в списку елементів основного запиту, які повертаються і результат виконання вкладеного
запиту.
5. Повторити процедуру для наступного рядка-кандидата основної (зовнішньої) таблиці і
так далі, поки всі рядки таблиці не будуть перевірені.
3. Зв‘язані підзапити в пропозиції SELECT
Відповідно до алгоритму даний запит працює наступним
чином.
1. Зовнішній запит вибирає з таблиці Abonent рядок з
даними про абонентів, які проживають на вулиці з кодом,
рівним 3 (перший рядок).
2. Зберігає цей рядок як поточний рядок-кандидат під
псевдонімом A.
3. Виконує вкладений запит, переглядає всю таблицю
Street,
щоб знайти рядок, де значення поля S.StreetCD таке ж, як
значення A.StreetCD (3). Зі знайденої рядка таблиці Street
витягується поле StreetNM.
4. Для виведення вибираються значення поля A.Fio з
основного запиту (АКСЕНОВ С.А.) і знайдене значення
поля S.StreetNM з вкладеного запиту (Войко ПРОВУЛОК).
5. Повторюються пп.1-4, поки кожен рядок таблиці
Abonent НЕ БУДЕ перевірений.
або
3. Зв‘язані підзапити в пропозиції SELECT
Даний запит працює таким чином:
1. Зовнішній запит з таблиці Abonent вибирає рядок
з даними про Абонентів, що мають номер
особового рахунку '005488 '(перший рядок).
2. Зберігає цей рядок як поточний рядок-кандидат
під псевдонімом A.
3. Виконує вкладений запит, переглядає всю
таблицю Request, щоб знайти всі рядки, де
значення поля R.AccountCD таке ж, як значення
A.AccountCD (005488). За допомогою агрегатної
функції COUNT (3) підраховується загальна
кількість таких рядків.
4. Для виведення вибираються значення полів
A.AccountCD і A.Fio з основного запиту ('005488 ','
АКСЕНОВ С.А. ') і знайдене вкладеним запитом
кількість пов'язаних рядків у таблиці Request (3).
5. Повторюються пп.1-4, поки кожен рядок таблиці
Abonent НЕ БУДЕ оглянутий.
3. Зв‘язані підзапити в пропозиціях WHERE і HAVING
При використанні зв'язаного вкладеного запиту в умовах пошуку пропозицій WHERE і
HAVING він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або
<табличный_подзапрос>, як і для простих вкладених запитів.
Однак оскільки запит пов'язаний, внутрішній запит виконується окремо для кожного
рядка зовнішнього запиту (поточного рядка-кандидату).
Out і Inn - це псевдоніми таблиць Abonent і Request відповідно (можуть задаватися довільно). Так як значення в
полі AccountCD зовнішнього запиту змінюється (при переборі рядків), внутрішній запит повинен виконуватися
окремо для кожного рядка зовнішнього запиту. У цьому прикладі SQL здійснює наступну процедуру:
1) обирає рядок c даними про абонента, що має номер особового рахунку '005488 ‘(перший рядок) з таблиці
Abonent;
2) зберігає цей рядок як поточний рядок-кандидат під псевдонімом Out;
3) виконує вкладений запит, переглядає всю таблицю Request, щоб знайти рядки, де значення поля
Inn.AccountCD - таке ж, як значення Out.AccountCD (005488). Потім з кожного такого рядка таблиці Request
витягується поле IncomingDate. В результаті вкладений запит, що представляє собою <подзапрос_столбца>,
формує набір значень поля IncomingDate для поточного рядка-кандидата;
4) після отримання набору всіх значень поля IncomingDate для поля AccountCD = '005488 'аналізується умова
пошуку основного запиту, щоб перевірити, чи є значення 17 грудня 2001 в наборі всіх значень поля
IncomingDate. Якщо це так (а це так), то вибирається рядок з номером особового рахунку '005488 'для
виведення його з основного запиту;
5) повторюються пп.1-4 (для рядка з номером особового рахунку '015527 'і т.д.), поки кожен рядок таблиці
Abonent НЕ буде перевірений.
3. Зв‘язані підзапити в пропозиціях WHERE і HAVING
При використанні зв'язаного вкладеного запиту в умовах пошуку пропозицій WHERE і
HAVING він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або
<табличный_подзапрос>, як і для простих вкладених запитів.
Однак оскільки запит пов'язаний, внутрішній запит виконується окремо для кожного
рядка зовнішнього запиту (поточного рядка-кандидату).
Out і Inn - це псевдоніми таблиць Abonent і Request відповідно (можуть задаватися довільно). Так як значення в
полі AccountCD зовнішнього запиту змінюється (при переборі рядків), внутрішній запит повинен виконуватися
окремо для кожного рядка зовнішнього запиту. У цьому прикладі SQL здійснює наступну процедуру:
1) обирає рядок c даними про абонента, що має номер особового рахунку '005488 ‘(перший рядок) з таблиці
Abonent;
2) зберігає цей рядок як поточний рядок-кандидат під псевдонімом Out;
3) виконує вкладений запит, переглядає всю таблицю Request, щоб знайти рядки, де значення поля
Inn.AccountCD - таке ж, як значення Out.AccountCD (005488). Потім з кожного такого рядка таблиці Request
витягується поле IncomingDate. В результаті вкладений запит, що представляє собою <подзапрос_столбца>,
формує набір значень поля IncomingDate для поточного рядка-кандидата;
4) після отримання набору всіх значень поля IncomingDate для поля AccountCD = '005488 'аналізується умова
пошуку основного запиту, щоб перевірити, чи є значення 17 грудня 2001 в наборі всіх значень поля
IncomingDate. Якщо це так (а це так), то вибирається рядок з номером особового рахунку '005488 'для
виведення його з основного запиту;
5) повторюються пп.1-4 (для рядка з номером особового рахунку '015527 'і т.д.), поки кожен рядок таблиці
Abonent НЕ буде перевірений.
3. Зв‘язані підзапити в пропозиціях WHERE і HAVING
3. Зв‘язані підзапити з предикатами ANY та ALL
або
або
3. Зв‘язані підзапити з предикатами ANY та ALL
3. Зв‘язані підзапити з предиком SINGULAR
3. Зв‘язані підзапити з предиком EXISTS
Результат умови вважається істинним тільки тоді, коли результат виконання
<табличный_подзапрос> є непустою множиною, тобто коли існує будь-який запис у
таблиці, що зазначена в пропозиції FROM запиту, яка задовольняє умові пошуку
пропозиції WHERE вкладеного запиту.
Іншими словами, EXISTS - це предикат, який повертає значення, рівне TRUE або
FALSE, залежно від наявності виведення з вкладеного запиту. Він може працювати
автономно в умові пошуку або в комбінації з іншими логічними виразами, які
використовують логічні операції AND, OR і NOT.
Він бере вкладений запит як аргумент і оцінює його:
•Як істинний, якщо той виконує довільне виведення;
•Як хибний, якщо той не робить цього.
3. Зв‘язані підзапити з предиком EXISTS

More Related Content

Viewers also liked (10)

Sql dml
Sql dmlSql dml
Sql dml
 
інформаційні системи
інформаційні системиінформаційні системи
інформаційні системи
 
Sql view
Sql viewSql view
Sql view
 
Основи Баз даних та MS SQL Server
Основи Баз даних та MS SQL ServerОснови Баз даних та MS SQL Server
Основи Баз даних та MS SQL Server
 
Sql select 1
Sql select 1Sql select 1
Sql select 1
 
інформаційні системи
інформаційні системиінформаційні системи
інформаційні системи
 
Sql ddl
Sql ddlSql ddl
Sql ddl
 
Sql global
Sql globalSql global
Sql global
 
Sql db
Sql dbSql db
Sql db
 
Vitrina
VitrinaVitrina
Vitrina
 

More from Halyna Melnyk (11)

Lect ai 3 ga
Lect ai 3  gaLect ai 3  ga
Lect ai 3 ga
 
Lect аі 2 n net p2
Lect аі 2 n net p2Lect аі 2 n net p2
Lect аі 2 n net p2
 
Lect ai 2 nn
Lect ai 2 nnLect ai 2 nn
Lect ai 2 nn
 
Lect 6 prolog
Lect 6 prologLect 6 prolog
Lect 6 prolog
 
Lect 5 prolog
Lect 5 prologLect 5 prolog
Lect 5 prolog
 
Lect 3 4 prolog
Lect 3 4 prologLect 3 4 prolog
Lect 3 4 prolog
 
Lect 2 prolog
Lect 2 prologLect 2 prolog
Lect 2 prolog
 
Lect 1 intro
Lect 1 introLect 1 intro
Lect 1 intro
 
Sql pl
Sql plSql pl
Sql pl
 
Sql granting
Sql grantingSql granting
Sql granting
 
Sql select 2
Sql select 2Sql select 2
Sql select 2
 

Recently uploaded

Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»tetiana1958
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxvitalina6709
 
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdf
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdfupd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdf
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdfssuser54595a
 
О.Духнович - пророк народної правди. Біографія
О.Духнович - пророк народної правди. БіографіяО.Духнович - пророк народної правди. Біографія
О.Духнович - пророк народної правди. БіографіяAdriana Himinets
 

Recently uploaded (6)

Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
 
Її величність - українська книга презентація-огляд 2024.pptx
Її величність - українська книга презентація-огляд 2024.pptxЇї величність - українська книга презентація-огляд 2024.pptx
Її величність - українська книга презентація-огляд 2024.pptx
 
Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptx
 
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdf
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdfupd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdf
upd.18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL.pdf
 
О.Духнович - пророк народної правди. Біографія
О.Духнович - пророк народної правди. БіографіяО.Духнович - пророк народної правди. Біографія
О.Духнович - пророк народної правди. Біографія
 

Sql select 3

  • 1. Мова вибірки даних Запити з вкладеними підзапитами
  • 2. 1. Види вкладених підзапитів Вкладений запит - це запит, що заключений у круглі дужки і вкладений в пропозицію WITH, SELECT, FROM, WHERE або HAVING основного (зовнішнього) запиту SELECT або інших запитів, що використовують ці пропозиції. Вкладений запит також називають підзапитом. Вкладений запит у своїх пропозиціях може містити інший вкладений запит тощо. Умовно підзапити підрозділяють на три типи, кожен з яких є звуженням попереднього: • <табличний_підзапит> :: = запит SELECT, який повертає набір рядків і стовпців; • <підзапит_стовпця> :: = запит SELECT, який повертає значення тільки одного стовпця, але, можливо, в декількох рядках; • <скалярний_підзапит> :: = запит SELECT, який повертає значення одного стовпця в одному рядку.
  • 3. Види вкладених підзапитів Використання підзапитів в пропозиції WITH має наступний вигляд: При використанні вкладених запитів в пропозиції SELECT синтаксис елементів, які повертаються має наступний вигляд:
  • 4. Види вкладених підзапитів При використанні вкладених запитів в пропозиції FROM його синтаксис має наступний вигляд: При використанні вкладених запитів в пропозиціях WHERE і HAVING змінюється синтаксис деяких умов пошуку. Просте порівняння при використанні вкладеного запиту реалізується наступною конструкцією:
  • 5. Види вкладених підзапитів Перевірка на членство в множині реалізується наступною конструкцією: При використанні вкладених запитів є можливість здійснювати перевірку на існування за допомогою предиката EXISTS і перевірку на повернення підзапитом єдиного значення за допомогою предиката SINGULAR. Умова пошуку з перевіркою існування представляється в наступному вигляді: Умова пошуку з перевіркою на єдиність значення, яке повертається представляється в наступному вигляді:
  • 6. Види вкладених підзапитів Простим (некорельованим) вкладеним запитом називається такий, результат якого не залежить від зовнішнього запиту. Дані з таблиць, зазначених у пропозиціях FROM зовнішнього запиту і підзапиту, витягуються незалежно одні від одних. Прості вкладені запити обробляються системою "знизу-вгору". Першим обробляється вкладений запит самого нижнього рівня. Множина значень, що були отримані в результаті його виконання, використовується при реалізації запиту більш високого рівня і т.д. Пов'язаним (корельованим) вкладеним запитом називається такий, результат якого залежить від результату зовнішнього запиту. Підзапит є пов'язаним, коли в ньому (в пропозиціях WHERE, HAVING) зазначений стовпець таблиці зовнішнього запиту. Таке звернення до стовпців зовнішнього запиту називається зовнішнім посиланням. Якщо бути точніше, зовнішнє посилання - це ім'я стовпця однієї з таблиць, зазначених в пропозиції FROM зовнішнього запиту, але який не входить ні в одну з таблиць пропозиції FROM підзапиту. У пов'язаних підзапитах слід вказувати повні імена стовпців, причому якщо в зовнішньому і вкладеному запитах використовується одна і та ж таблиця, то для стовпців повинні бути задані псевдоніми. Запити з пов'язаними вкладеними запитами обробляються в зворотному порядку ("зверху- вниз"), тобто спочатку вибирається перший рядок робочої таблиці, яка була сформована основним запитом. Потім з неї вибираються значення тих стовпців, які використовуються в підзапиті (підзапитах). Якщо ці значення задовольняють умовам вкладеного запиту, то обраний рядок включається в результат. Після цього в зовнішньому запиті вибирається другий рядок і т.д., поки в результат не будуть включені всі рядки, що задовольняють підзапиту (послідовності підзапитів).
  • 7. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH
  • 8. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH Особливості використання нерекурсивних підзапитів в пропозиції WITH: •Похідні таблиці, визначені в WITH, можуть посилатися одна на одну; •Посилання на похідну таблицю (імя_производной_таблицы) може використовуватися в будь-якій частині основного запиту (в пропозиціях SELECT, FROM і т.д.); •Одна і та ж похідна таблиця може використовуватися кілька разів на основному запиті під різними псевдонімами; •У багаторядкових запитах на оновлення (INSERT, UPDATE і DELETE) підзапити можуть включати пропозицію WITH, визначену в похідних таблицях; •Похідні таблиці можуть використовуватися процедурною мовою.
  • 9. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH Рекурсивні похідні таблиці в пропозиції WITH дозволяють створювати рекурсивні запити. Нехай в таблиці Abonent є наступні дані:
  • 10. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH
  • 11. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH Особливості використання рекурсивних підзапитів в пропозиції WITH: •Рекурсивна похідна таблиця має посилання на саму себе; •Рекурсивна похідна таблиця - це об'єднання в одному запиті (UNION) рекурсивних і нерекурсивних частин; •Має бути присутня, принаймні, одна нерекурсівние частина; •Нерекурсивні частини розташовуються на початку запиту, що містить об'єднання; •Рекурсивні частини відокремлюються від нерекурсивних і від самих себе з допомогою конструкції UNION ALL; •Використання пропозицій DISTINCT, GROUP BY, HAVING, а також використання агрегатних функцій не допускається у рекурсивних частинах запиту; •Рекурсивна частина може мати тільки одне посилання на саму себе і тільки в пропозиції FROM; •Рекурсивне посилання не може брати участь у зовнішньому з'єднанні таблиць. Запити з рекурсивними похідними таблицями виконуються наступним чином: обирається перший рядок з нерекурсивної частини запиту; для цього рядка виконується кожна рекурсивна частина з урахуванням поточних значень рядка як параметрів; якщо поточна рекурсивна частина не повертає рядків, відбувається повернення на крок назад і отримання наступного рядка з результуючого набору нерекурсивної частини запиту.
  • 12. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції SELECT При використанні простого підзапиту результат, який ним повертається вставляється у всі рядки, що формуються зовнішнім запитом. В пропозиції SELECT може використовуватися тільки <скалярний_підзапит>, тобто підзапит, який повертає тільки одне значення.
  • 13. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM В пропозиції FROM можуть бути визначені не базові таблиці, а похідні таблиці, що повертаються вкладеним запитом (<табличный_подзапрос>). Похідні таблиці можуть бути вкладеними одна в одну і можуть бути включені в з'єднання (неявне або явне) як звичайні таблиці або подання. Слід врахувати, що: •Для визначення похідних таблиць можна використовувати тільки прості підзапити; •Кожен стовпець у похідній таблиці повинен мати ім'я. Якщо в якості елемента, що повертається в похідній таблиці використовується константа, то для такого стовпця повинен бути введений псевдонім або повинні вказуватися імена стовпців за допомогою наступної конструкції: [AS] псевдоним (<список_столбцов>); •Якщо використовується конструкція [AS] псевдоним (<список_столбцов>), то кількість стовпців в дужках має бути такою ж, як і кількість стовпців в пропозиції SELECT підзапиту.
  • 14. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM
  • 15. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM Похідна таблиця Ar Похідна таблиця Ar
  • 16. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING Залежно від того, в якій умові пошуку використовується підзапит, він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або <табличный_подзапрос>. При простому порівнянні використовується <скалярный_подзапрос> або <подзапрос_столбца>, якщо перед ним вказаний предикат ANY або ALL. Також <подзапрос_столбца> використовується при перевірці на членство в множині. У умови пошуку з предикатом EXISTS або з предикатом SINGULAR використовується <табличный_подзапрос>.
  • 17. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING
  • 18. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING
  • 19. 2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING
  • 20. 3. Запити зі зв‘язаними (корельованими) підзапитами Вкладений запит може посилатися на таблицю, зазначену в зовнішньому (основному) запиті (незалежно від його рівня вкладеності). Такий вкладений запит називається співвіднесеним або пов'язаним через те, що його результат залежить від значень, визначених в основному запиті. При цьому вкладений запит виконується неодноразово, по одному разу для кожного рядка таблиці основного (зовнішнього) запиту, а не один раз, як у випадку простого вкладеного запиту. Рядок зовнішнього запиту, для якого внутрішній запит щоразу буде виконаний, називається поточним рядком-кандидатом. Процедура оцінки, що виконується при використанні пов'язаного вкладеного запиту, складається з наступних кроків: 1. Вибрати рядок з таблиці, що вказана у зовнішньому запиті. Це буде поточний рядок- кандидат. 2. Зберегти значення з цього рядка-кандидата в псевдонімі, який заданий у пропозиції FROM зовнішнього запиту. 3. Виконати вкладений запит. Скрізь, де псевдонім, заданий для зовнішнього запиту, знайдений, використовувати значення для поточного рядка-кандидата. Використання значення з рядка-кандидата зовнішнього запиту у вкладеному запиті називається зовнішнім посиланням. 4. Якщо зв'язаний підзапит використовується в пропозиції WHERE або HAVING, то оцінити умову пошуку зовнішнього запиту на основі результатів вкладеного запиту, що виконується на кроці 3. Він визначає чи вибирається рядок-кандидат для виводу. Якщо зв'язаний поідзапит використовується в пропозиції SELECT, то виводяться поля, зазначені в списку елементів основного запиту, які повертаються і результат виконання вкладеного запиту. 5. Повторити процедуру для наступного рядка-кандидата основної (зовнішньої) таблиці і так далі, поки всі рядки таблиці не будуть перевірені.
  • 21. 3. Зв‘язані підзапити в пропозиції SELECT Відповідно до алгоритму даний запит працює наступним чином. 1. Зовнішній запит вибирає з таблиці Abonent рядок з даними про абонентів, які проживають на вулиці з кодом, рівним 3 (перший рядок). 2. Зберігає цей рядок як поточний рядок-кандидат під псевдонімом A. 3. Виконує вкладений запит, переглядає всю таблицю Street, щоб знайти рядок, де значення поля S.StreetCD таке ж, як значення A.StreetCD (3). Зі знайденої рядка таблиці Street витягується поле StreetNM. 4. Для виведення вибираються значення поля A.Fio з основного запиту (АКСЕНОВ С.А.) і знайдене значення поля S.StreetNM з вкладеного запиту (Войко ПРОВУЛОК). 5. Повторюються пп.1-4, поки кожен рядок таблиці Abonent НЕ БУДЕ перевірений. або
  • 22. 3. Зв‘язані підзапити в пропозиції SELECT Даний запит працює таким чином: 1. Зовнішній запит з таблиці Abonent вибирає рядок з даними про Абонентів, що мають номер особового рахунку '005488 '(перший рядок). 2. Зберігає цей рядок як поточний рядок-кандидат під псевдонімом A. 3. Виконує вкладений запит, переглядає всю таблицю Request, щоб знайти всі рядки, де значення поля R.AccountCD таке ж, як значення A.AccountCD (005488). За допомогою агрегатної функції COUNT (3) підраховується загальна кількість таких рядків. 4. Для виведення вибираються значення полів A.AccountCD і A.Fio з основного запиту ('005488 ',' АКСЕНОВ С.А. ') і знайдене вкладеним запитом кількість пов'язаних рядків у таблиці Request (3). 5. Повторюються пп.1-4, поки кожен рядок таблиці Abonent НЕ БУДЕ оглянутий.
  • 23. 3. Зв‘язані підзапити в пропозиціях WHERE і HAVING При використанні зв'язаного вкладеного запиту в умовах пошуку пропозицій WHERE і HAVING він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або <табличный_подзапрос>, як і для простих вкладених запитів. Однак оскільки запит пов'язаний, внутрішній запит виконується окремо для кожного рядка зовнішнього запиту (поточного рядка-кандидату). Out і Inn - це псевдоніми таблиць Abonent і Request відповідно (можуть задаватися довільно). Так як значення в полі AccountCD зовнішнього запиту змінюється (при переборі рядків), внутрішній запит повинен виконуватися окремо для кожного рядка зовнішнього запиту. У цьому прикладі SQL здійснює наступну процедуру: 1) обирає рядок c даними про абонента, що має номер особового рахунку '005488 ‘(перший рядок) з таблиці Abonent; 2) зберігає цей рядок як поточний рядок-кандидат під псевдонімом Out; 3) виконує вкладений запит, переглядає всю таблицю Request, щоб знайти рядки, де значення поля Inn.AccountCD - таке ж, як значення Out.AccountCD (005488). Потім з кожного такого рядка таблиці Request витягується поле IncomingDate. В результаті вкладений запит, що представляє собою <подзапрос_столбца>, формує набір значень поля IncomingDate для поточного рядка-кандидата; 4) після отримання набору всіх значень поля IncomingDate для поля AccountCD = '005488 'аналізується умова пошуку основного запиту, щоб перевірити, чи є значення 17 грудня 2001 в наборі всіх значень поля IncomingDate. Якщо це так (а це так), то вибирається рядок з номером особового рахунку '005488 'для виведення його з основного запиту; 5) повторюються пп.1-4 (для рядка з номером особового рахунку '015527 'і т.д.), поки кожен рядок таблиці Abonent НЕ буде перевірений.
  • 24. 3. Зв‘язані підзапити в пропозиціях WHERE і HAVING При використанні зв'язаного вкладеного запиту в умовах пошуку пропозицій WHERE і HAVING він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або <табличный_подзапрос>, як і для простих вкладених запитів. Однак оскільки запит пов'язаний, внутрішній запит виконується окремо для кожного рядка зовнішнього запиту (поточного рядка-кандидату). Out і Inn - це псевдоніми таблиць Abonent і Request відповідно (можуть задаватися довільно). Так як значення в полі AccountCD зовнішнього запиту змінюється (при переборі рядків), внутрішній запит повинен виконуватися окремо для кожного рядка зовнішнього запиту. У цьому прикладі SQL здійснює наступну процедуру: 1) обирає рядок c даними про абонента, що має номер особового рахунку '005488 ‘(перший рядок) з таблиці Abonent; 2) зберігає цей рядок як поточний рядок-кандидат під псевдонімом Out; 3) виконує вкладений запит, переглядає всю таблицю Request, щоб знайти рядки, де значення поля Inn.AccountCD - таке ж, як значення Out.AccountCD (005488). Потім з кожного такого рядка таблиці Request витягується поле IncomingDate. В результаті вкладений запит, що представляє собою <подзапрос_столбца>, формує набір значень поля IncomingDate для поточного рядка-кандидата; 4) після отримання набору всіх значень поля IncomingDate для поля AccountCD = '005488 'аналізується умова пошуку основного запиту, щоб перевірити, чи є значення 17 грудня 2001 в наборі всіх значень поля IncomingDate. Якщо це так (а це так), то вибирається рядок з номером особового рахунку '005488 'для виведення його з основного запиту; 5) повторюються пп.1-4 (для рядка з номером особового рахунку '015527 'і т.д.), поки кожен рядок таблиці Abonent НЕ буде перевірений.
  • 25. 3. Зв‘язані підзапити в пропозиціях WHERE і HAVING
  • 26. 3. Зв‘язані підзапити з предикатами ANY та ALL або або
  • 27. 3. Зв‘язані підзапити з предикатами ANY та ALL
  • 28. 3. Зв‘язані підзапити з предиком SINGULAR
  • 29. 3. Зв‘язані підзапити з предиком EXISTS Результат умови вважається істинним тільки тоді, коли результат виконання <табличный_подзапрос> є непустою множиною, тобто коли існує будь-який запис у таблиці, що зазначена в пропозиції FROM запиту, яка задовольняє умові пошуку пропозиції WHERE вкладеного запиту. Іншими словами, EXISTS - це предикат, який повертає значення, рівне TRUE або FALSE, залежно від наявності виведення з вкладеного запиту. Він може працювати автономно в умові пошуку або в комбінації з іншими логічними виразами, які використовують логічні операції AND, OR і NOT. Він бере вкладений запит як аргумент і оцінює його: •Як істинний, якщо той виконує довільне виведення; •Як хибний, якщо той не робить цього.
  • 30. 3. Зв‘язані підзапити з предиком EXISTS