Здавалка
Главная | Обратная связь

Типи підзапитів. Прості і корельовані підзапити



Мова реляційних БД SQL: засоби маніпулювання даними. Нетривіальні запити

Побудова нетривіальних запитів. Поняття нетривіального запиту та підзапиту

Часто неможливо отримати потрібний результат за допомогою одного запиту. Така ситуація виникає, зокрема, тоді, коли при використанні умови пошуку в реченні WHERE значення, з яким треба порівнювати, заздалегідь не визначене (наприклад, є максимальним значенням по вибірці тощо) і має бути обчислене у момент виконання оператора SELECT. Цю проблему можна вирішити або конструюванням «запитів до запитів», або впровадженням у тіло оператора SELECT внутрішніх закінчених конструкцій з оператором SELECT, які забезпечують отримання потрібного проміжного результату. Нетривіальні запити – запити з підзапитами, тобто вбудованими внутрішніми запитами.

Підзапит – закінчений вираз SELECT (без ;), впроваджений в тіло іншого оператора SELECT.

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

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

Внутрішні оператори SELECTможуть застосовуватися в операторах INSERT, UPDATE і DELETE.

Внутрішні запити (підзапити, вкладені запити) можуть бути поміщені безпосередньо після оператора порівняння ( =, <, >, <=, >=, <> ) в реченні WHERE і HAVING зовнішнього оператора SELECT. Текст підзапиту має бути поміщений в дужки. Якщо підзапит є одним з двох операндів, що беруть участь в операції порівняння, то запит повинен розташовуватися в правій частині цієї операції.

Фраза ORDER BY у внутрішніх підзапитах не використовується, хоча і може бути присутня в зовнішньому підзапиті

Список вибору в SELECT складається з імен окремих стовпців або складених з них виразів – за винятком випадку, коли в підзапиті присутнє ключове слово EXISTS. За замовчанням імена стовпців в підзапиті відносяться до таблиці, ім'я якої вказане в FROM. Проте допускається посилання і на стовпці таблиці, вказаної у фразі FROM зовнішнього запиту, для чого застосовуються кваліфіковані імена стовпців (тобто з вказівкою таблиці). Такі посилання називаються зовнішніми, а запити – корельованими.

 

Типи підзапитів. Прості і корельовані підзапити

За кількістю значень, які повертаються, підзапити поділяють на скалярнітатабличні; за зв’язком між джерелами виконання основного запита і вкладеного підзапита та порядком їх виконанняна прості і корельовані

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

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

У разі простих під запитів джерела виконання основного запита і вкладеного підзапиту або ті самі, або не зв’язані. Вкладений підзапит обробляється першим, його результат застосовується при виконанні основного зовнішнього під запиту.

Приклад. Визначити назви товарів, які виготовляються у тих же містах, що і товари, у назві яких є слово “Корона”.

SELECT Товар.Назва

FROM Товар

WHERE Товар.Місто IN

(SELECT Місто

FROM Товар WHERE

Товар.Назва LIKE «*Корона*»);

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

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

Корельовані підзапити характерні для предиката EXIST, але можуть бути використані й в інших підзапитах

Приклад. Визначити назви товарів, які не купив жоден клієнт.

SELECT Товар.Назва

FROM Товар

WHERE NOT EXISTS

(SELECT Угода.КодТовару

FROM Угода

WHERE Товар.КодТовару=Угода.КодТовару);

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.