- •Загальні відомості
- •Поняття відношень
- •Реляційна база даних „успішність”
- •Операції реляційної алгебри
- •Теоретико-множинні операції ра
- •Операції, властиві тільки ра
- •Реляційне числення
- •Квантор існування. З'єднання
- •Квантор загальності. Ділення
- •Типи даних
- •Створення простого запиту в sql
- •Групування даних
- •Багатотабличні запити
- •Природне з'єднання
- •Тета-з'єднання
- •Зовнішнє з'єднання
- •Використання оператора join в інструкції from
- •Операції реляційної алгебри в sql-92
- •Підзапити у sql
- •Способи включення підзапиту в запит
- •Особливості синтаксису включення підзапиту
- •Підзапит в цільовому списку
- •Підзапити в інструкції where. Некорельований підзапит
- •Корельовані підзапити
- •Квантор існування в підзапитах
- •Оператори all, any, some
- •Оператори модицікації даних
- •Мова опису даних
- •Представлення
- •Висновок
- •Лабораторний практикум Лабораторна робота № 1
- •Лабораторна робота № 2
- •Контрольні завдання по sql
- •Бібліографічний список
Підзапити у 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