Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
m_DBSQL_mu.docx
Скачиваний:
28
Добавлен:
17.03.2016
Размер:
373.51 Кб
Скачать

Підзапити у sql

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

Способи включення підзапиту в запит

• У цільовий список оператора SELECT. У цьому випадку створюється нове поле, значення якого однаково для всіх кортежів. Результатом запиту повинно служити одне значення.

• В інструкцію WHERE. Існує кілька способів вбудування підзапиту в інструкцію WHERE.

1. У операторі порівняння. Результатом такого вбудованого підзапиту має бути одне значення, за яким і відбувається порівняння. Слід пам'ятати, що підзапит має зазначатися другим операндом операції порівняння.

2. З оператором [NOT] IN (SubQuery). У цьому випадку результатом підзапиту може бути колонка значень, яка і буде виступати тою множиною значень, входження в яке перевіряється за допомогою IN.

3. З предикатом [NOT] EXIST (SubQuery). У цьому випадку результат підзапиту – множина кортежів, якщо ця множина не порожня, то значення предиката EXISTS стає TRUE, а предиката NOT EXISTS - FALSE, і навпаки, якщо результат підзапиту - порожня множина.

Особливості синтаксису включення підзапиту

  • Цільовий список підзапиту - одне поле або один вираз. Виключення складають підзапити з EXISTS, які допускають ще і синтаксис SELECT *.

  • Підзапит завжди оформляється в круглих дужках.

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

  • Підзапити допускають угруповання і групові операції.

  • В підзапит НЕ МОЖНА включати інструкції ORDER BY, INTO,

COMPUTE [BY]

Підзапит в цільовому списку

Запит: Вивести відомості про успішність студентів, додавши поруч з оцінкою показник відносної успішності, обчислюється за формулою K1 = Оцінка / AVG (Оцінка)%.

Рішення:

SELECT ПІБ = СПрізв, Дисципліна = Найменування, Семестр, Оцінка,

СередняОцінка = (SELECT AVG (Оцінка) FROM УСПІШНІСТЬ), К1 = (CONVERT (float, Оцінка) / (SELECT AVG (Оцінка) FROM УСПІШНІСТЬ)) * 100, '%'

FROM СТУДЕНТ, УСПІШНІСТЬ, КУРС

WHERE ПІБ = УСПІШНІСТЬ.ID_Stud AND УСПІШНІСТЬ.ID_Subj = КУРС. ID_Subj

Підзапити в інструкції where. Некорельований підзапит

DEF. Підзапит, значення якого не залежить від будь-якого зовнішнього запиту, називається некорельованим.

Некорельовані підзапити часто реалізують з'єднання. Виконання таких запитів відбувається зсередини назовні.

Запит: Перерахувати прізвища студентів, які здавали курс К1 у першому семестрі.

Рішення:

SELECT СТУДЕНТ. ID_Stud, ПІБ = СПрізв

FROM СТУДЕНТ, УСПІШНІСТЬ

WHERE СТУДЕНТ. ID_Stud IN

(SELECT ID_Stud FROM УСПІШНІСТЬ

WHERE ID_Subj=К1 AND Семестр = 1)

У цьому випадку виконання внутрішнього запиту ніяк не залежить від зовнішнього.

Наступний приклад демонструє використання групових операцій в підзапитах.

Запит: Вивести список студентів, у яких хоча б з одного предмета оцінка вище середньої оцінки за всім списком.

Рішення:

SELECT СТУДЕНТ. ID_Stud, ПІБ = СПрізв

FROM СТУДЕНТ, УСПІШНІСТЬ

WHERE СТУДЕНТ. ID_Stud = УСПІШНІСТЬ. ID_Stud AND

Оцінка> (SELECT AVG (Оцінка) FROM УСПІШНІСТЬ

Цікаво, що і тета-з'єднання можна реалізувати як некорельовані запити.

Запит: Перерахувати номери студентів, які здали хоча б один курс, який здав студент з номером 004.

Рішення:

SELECT ID_Stud FROM УСПІШНІСТЬ

WHERE ID_Subj IN

(SELECT ID_Subj FROM УСПІШНІСТЬ WHERE ID_Stud = '004 ')

Запит: Вивести номери курсів, по яких складав іспит більш ніж один студент.

Рішення:

SELECT DISTINCT У1.ID_Subj FROM УСПІШНІСТЬ AS У1

WHERE ID_Subj IN(SELECT У2.ID_Subj FROM УСПІШНІСТЬ AS У2 WHERE У1.ID_Stud <> У2.ID_Stud) Практично всі некорельовані запити можуть бути сформульовані без використання підзапиту. Наприклад, останній запит може бути записаний таким чином.

Решение(2):

SELECT DISTINCT ID_Subj FROM УСПІШНІСТЬ GROUP BY ID_Subj

HAVING COUNT(DISTINCT УСПІШНІСТЬ.ID_Stud) > 1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]