Інструкція subquery - sql програмування

Підзапит (subquery) - це вкладений запит. Підзапити можуть зустрічатися в різних частинах інструкцій SQL.

У SQL підтримуються наступні типи підзапитів.

Підзапити, извлекающие одне значення. Це найбільш широко підтримуваний різними платформами тип підзапитів.

Підзапити, извлекающие кілька значень. Цей тип підзапитів витягує значення з кількох стовпців.

Вкладені табличні підзапити

Підзапити, извлекающие декілька стовпців і кілька рядків.

Скалярні і векторні підзапити на деяких платформах можуть бути частиною вираження в списку відбираються елементів інструкції SELECT, входити в пропозицію WHERE і в пропозицію HAVING. Вкладені табличні підзапити, як правило, зустрічаються в пропозиціях FROM інструкцій SELECT.

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

Функціонування підзапиту підпорядковується різним правилам залежно від того, в яку пропозицію він входить. Ступінь підтримки підзапитів в різних платформах також різниться. Деякі платформи підтримують підзапити у всіх раніше згаданих пропозиціях (SELECT, FROM, WHERE і НА VING), а інші платформи - тільки в одному або двох з цих пропозицій.

Підзапити зазвичай пов'язують з інструкцією SELECT. Оскільки підзапити можуть перебувати в реченні WHERE, їх можна використовувати в будь-якій інструкції SQL, яка підтримує пропозицію WHERE, в тому числі SELECT, INSERT SELECT, DELETE я UPDATE.

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

Корельовані підзапити більш складні, оскільки значення таких підзапитів залежать від значень, що витягають головним запитом. наприклад:

Зверніть увагу, що пропозиція IN використовується тільки в якості прикладу. Можна використовувати будь-який оператор порівняння.

Ключові слова

Скалярний підзапит додається в список елементів інструкції SELECT або в пропозицію WHERE або HAVING запиту.

вкладений табличний підзапит

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

Табличний підзапит додається тільки в пропозицію WHERE з використанням таких операторів, як IN, ANY, SOME, EXISTS або ALL, які діють на кілька значень. Табличні підзапити повертають одну або кілька рядків, що містять одне значення.

Загальні правила

Підзапити дозволяють отримати одне або кілька значень і помістити їх в інструкцію SELECT, INSERT, UPDATE або DELETE або в інший підзапит. Підзапити можна використовувати всюди, де дозволено застосування виразів. Також підзапити часто можна замінити інструкціями JOIN. Продуктивність підзапитів може бути нижче, ніж продуктивність інструкцій JOIN (це залежить від платформи).

Підзапити завжди полягають в дужки.

Підзапити можуть використовуватися в реченні SELECT зі списком елементів, що складається як мінімум з одного елемента, в реченні FROM для посилання на одну або кілька таблиць або уявлень або в пропозиціях WHERE і HAVING.

Скалярні підзапити можуть повертати лише одне значення. Деякі оператори пропозиції WHERE приймають тільки одиночне значення (наприклад, =.> == = AVG (SELECTcolumn 1 FROM salesTable ...). Обійти це обмеження можна, якщо виконати агрегат в підзапиті, а не в зовнішньому запиті.

Поради та хитрості програмування

Платформи більшості виробників не дозволяють посилатися на великі типи даних (наприклад, CLOB і BLOB в Oracle і IMAGE і TEXT в SQL Server), а також на типи-масиви (наприклад, TABLE або CURSOR в SQL Server).

Всі платформи підтримують підзапити, але не всі виробники підтримують всі типи підзапитів. В 3.6 показані типи запитів, підтримувані різними виробниками.

Підзапити не обмежуються тільки інструкціями SELECT. Їх можна також використовувати в інструкціях INSERT, UPDATE і DELETE, які містять пропозицію WHERE. Підзапити часто застосовуються для наступних цілей.

  • Для вказівки рядків, що вставляються в цільову таблицю з використанням інструкції INSERT ... SELECT, CREATE TABLE ... SELECT або SELECT ... INTO.
  • Для вказівки рядків уявлення або матеріалізованого уявлення в інструкції CREAТЕ VIEW.
  • Для вказівки значень, пов'язаних з існуючими рядками за допомогою інструкції UPDATE.
  • Для вказівки значень для умов в пропозиціях WHERE і HAVING інструкцій SELECT, UPDATE і DELETE.
  • Для створення уявлення таблиці (таблиць) «на ходу» (тобто вкладені табличні підзапити).

У цьому розділі наводяться приклади, які однаково підходять для DB2, MySQL, Oracle, PostgreSQL і SQL Server.

Нижче показаний простий скалярний підзапит в списку елементів інструкції SELECT.

Вкладені табличні підзапити функціонально еквівалентні запитам до уявленням. У наступному прикладі ми запитаємо у вкладеному табличному підзапиті рівень освіти (edlevel) і зарплату (salary), а потім виконаємо агрегацію значень похідної таблиці в зовнішньому запиті.

Запам'ятайте, що на деяких платформах такий запит може не виконатися без пропозиції AS, в якому похідною таблиці присвоюється ім'я.

У наступному прикладі показаний стандартний табличний підзапит в складі пропозиції WHERE. У цьому випадку нам потрібні всі номери проектів співробітників з департаменту А00.

Наведений вище підзапит виконується в зовнішньому запиті тільки один раз.

У наступному прикладі ми хочемо отримати імена співробітників і рівень їх старшинства. Результуючий набір виходить за допомогою корельованого підзапиту.

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

Корельовані підзапити залежать від значень, отриманих зовнішнім запитом, які повинні бути отримані до того, як буде оброблятися внутрішній запит. Такими запитами складно опанувати, але вони надають унікальні програмні можливості. У наступному прикладі ми отримуємо інформацію про замовлення (orders), де кількість проданого (quantity) менше середнього (average) кількості інших продажів товарів того ж найменування (title).

Тієї ж самої мети ми можемо досягти, використовуючи рефлексивне з'єднання (self-join). Однак бувають ситуації, коли корельований підзапит є єдиним способом досягнення необхідного результату.

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

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

Платформа DB2 підтримує типи підзапитів стандарту ANSI. Дозволяється використання скалярних підзапитів в списку елементів інструкції SELECT, вкладених табличних підзапитів - в реченні FROM, а також скалярних і векторних підзапитів в складі пропозицій WHERE і HAVING. Платформа DB2 дозволяє застосовувати корельовані підзапити в списку елементів інструкції SELECT і в пропозиціях WHERE і НА VING.

Платформа MySQL підтримує вкладених табличних підзапитів в списках елементів і в реченні.

Платформа підтримує підзапити стандарту ANSI, хоча застосовується інша номенклатура. У Oracle вкладені табличні підзапити, що використовуються в реченні FROM, називаються вбудованими уявленнями (inline view). І це правильно, оскільки вкладені табличні підзапити - це, по суті, уявлення, створювані «на ходу». У Oracle підзапити, які використовуються в пропозиціях WHERE і HAVING, називаються вкладеними підзапитах (nested subquery). Oracle дозволяє використовувати корельовані підзапити в списку елементів інструкції SELECT і в пропозиціях WHERE і HAVING.

PostgreSQL

Платформа PostgreSQL підтримує підзапити стандарту ANSI в пропозиціях FROM, WHERE і HAVING. Однак підзапити в пропозиції HAVING не можуть включати в себе пропозиції ORDER BY, FOR UPDATE і LIMIT. В даний час PostgreSQL не підтримує вкладені запити в списку елементів інструкції SELECT.

SQL Server

Платформа SQL Server підтримує підзапити стандарту ANSI. Скалярні підзапити можна використовувати практично скрізь, де можуть використовуватися стандартні вирази. Підзапити SQL Server не можуть містити пропозицій COMPUTE і FOR BROWSE. Можна використовувати пропозицію ORDER BY, якщо також використовується пропозицію ТОР.

Додаткова інформація по темі

Деякі правила і методи використання інструкції SET в базах даних на різних платформах

Правила і методи використання інструкції INSERT в базах даних на різних платформах

Правила і методи використання інструкції MERGE в базах даних на різних платформах

Деякі правила і методи використання інструкції SET ROLE в базах даних на різних платформах

Схожі статті