Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL_mova_strukturovanikh_zapitiv.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
933 Кб
Скачать
☆

4.2.7. Фраза order by. Впорядкування рядків

У фразі ORDER BY перелічуються стовпці кінцевої таблиці, за значеннями яких слід відсортувати її рядки, а також встановити порядок цього сортування: за зростан­ням - ASC чи спаданням — DESC. Зауважимо, що впорядковувати таблиці можна за значеннями лише тих стовпців, які перелічені у фразі SELECT. За замовчуванням здійснюється впорядкування за зростанням.

Запит 4.21

Вивести прізвища викладачів у порядку спадання.

SELECT Прізвище FROM ВИКЛАДАЧ ORDER BY Прізвище DESC

Запит 4.22

Вивести в порядку зростання кількості викладачів на всіх кафедрах навчального закладу.

SELECT КАФЕДРА.Назва, C0UNT(*) Number_Of_Faculty_Teachers

FROM КАФЕДРА. ВИКЛАДАЧ

WHERE КАФЕДРА.#D = ВИКЛАДАЧ.#D

GROUP BY КАФЕДРА.Назва

ORDER BY Number_Of_Faculty_Teachers

4.2.8. Порядок обчислення запитів

У запитах фрази вживають у певному порядку: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. Обчислення запиту здійснюється дещо в інший спосіб:

  • обчислюється декартів добуток рядків з таблиць, зазначених у фразі FROM;

  • до отриманої єдиної таблиці застосовуються умови з фрази WHERE, які форму­люються так, що їхня істинність перевіряється на рядку єдиної таблиці;

-♦• отримані рядки групуються відповідно до умови, записаної у фразі GROUP BY;

  • до згрупованих рядків застосовуються умови, задані у фразі HAVING: вибирають­ся лише ті групи, що відповідають цим умовам;

  • рядки (групи) впорядковуються відповідно до фрази ORDER BY;

  • виводяться зазначені у фразі SELECT стовпці чи вирази.

4.2.9. Підзапити

Підзапит - це запит, результат виконання якого є аргументом іншого запиту. Підзапити називають ще вкладеними запитами. Для того щоб вкласти підзапит у запит, потрібно зазначити його у фразі WHERE чи HAVING у правому аргументі одного з таких предикатів: IN, EXISTS =, <>, <, <=, >, >=. Існують прості (незалежні) й коре-льовані (залежні) вкладені підзапити. Інколи корельовані підзапити називають також інвертованими, підкреслюючи тим самим зворотний напрямок їхнього об­числення.

Простий {незалежний) підзапит - це підзапит, обчислення якого здійснюєть­ся незалежно від обчислення зовнішнього запиту. Такі підзапити обробляються «знизу вверх»: першим обробляється вкладений підзапит, а множина значень, от­римана в результаті його виконання, використовується під час обробки зовніш­нього запиту.

Корельований (залежний, пов'язаний) підзапит — це підзапит, обчислення яко­го залежить від процесу обчислення в зовнішньому запиті. Такі підзапити оброб­ляються «зверху вниз»: спочатку вибирається поточний рядок із таблиці зовніш­нього запиту й за значеннями його полів виконується обчислення підзапиту (тобто під час перевірки умов обчислення підзапиту використовуються значення полів із зовнішнього запиту). Далі перевіряється умова WHERE щодо входження по­точного рядка зовнішнього запиту до результату.

Повернення одного значення

У разі використання предикатів, що порівнюють два значення (=, ф, <, <, >, _:), під­запит має повертати одне значення. У протилежному випадку видається повідом­лення про помилку. Розглянемо приклади.

Запит 4.23 ■

Визначити кафедри вузу, що розташовані в тому ж корпусі, що й кафедра АСУ.

SELECT Назва

FROM КАФЕДРА

WHERE Корпус = (SELECT Корпус

FROM КАФЕДРА

WHERE Назва = "АСУ")

Внутрішній запит визначає корпус кафедри АСУ; він використовується в пре­дикаті порівняння (=) зовнішнього запиту.

У підзапиті можна застосовувати агрегатну функцію, що гарантує повернення єдиного значення.

Запит 4.24

Визначити факультети, фонд яких перевищує сумарний фонд усіх кафедр фа­культету інформатики.

SELECT Назва

FROM ФАКУЛЬТЕТ

WHERE Фонд > (SELECT SUM(КАФЕДРА.Фонд)

FROM ФАКУЛЬТЕТ, КАФЕДРА

WHERE ФАКУЛЬТЕТ.#F = КАФЕДРАМ AND

ФАКУЛЬТЕТ.Назва = "інформатики")

Як уже зазначалося, підзапити можуть вкладатися у фразу HAVING. Прикладом є запит 4.25.

Запит 4.25

Визначити кафедри, де студентів навчається більше, ніж на кафедрі інженерії програмного забезпечення (ІПЗ).

SELECT КАФЕДРА.Назва. SUM(ГРУПА.Кількість)

FROM КАФЕДРА. ГРУПА

WHERE КАФЕДРА.#D = ГРУПА.#D

GROUP BY КАФЕДРА.Назва

HAVING SUM(ГРУПА.Кількість) >

(SELECT SUM(ГРУПА.Кількість) FROM КАФЕДРА, ГРУПА

WHERE КАФЕДРА.#D = ГРУПА.#D AND КАФЕДРА.Назва = "ІПЗ")

Повернення багатьох значень

Якщо використовується предикат, що перевіряє належить (IN) чи ні (NOT IN) окре­ме значення множині, то підзапит може повертати множину значень. Розглянемо приклад.

Запит 4.26

Визначити, хто з викладачів факультету інформатики працює також на інших факультетах.

SELECT ВИКЛАДАЧ.Прізвище FROM ФАКУЛЬТЕТ, КАФЕДРА. ВИКЛАДАЧ

WHERE ФАКУЛЬТЕТ.#F = КАФЕДРА.#F AND КАФЕДРА.#D = ВИКЛАДАЧ.#D AND ФАКУЛЬТЕТ.Назва = "інформатики" AND ВИКЛАДАЧ.Прізвище IN (SELECT ВИКЛАДАЧ.Прізвище FROM ФАКУЛЬТЕТ. КАФЕДРА, ВИКЛАДАЧ

WHERE ФАКУЛЬТЕТ.#F = КАФЕДРА.#F AND КАФЕДРА.#D = ВИКЛАДАЧ.#D AND ФАКУЛЬТЕТ.Назва * "інформатики")

Корельованість (зв'язаність) підзапиту із запитом

У деяких випадках спосіб обчислення підзапиту залежить від значення поточно­го рядка зовнішнього запиту. Так, у підзапиті запиту 4.27 у фразі FROM згадується лише реляційне відношення КАФЕДРА, однак у фразі WHERE ми посилаємося на відно­шення ФАКУЛЬТЕТ. Це означає, що відбувається звернення до зовнішнього запиту. За наявності подібного звернення обчислення здійснюється в такий спосіб:

  • фіксується поточний рядок зовнішнього реляційного відношення;

  • для обчислення умови фрази WHERE виконується обчислення підзапиту, при цьо­му використовуються значення з поточного рядка зовнішнього запиту.

Обробка корельованого підзапиту має повторюватися для кожного з рядків таблиці, обчисленої у фразі FROM зовнішнього підзапиту, а не виконуватися лише раз, як у незв'язаному підзапиті. Розглянемо кілька прикладів корельованих під-запитів.

Запит 4.27

Визначити факультети, фонд кожного з яких менший, ніж сума фондів всіх його кафедр.

SELECT Назва

FROM ФАКУЛЬТЕТ

WHERE Фонд < (SELECT $иМ(Фонд)

FROM КАФЕДРА

WHERE КАФЕДРА.#F = ФАКУЛЬТЕТ.#F)

Запит 4.28

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

SELECT Прізвище FROM ВИКЛАДАЧ

WHERE NOT EXISTS (SELECT *

FROM ГРУПА

WHERE ВИКЛАДАЧ.#T = ГРУПА.#КУРАТ0Р)

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