- •Загальні відомості
- •Поняття відношень
- •Реляційна база даних „успішність”
- •Операції реляційної алгебри
- •Теоретико-множинні операції ра
- •Операції, властиві тільки ра
- •Реляційне числення
- •Квантор існування. З'єднання
- •Квантор загальності. Ділення
- •Типи даних
- •Створення простого запиту в sql
- •Групування даних
- •Багатотабличні запити
- •Природне з'єднання
- •Тета-з'єднання
- •Зовнішнє з'єднання
- •Використання оператора join в інструкції from
- •Операції реляційної алгебри в sql-92
- •Підзапити у sql
- •Способи включення підзапиту в запит
- •Особливості синтаксису включення підзапиту
- •Підзапит в цільовому списку
- •Підзапити в інструкції where. Некорельований підзапит
- •Корельовані підзапити
- •Квантор існування в підзапитах
- •Оператори all, any, some
- •Оператори модицікації даних
- •Мова опису даних
- •Представлення
- •Висновок
- •Лабораторний практикум Лабораторна робота № 1
- •Лабораторна робота № 2
- •Контрольні завдання по sql
- •Бібліографічний список
Операції, властиві тільки ра
Вибірка
Вибірка - операція РА, що виробляє відбір кортежів з РВ на основі деякої умови.
Іноді вибірку називають горизонтальною проекцією. Операція має наступний синтаксис:
B := SELECT(ІМ’Я_ТАБЛИЦІ: <БУЛЕВИЙ ВИРАЗ>).
При формуванні умови на горизонтальну проекцію <БУЛЕВИЙ ВИРАЗ> будується з термів порівняння за допомогою зв'язок "І", "АБО", "НЕ" і, можливо, дужок. Терм порівняння допустимий в двох видах: А ОП а; А ОП В, де А і В - імена деяких тета-порівняних(що відносяться до одного домена) атрибутів, а - константа, ОП - одна з операцій порівняння(=, <> (!=) .>=, <=, !>, !<).
Запит. Який номер має студент Іваненко І.І.?
Результат.
ID_Stud |
СПрізв |
САдреса |
Консультант |
001 |
Іваненко І.І. |
А1 |
004 |
002 |
Іваненко І.І. |
А2 |
004 |
Запит. Хто отримав більше трійки за курсом К2 в першому семестрі?
Рішення. УСПІШНІСТЬ_К2: = SELECT (УСПІШНІСТЬ: (ID_Subj=”К2”) AND (Семестр = 1) AND (Оцінка> 3)).
Результат.
ID_Stud |
ID_Subj |
Семестр |
Оцінка |
001 |
К2 |
1 |
4 |
004 |
К2 |
1 |
5 |
Створення проекцій
Операцію вибірки можна представити як операцію виключення "непотрібних" кортежів. Часто для відповіді на запит необхідні не всі атрибути досліджуваного відношення, а тільки деякі з них. Наприклад, у останньому запиті нас могло цікавити лише значення поля ID_Stud. Операція виключення "непотрібних" атрибутів називається вертикальною проекцією, а результуюче відношення - проекцією.
Синтаксис операції:
ІМ'Я_ТАБЛИЦІ [ІмяСтолбца_1, ІмяСтолбца_2, ...]. Тут ІМ'Я_ТАБЛИЦІ - ім'я вихідної таблиці, а ІмяСтолбца_і, стовпці, які увійдуть в проекцію.
Запит. Які оцінки отримували студенти?
Рішення. УСПІШНІСТЬ [Оцінка]
Результат.
Оцінка |
3 |
4 |
5 |
Зауважимо, що кожне значення в проекцію входить тільки один раз. Це знову робиться для того, щоб зберегти результат як відношення.
На прикладі проекції продемонструємо вкладення операцій в РА, тобто послідовне виконання операцій без явного присвоєння імені проміжної таблиці. Для прикладу повернемося до останнього запиту на операцію вибірки.
Запит. Хто отримав більше трійки за курсом К2 в першому семестрі?
Рішення. НОМ_УСПІШНІСТЬ_К2: = SELECT (УСПІШНІСТЬ: ID_Subj = 'К2' AND Семестр = 1 AND Оцінка> 3) [ID_Stud].
Результат.
НОМ_УСПІШНІСТЬ_К2
ID_Stud |
001 |
004 |
Відзначимо, що завжди спочатку виконується операція вибору, а потім результат проектується. Вкладення операцій можна виробляти в довільному порядку, дозволено застосовувати дужки для вказівки пріоритету.
З'єднання
З'єднання - одна з найбільш важливих операцій РА. Саме завдяки можливості реалізації з'єднання відношень, БД проектується в нормалізованому вигляді (позбавленому надмірності зберігання та основних аномалій, пов'язаних із зміною даних). Тим не менш, операція з'єднання не є самостійною, вона визначається через інші операції РА.
Зазвичай виділяють кілька варіантів з'єднання: природне, тета-з'єднання, зовнішнє.
• Природне З'єднання - операція з'єднання, що зв'язує відношення, коли загальні атрибути мають рівні значення.
Як правило, природне з'єднання робиться по внутрішнім зв'язкам схеми БД.
Результатом природного з'єднання JOIN (A, B) двох відношень А і В, що мають спільні атрибути С1, ..., СП, є відношення, отримане в такий спосіб:
1. А * В (результат містить по два стовпці на кожен С1, ..., Сn).
2. SELECT (A * B: A.C7 = B.C7 And А.C2 = B.C2 ... And А.Cn = B.Cn) (з множення виключаються всі рядки, крім тих, у яких значення С1, .. ., Сn з А співпадають з відповідними стовпцями С1, ..., Сn з В).
3. Проектуванням виключається одна копія стовпців С1, ..., Сn.
Запит. Хто здавав курс К1?
Рішення. СТУДЕНТ_К1: = JOIN (УСПІШНІСТЬ_К1, СТУДЕНТ).
Результат.
ID_Stud |
СПрізв |
САдреса |
Консультант |
ID_Su bj |
Семестр |
Оцінка |
001 |
Іваненко І.І. |
А1 |
004 |
К1 |
6 |
4 |
002 |
Іваненко І.І. |
А2 |
004 |
К1 |
6 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К1 |
6 |
5 |
Інше погляд на природне з'єднання - це розгляд процесу з позиції табличного пошуку. Для кожного рядка відношення УСПІШНІСТЬ_К1 ми шукаємо рядки у відношенні СТУДЕНТ, що мають той же ID_Stud. Таким чином, оскільки ID_Stud - ключове поле в СТУДЕНТ і УСПІШНІСЬ_К1 містить три рядки, то й результуюче відношення матиме три рядки. Ми просто розширили кожен рядок УСПІШНІСТЬ_К1, додавши інформацію про студента.
Шлях від відношення до відношення може лежати через кілька з'єднань, а також виконання інших операцій РА.
Запит. Хто здавав Вищу математику за 1 семестр?
Рішення. A: = SELECT (КУРС: Найменування = 'Вища матем.');
B: = JOIN (УСПІШНІСТЬ, A); C: = SELECT (B: Семестр = 1);
D: = JOIN (СТУДЕНТ, C) [СПрізв].
Результат.
D
CПрізв |
Іваненко І.І. |
Андреєва А.А. |
• Тета-з'єднання - операція РА, що зв'язує відношення, при якій значення зв'язуючих атрибутів задовольняють деякій умові JOIN (A, B: Умова_з’єднання). Умова_з’єднання має вигляд А.х ОП В.у, де x і y - сполучні атрибути відношень A і B відповідно, ОП - один з операторів порівняння: =, <>,>,> =, <, <=. Таким чином, природне з'єднання можна вважати підтипом тета-з'єднання,яке проводитьсяпо атрибутам зв'язку. Відзначимо, що тета-з'єднання не припускає видалення "зайвих" атрибутів на останньому кроці. Якщо оператор порівняння "=", а атрибути зв'язку належать одному відношенню, то з'єднання називаютьеквіз’єднання.
Запит.Ідентифікувати студентів, чий консультант Андрєєва О. О.
Рішення.Вирішимо проблему наступним чином. СТУД1: = СТУДЕНТ; СТУД2: = СТУДЕНТ;
A: =JOIN(СТУД1, СТУД2: СТУД1.ІD_Stud= СТУД2.Консультант) (екві-з'єднання);
B: =SELECT(A: СТУД2.Консультант= 'Андреєва А.А.') [СТУД1.СПрізв].
•Зовнішнє З'єднання - розширення природного з'єднання, що включає всі кортежі із з'єднуваних відношень.
Запит. Приєднати інформацію про успішність до інформації про студентів.
Рішення. JOIN (СТУДЕНТ, УСПІШНІСТЬ).
Результат.
ID_Stud |
СПрізв |
САдреса |
Консультант |
ID_Su bj |
Семестр |
Оцінка |
001 |
Іваненко І.І |
А1 |
004 |
К1 |
6 |
4 |
001 |
Іваненко І.І |
А1 |
004 |
К2 |
1 |
4 |
001 |
Іваненко І.І |
А1 |
004 |
К2 |
2 |
3 |
002 |
Іваненко І.І |
А2 |
004 |
К1 |
6 |
5 |
002 |
Іваненко І.І |
А2 |
004 |
К3 |
3 |
4 |
004 |
Андреєва А.А. |
А4 |
Null |
К1 |
6 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К2 |
1 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К3 |
3 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К2 |
2 |
5 |
Оскільки студентка Петрова П.П. ще нічого не здавала, то в рамках природного з'єднання дані про Петрову не увійдуть в результуюче відношення. Багато хто вважає, що тим самим втрачається важлива інформація.
Проблема вирішується шляхом введення ще одного виду з'єднання - зовнішнього OUTERJOIN (А, В). У цьому випадку до відношення-довідника СТУДЕНТ додається відношення зв'язок успішність.
Рішення попередньої задачі за допомогою зовнішнього з'єднання. OUTERJOIN (СТУДЕНТ, УСПІШНІСТЬ).
Результат.
ID_Stud |
СПрізв |
САдреса |
Консультант |
ID_Su bj |
Семестр |
Оцінка |
001 |
Іваненко І.І |
А1 |
004 |
К1 |
6 |
4 |
001 |
Іваненко І.І |
А1 |
004 |
К2 |
1 |
4 |
001 |
Іваненко І.І |
А1 |
004 |
К2 |
2 |
3 |
002 |
Іваненко І.І |
А2 |
004 |
К1 |
6 |
5 |
002 |
Іваненко І.І |
А2 |
004 |
К3 |
3 |
4 |
003 |
Петрова П.П. |
А3 |
002 |
Null |
Null |
Null |
004 |
Андреєва А.А. |
А4 |
Null |
К1 |
6 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К2 |
1 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К3 |
3 |
5 |
004 |
Андреєва А.А. |
А4 |
Null |
К2 |
2 |
5 |
Ділення
Ділення - операція РА, що створює нове відношення шляхом вибору кортежів одного відношення, відповідних кожному кортежу іншого відношення.
Запит. Перерахувати номери студентів, які здали всі предмети хоча б за один семестр.
Рішення. Інтуїтивно рішення виглядає так. Спочатку ми повинні створити таблицю, що складається з первинного ключа таблиці КУРС, так як саме він фігурує в таблиці УСПІШНІСТЬ.
А: = КУРС [ID_Subj]
Тепер створимо таблицю, що містить інформацію ХТО ЯКІ КУРСИ ЗДАВАВ:
В: = УСПІШНІСТЬ [ID_Stud, ID_Subj].
Тепер нам залишається обчислити, ХТО З СТУДЕНТІВ представлений в В у поєднанні з кожного курсу.
Це і робиться за допомогою операції ділення:
C: = В / А.
Результат.
A |
|
B |
|
|
C |
ID_Subj |
|
ID Stud |
ID Subj |
|
ID_Stud |
К1 |
|
001 |
К1 |
|
004 |
К2 |
|
001 |
К2 |
|
|
К3 |
|
002 |
К1 |
|
|
|
|
002 |
К3 |
|
|
|
|
004 |
К1 |
|
|
|
|
004 |
К2 |
|
|
|
|
004 |
К3 |
|
|
Дамо загальний опис операції наступним чином. Нехай А, В, С-РВ, і ми хочемо розділити В на С і отримати в результаті А (А = В / С). тоді
1. Стовпці С повинні складати підмножина стовпців В. стовпцями А будуть тільки ті стовпці В, які не є стовпцями С.
2. Рядок поміщається в таблицю А в тому, і тільки тому випадку, якщо вона входить у В з кожним підрядком С.
Приклад
Наведемо приклад, який демонструє творчий підхід в використанні операцій РА.
Запит. Визначити максимальну оцінку, отриману Іваненкоим І. І.
Рішення. Відразу відзначимо, що Іваненкоих І.І. у нас двоє, але, так як в запиті нічого більше не уточнюється, будемо шукати оцінку, максимальну для двох студентів. Це ілюструє, що запити повинні максимально чітко формулюватися не тільки на формальній мові запиту, але і на стадії розробки завдання.
Далі, в очі кидається складність: необхідно порівнювати значення одного і того ж поля в різних рядках, так що операція вибору відпадає - вона обробляє за один раз тільки один рядок. Однак тета-з'єднання порівнює, принаймні, два рядки за один раз. Скористаємося цим для зв'язку таблиці з самою собою. Отже, спочатку відберемо необхідні записи в УСПІШНІСТЬ.
A: = SELECT (СТУДЕНТ: СПрізв = 'Іваненко І.І.') [ID_Stud];
B: = JOIN (УСПІШНІСТЬ, А);
Тепер проробимо наступне: С: = B [Оцінка]; D: = C;
E: = JOIN (C, D: С.Оцінка > D.Оцінка). Подивимося на результат цих незвичайних дій.
В |
|
|
|
|
С |
|
D |
|
E |
|
ID Stud |
ID Subj |
Семестр |
Оцінка |
|
Оцінка |
|
Оцінка |
|
C.Оцінка |
D.Оцінка |
001 |
К1 |
6 |
4 |
|
4 |
|
4 |
|
4 |
3 |
001 |
К2 |
1 |
4 |
|
3 |
|
3 |
|
5 |
4 |
001 |
К2 |
2 |
3 |
|
5 |
|
5 |
|
5 |
3 |
002 |
К1 |
6 |
5 |
|
|
|
|
|
|
|
002 |
К3 |
3 |
4 |
|
|
|
|
|
|
|
Якщо уважно розглянутитаблицю Е, то можна помітити, що стовпець С.Оцінкамістить всі величини, крім мінімальної, а стовпець D.Оцінка - всі величини, крім максимальної. Цим і скористаємося:
F: = E [D.Оцінка];
G: = C - F.
Оскільки C містить всі величини оцінок, а F всі, крім максимальної, то результатом буде максимальна оцінка.
Зауваження: Якщо Е порожня, то, значить, С складається з одного запису, а D.Оцінка= NULL, тоді замість двох останніх операцій слід виконати:
F *: = OUTERJOIN (C, D.Оцінка]);
G *: = SELECT (F *: D.Оцінка = NULL) [С.Оцінка].
F* |
|
С. Оцінка |
D.Оцінка |
значення |
NULL |