- •4.1. Історія мови sql та огляд її можливостей
- •4.2. Засоби пошуку даних
- •4.2.1. Основні конструкції мови, призначені для вибирання даних
- •4.2.2. Вирази, умови та оператори
- •4.2.3. Вибирання з кількох таблиць
- •4.2.4. Використання агрегатних функцій
- •4.2.5. Фраза group by. Групування таблиці за рядками
- •4.2.6. Фраза having. Умова вибирання для груп рядків
- •4.2.8. Порядок обчислення запитів
- •4.2.9. Підзапити
- •4.2.7. Фраза order by. Впорядкування рядків
- •4.2.10. Використання предикатів any, all, exists та in
- •4.2.11. Використання теоретико-множинних операторів
- •4.2.12. Запити, в яких реалізується квантор загальності
- •4.2.13, Використання невизначених значень
- •4.3. Засоби маніпулювання даними
- •4.3.1. Додавання рядків до таблиці. Оператор insert
- •4.3.2. Оновлення даних. Оператор update
- •4.3.3. Видалення рядків таблиці. Оператор delete
- •4.4. Операції над схемою бази даних
- •4.4.1. Створення бази даних. Оператор create database
- •4.4.2. Створення таблиці. Оператор create table
- •4.5.2. Використання індексів
- •4.6. Транзакції
- •4.6.1. Початок і завершення транзакції
- •4.6.2. Скасування транзакції. Точки збереження
- •4.7. Тригери
- •4.8. Додаткові можливості
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Р)
