sql select 3

30
Мова вибірки даних Запити з вкладеними підзапитами

Upload: halyna-melnyk

Post on 22-Jul-2015

84 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Sql select 3

Мова вибірки данихЗапити з вкладеними підзапитами

Page 2: Sql select 3

1. Види вкладених підзапитівВкладений запит - це запит, що заключений у круглі дужки і

вкладений в пропозицію WITH, SELECT, FROM, WHERE або HAVING основного (зовнішнього) запиту SELECT або інших запитів, що використовують ці пропозиції. Вкладений запит також називають підзапитом.

Вкладений запит у своїх пропозиціях може містити інший вкладений запит тощо.

Умовно підзапити підрозділяють на три типи, кожен з яких є звуженням попереднього:

• <табличний_підзапит> :: = запит SELECT, який повертає набір рядків і стовпців;

• <підзапит_стовпця> :: = запит SELECT, який повертає значення тільки одного стовпця, але, можливо, в декількох рядках;

• <скалярний_підзапит> :: = запит SELECT, який повертає значення одного стовпця в одному рядку.

Page 3: Sql select 3

Види вкладених підзапитівВикористання підзапитів в пропозиції WITH має наступний вигляд:

При використанні вкладених запитів в пропозиції SELECT синтаксис елементів, які повертаються має наступний вигляд:

Page 4: Sql select 3

Види вкладених підзапитівПри використанні вкладених запитів в пропозиції FROM його синтаксис має наступний вигляд:

При використанні вкладених запитів в пропозиціях WHERE і HAVING змінюється синтаксис деяких умов пошуку. Просте порівняння при використанні вкладеного запиту реалізується наступною конструкцією:

Page 5: Sql select 3

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

При використанні вкладених запитів є можливість здійснювати перевірку на існування за допомогою предиката EXISTS і перевірку на повернення підзапитом єдиного значення за допомогою предиката SINGULAR. Умова пошуку з перевіркою існування представляється в наступному вигляді:

Умова пошуку з перевіркою на єдиність значення, яке повертається представляється в наступному вигляді:

Page 6: Sql select 3

Види вкладених підзапитівПростим (некорельованим) вкладеним запитом називається такий, результат якого не

залежить від зовнішнього запиту. Дані з таблиць, зазначених у пропозиціях FROM зовнішнього запиту і підзапиту, витягуються незалежно одні від одних. Прості вкладені запити обробляються системою "знизу-вгору". Першим обробляється вкладений запит самого нижнього рівня. Множина значень, що були отримані в результаті його виконання, використовується при реалізації запиту більш високого рівня і т.д.

Пов'язаним (корельованим) вкладеним запитом називається такий, результат якого залежить від результату зовнішнього запиту. Підзапит є пов'язаним, коли в ньому (в пропозиціях WHERE, HAVING) зазначений стовпець таблиці зовнішнього запиту. Таке звернення до стовпців зовнішнього запиту називається зовнішнім посиланням. Якщо бути точніше, зовнішнє посилання - це ім'я стовпця однієї з таблиць, зазначених в пропозиції FROM зовнішнього запиту, але який не входить ні в одну з таблиць пропозиції FROM підзапиту. У пов'язаних підзапитах слід вказувати повні імена стовпців, причому якщо в зовнішньому і вкладеному запитах використовується одна і та ж таблиця, то для стовпців повинні бути задані псевдоніми.

Запити з пов'язаними вкладеними запитами обробляються в зворотному порядку ("зверху-вниз"), тобто спочатку вибирається перший рядок робочої таблиці, яка була сформована основним запитом. Потім з неї вибираються значення тих стовпців, які використовуються в підзапиті (підзапитах). Якщо ці значення задовольняють умовам вкладеного запиту, то обраний рядок включається в результат. Після цього в зовнішньому запиті вибирається другий рядок і т.д., поки в результат не будуть включені всі рядки, що задовольняють підзапиту (послідовності підзапитів).

Page 7: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH

Page 8: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH

Особливості використання нерекурсивних підзапитів в пропозиції WITH:•Похідні таблиці, визначені в WITH, можуть посилатися одна на одну;•Посилання на похідну таблицю (імя_производной_таблицы) може

використовуватися в будь-якій частині основного запиту (в пропозиціях SELECT, FROM і т.д.);

•Одна і та ж похідна таблиця може використовуватися кілька разів на основному запиті під різними псевдонімами;

•У багаторядкових запитах на оновлення (INSERT, UPDATE і DELETE) підзапити можуть включати пропозицію WITH, визначену в похідних таблицях;

•Похідні таблиці можуть використовуватися процедурною мовою.

Page 9: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH

Рекурсивні похідні таблиці в пропозиції WITH дозволяють створювати рекурсивні запити.

Нехай в таблиці Abonent є наступні дані:

Page 10: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH

Page 11: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції WITH

Особливості використання рекурсивних підзапитів в пропозиції WITH:•Рекурсивна похідна таблиця має посилання на саму себе;•Рекурсивна похідна таблиця - це об'єднання в одному запиті (UNION) рекурсивних

і нерекурсивних частин;•Має бути присутня, принаймні, одна нерекурсівние частина;•Нерекурсивні частини розташовуються на початку запиту, що містить об'єднання;•Рекурсивні частини відокремлюються від нерекурсивних і від самих себе з

допомогою конструкції UNION ALL;•Використання пропозицій DISTINCT, GROUP BY, HAVING, а також використання

агрегатних функцій не допускається у рекурсивних частинах запиту;•Рекурсивна частина може мати тільки одне посилання на саму себе і тільки в

пропозиції FROM;•Рекурсивне посилання не може брати участь у зовнішньому з'єднанні таблиць.

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

Page 12: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції SELECT

При використанні простого підзапиту результат, який ним повертається вставляється у всі рядки, що формуються зовнішнім запитом. В пропозиції SELECT може використовуватися тільки <скалярний_підзапит>, тобто підзапит, який повертає тільки одне значення.

Page 13: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM

В пропозиції FROM можуть бути визначені не базові таблиці, а похідні таблиці, що повертаються вкладеним запитом (<табличный_подзапрос>). Похідні таблиці можуть бути вкладеними одна в одну і можуть бути включені в з'єднання (неявне або явне) як звичайні таблиці або подання.

Слід врахувати, що:•Для визначення похідних таблиць можна використовувати тільки прості

підзапити;•Кожен стовпець у похідній таблиці повинен мати ім'я. Якщо в якості

елемента, що повертається в похідній таблиці використовується константа, то для такого стовпця повинен бути введений псевдонім або повинні вказуватися імена стовпців за допомогою наступної конструкції:

[AS] псевдоним (<список_столбцов>);•Якщо використовується конструкція [AS] псевдоним (<список_столбцов>),

то кількість стовпців в дужках має бути такою ж, як і кількість стовпців в пропозиції SELECT підзапиту.

Page 14: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM

Page 15: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиції FROM

Похідна таблиця Ar

Похідна таблиця Ar

Page 16: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING

Залежно від того, в якій умові пошуку використовується підзапит, він може являти собою <скалярный_подзапрос>, <подзапрос_столбца> або <табличный_подзапрос>.

При простому порівнянні використовується <скалярный_подзапрос> або <подзапрос_столбца>, якщо перед ним вказаний предикат ANY або ALL. Також <подзапрос_столбца> використовується при перевірці на членство в множині.

У умови пошуку з предикатом EXISTS або з предикатом SINGULAR використовується <табличный_подзапрос>.

Page 17: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING

Page 18: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING

Page 19: Sql select 3

2. Запити з простими (некорельованими) підзапитами. Підзапити в пропозиціях WHERE і HAVING

Page 20: Sql select 3

3. Запити зі зв‘язаними (корельованими) підзапитами Вкладений запит може посилатися на таблицю, зазначену в зовнішньому (основному) запиті

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

Процедура оцінки, що виконується при використанні пов'язаного вкладеного запиту, складається з наступних кроків:

1. Вибрати рядок з таблиці, що вказана у зовнішньому запиті. Це буде поточний рядок-кандидат.

2. Зберегти значення з цього рядка-кандидата в псевдонімі, який заданий у пропозиції FROM зовнішнього запиту.

3. Виконати вкладений запит. Скрізь, де псевдонім, заданий для зовнішнього запиту, знайдений, використовувати значення для поточного рядка-кандидата. Використання значення з рядка-кандидата зовнішнього запиту у вкладеному запиті називається зовнішнім посиланням.

4. Якщо зв'язаний підзапит використовується в пропозиції WHERE або HAVING, то оцінити умову пошуку зовнішнього запиту на основі результатів вкладеного запиту, що виконується на кроці 3. Він визначає чи вибирається рядок-кандидат для виводу. Якщо зв'язаний поідзапит використовується в пропозиції SELECT, то виводяться поля, зазначені в списку елементів основного запиту, які повертаються і результат виконання вкладеного запиту.

5. Повторити процедуру для наступного рядка-кандидата основної (зовнішньої) таблиці і так далі, поки всі рядки таблиці не будуть перевірені.

Page 21: Sql select 3

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 НЕ БУДЕ перевірений.

або

Page 22: Sql select 3

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 НЕ БУДЕ оглянутий.

Page 23: Sql select 3

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 НЕ буде перевірений.

Page 24: Sql select 3

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 НЕ буде перевірений.

Page 25: Sql select 3

3. Зв‘язані підзапити в пропозиціях WHERE і HAVING

Page 26: Sql select 3

3. Зв‘язані підзапити з предикатами ANY та ALL

або

або

Page 27: Sql select 3

3. Зв‘язані підзапити з предикатами ANY та ALL

Page 28: Sql select 3

3. Зв‘язані підзапити з предиком SINGULAR

Page 29: Sql select 3

3. Зв‘язані підзапити з предиком EXISTS

Результат умови вважається істинним тільки тоді, коли результат виконання <табличный_подзапрос> є непустою множиною, тобто коли існує будь-який запис у таблиці, що зазначена в пропозиції FROM запиту, яка задовольняє умові пошуку пропозиції WHERE вкладеного запиту.

Іншими словами, EXISTS - це предикат, який повертає значення, рівне TRUE або FALSE, залежно від наявності виведення з вкладеного запиту. Він може працювати автономно в умові пошуку або в комбінації з іншими логічними виразами, які використовують логічні операції AND, OR і NOT.

Він бере вкладений запит як аргумент і оцінює його:•Як істинний, якщо той виконує довільне виведення;•Як хибний, якщо той не робить цього.

Page 30: Sql select 3

3. Зв‘язані підзапити з предиком EXISTS