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

Операції, властиві тільки ра

Вибірка

Вибірка - операція РА, що виробляє відбір кортежів з РВ на основі деякої умови.

Іноді вибірку називають горизонтальною проекцією. Операція має наступний синтаксис:

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

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