В. М. Дубовой Укладач д т. н., проф

Вид материалаДокументы

Содержание


Об'єднання таблиць
Select first.sfam, second.sfam, first.stip
Select first.sfam, second.sfam, first.stipfrom students first, students second where first.stip=second.stip and first.sfam
Second.pnum, second.tnum from predmet first, predmet second where first.pnum = second.pnum and first.tnum
Select first.sfam, second.sfam, third.sfam from students first, students second,students third where first.stip = 25.50 and seco
Create index
Create index sfamidx on students (sfam)
Create unique index snumidx on students (snum)
Drop index
Подобный материал:
1   2   3   4   5   6   7

Об'єднання таблиць



Вище було показано, що в многотабличном запиті можна поєднувати дані таблиць, однак цікаво і те, що та ж сама методика може використовуватися для об'єднання разом двох копій одиночної таблиці. Для об'єднання таблиці із собою бій можна зробити кожен рядок таблиці одночасно і комбінацією її із собою і комбінацією з кожним іншим рядком таблиці, а потім оцінити кожну комбінацію в термінах предиката. Це дозволяє легко створювати визначені види зв'язків між різними елементами усередині одиночної таблиці. Наприклад, допускається зобразити об'єднання таблиці із собою, як об'єднання двох копій однієї і тієї ж таблиці, причому вона насправді не копіюється, але SQL виконує команду так, ніби це було зроблено.

Використання команди для об'єднання таблиці із собою аналогічно тому прийому, що використовується для об'єднання декількох таблиць. Коли поєднується таблиця із собою, Всі повторювані імена стовпця заповнюються префіксами імені таблиці. Щоб посилатися до цих стовпців усередині запиту, необхідно мати два різних імена для цієї таблиці. Це можна зробити за допомогою визначення тимчасових імен, називаних псевдонімами, що визначаються в пропозиції FROM запиту. Синтаксис у цьому випадку наступний: після імені таблиці залишають пробіл, а потім повинний випливати псевдонім для неї.

Наприклад, для пошуку студентів, що мають однаковий розмір стипендії, можна скористатися наступним запитом:

SELECT FIRST.SFAM, SECOND.SFAM, FIRST.STIP

FROM STUDENTS FIRST, STUDENTS SECOND WHERE FIRST.STIP = SECOND.STIP;

Результат такого запиту буде наступний:

Поляків Поляків Огарьова Гриценко Гриценко Кошеняті Котенко Нагорний Нагорний

Поляків Нагорний Старова Гриценко Котенко Гриценко Котенко Поляків Нагорний

25.50 25.50 17.00 0.00 0.00 0.00 0.00 25.50 25.50

У даному прикладі SQL поводиться так, ніби він з'єднував дві різні таблиці, називані FIRST і SECOND, тобто псевдоніми дозволяють однієї і тій же таблиці бути обробленої незалежно. Зверніть увагу на те, що псевдоніми можуть використовуватися в пропозиції SELECT до їхнього оголошення в пропозиції FROM, однак SQL буде спочатку допускати будь-як псевдоніми і може відхилити команду, якщо вони не будуть визначені далі в запиті. Крім того, необхідно пам'ятати, псевдонім існує тільки тоді, коли команда виконується, а після завершення запиту псевдоніми, використовувані в ньому, більше не мають ніякого значення.

Висновок останнього приклада має два значення для кожної комбінації прізвищ, причому друг раз у зворотному порядку - це зв'язано з тим, що каждое значення показане перший раз у кожнім псевдонімі і друг раз у предикаті, тобто поточне значення в першому псевдонімі спочатку вибирається в комбінації зі значенням у другому псевдонімі, а потім навпаки.

Кращий спосіб уникнути цього складається в накладенні порядку на два значення так, щоб один міг бути менше, ніж інший чи передував йому за абеткою. Це робить предикат асиметричним щодо зв'язку, тому ті ж самі значення в зворотному порядку не будуть обрані знову. Отже, приклад можна модифікувати в такий спосіб:

SELECT FIRST.SFAM, SECOND.SFAM, FIRST.STIPFROM STUDENTS FIRST, STUDENTS SECOND WHERE FIRST.STIP=SECOND.STIP AND FIRST.SFAM < SECOND.SFAM;

Результат цього запиту буде такою:

Гриценко

Котенко

0.00

Нагорний

Поляків

25.50

Зокрема, Гриценко передує Котенко за абеткою, тому комбінація задовольняє обом умовам предиката і з'являється у висновку. Якщо та ж сама комбінація з'являється в зворотному порядку, тобто Котенко в псевдонімі першої таблиці порівнюється з Гриценко в другій таблиці, то друга умова не виконується. З аналогічної причини у висновок не попадає порівняння із самим собою. Якщо ж виникла необхідність порівняння рядків з ними ж, то в запитах варто використовувати < = замість <.

Таким чином, можна використовувати цю особливість SQL для перевірки визначених видів помилок. Наприклад, якщо вважати, що навчальний предмет може вести тільки один викладач, те всякий раз у таблиці PREDMET необхідна перевірка на цю умову. При цьому щораз, коли код предмета з'являється в таблиці PREDMET, він повинний збігатися з відповідним номером викладача. Наступна команда буде визначати будь-як непогодженості в цій області:

SECOND.PNUM, SECOND.TNUM FROM PREDMET FIRST, PREDMET SECOND WHERE FIRST.PNUM = SECOND.PNUM AND FIRST.TNUM <> SECOND.TNUM;

Висновку для даного приклада не буде, тому що даних, що задовольняють предикату в розглянутій таблиці немає.

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

Більш того, допускається використовувати будь-як число псевдонімів для однієї таблиці в запиті, хоча використання більш двох в одній пропозиції SELECT часто буде надмірністю. Наприклад, для призначення стипендії на наступний семестр необхідно переглянути Всі варіанти комбінацій студентів з різними розмірами стипендії: 25.50, 17.00 і 0.00 у.е. Тоді такий запит буде виглядати в такий спосіб:

SELECT FIRST.SFAM, SECOND.SFAM, THIRD.SFAM FROM STUDENTS FIRST, STUDENTS SECOND,STUDENTS THIRD WHERE FIRST.STIP = 25.50 AND SECOND.STIP = 17.00 AND THIRD.STIP = 0.00;

Висновок для цього запиту випливає нижче:

SFAM

SFAM

SFAM

Поляків

Старова

Гриценко

Поляків

Старова

Котенко

Нагорний

Старова

Гриценко

Нагорний

Старова

Котенко



Індекси


Індексом прийнято називати упорядкований список полів іл груп полів у таблиці. Таблиці можуть мати величезна кількість записів, при цьому, як було замічено вище, записи не знаходяться в якому-небудь визначеному порядку, тому на їхній пошук за зазначеним критерієм може знадобитися досить тривалий час.

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

Індекси - це корисний інструмент, що широко застосовується у всіх сучасних СУБД. Коли створюється індекс у поле, БД запам'ятовує відповідний порядок Всіх значень цього полючи в області пам'яті. Про переваги індексів може говорити наступне: припустимо, що таблиця STUDENTS має кілька тисяч записів, і необхідно знайти студента з конкретним номером студентського квитка. Т.к. запису в таблиці не упорядковані, те СУБД буде змушена переглядати всю таблицю, рядок за рядком, перевіряючи щораз значення полючи SNUM на рівність шуканому значенню. При наявності індексу в поле SNUM, система могла б знайти шуканий номер прямо в цьому упорядкованому індексі, і дати інформацію про те, як знайти правильний рядок таблиці.

В індексів є і недоліки. У той час як індекс значно поліпшує ефективність запитів, використання індексу трохи сповільнює операції модифікації, особливо такі, як INSERT і DELETE. Крім того, сам індекс займає місце на пристрої збереження інформації.

Звідси випливає, що при створенні таблиці необхідно прийняти зважене рішення, індексувати її чи ні. Індекси можуть складатися відразу з декількох полів, при цьому перше поле є як би головним, друге упорядковується усередині першого, третє усередині другого, і т.д.

Синтаксис команди для створення індексу наступний:

CREATE INDEX ON

( [,]...);

Зрозуміло, що таблиця, для якої створюється індекс, повинна вже існувати і містити імена индексируемых полів. При цьому ім'я індексу не може бути використане для чого-небудь іншого в БД і SQL сам вирішує, коли він необхідний для роботи і використовує його автоматично.

Приведемо наступний приклад. Очевидно, що в таблиці STUDENTS одним з найбільше часто уживаних може бути індекс по полю, що містить прізвище студента. Тоді команда для створення такого індексу буде наступною:

CREATE INDEX SFAMIDX ON STUDENTS (SFAM);

Після цього при пошуку інформації про студентів, СУБД буде знаходити її дуже швидко. Однак, при створенні цього індексу, йому не запропонована унікальність, незважаючи на те, що це є одним з його призначень.

Для створення унікальних (не утримуючих повторюваних значень) індексів використовують ключове слово UNIQUE у команді CREATE INDEX. Фактично такий індекс буде первинним ключем таблиці. Наприклад, для таблиці STUDENTS поле SNUM підходить у якості первинного ключа, і він стане першим кандидатом для унікального індексу. Створити його можна командою:

CREATE UNIQUE INDEX SNUMIDX ON STUDENTS (SNUM);

Команда не буде виконана, якщо в поле SNUM маються неунікальні значення. Тому рекомендується створювати індекси відразу після того, як створена таблиця і до введення в неї яких-небудь значень. Цікава і така особливість унікального індексу: якщо в ньому використовується більш одного полючи (тобто він є комбінацією значень), те, узагалі говорячи, кожне з цих полів може і не бути унікальним.

Оскільки основною ознакою індексу є його ім'я, то по його імені він може бути ідентифікований і вилучений. Звичайно користувачі не знають про існування індексу, а SQL автоматично визначає - чи дозволено користувачу використовувати індекс, і, якщо так, те дозволяє його вживання.

Однак, для видалення індексу, необхідно знати його ім'я. З обліком цього команда для видалення має наступний синтаксис:

DROP INDEX ;

Наприклад, для видалення створеного індексу на прізвище студента, можна скористатися наступною командою:

DROP INDEX SFAMIDX;

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


Порядок роботи:
  1. Створити базу даних відповідно до варіанту завдання (кількість таблиць не менше 3).

Варіанти завдання (тип бази даних) згідно номеру бригади:
  1. Бібліотека
  2. Автосалон
  3. Музичний магазин
  4. Чемпіонат країни по футболу
  5. Комп’ютерні магазини міста
  6. Склад оргтехніки.
  1. Перевірити створену базу даних на працездатність.
  2. Провести основні операції з базою даних
    1. добавлення запису;
    2. перегляд даних;
    3. видалення запису;
    4. сортування даних.
  1. Створити індекси в базі даних та повторити дії п.3 вже з проіндексованими таблицями, використовуючи записи одразу з декількох таблиць.


Контрольні питання

1.

ЛІТЕРАТУРА


Основна література:
  1. Мейер Д. Теория реляционных баз данных. – М.: Мир, 1987. – 608 с.
  2. Нейлон К. Как построить свою экспертную систему. – М.: Энергоатомиздат, 1991.
  3. Четвериков В.Н. и др. Базы и банки данных. – М.: Высш. шк., 1987.
  4. Дубовой В.М., Квєтний Р.Н. Програмування комп'ютеризованих систем управління та автоматики. – В.: ВДТУ, 1997.
  5. Бондарев В.М. и др. Основы программирования. – Харьков: Фолио, 1997.
  6. Уотермен Д. Руководство по экспертным системам. – М.: Мир, 1989.


Додаткова література:
  1. Романюк О.Н., Савчук Т.О. Організація баз даних і знань: Навчальний посібник/Міністерство освіти і науки України. – Вінниця: ВДТУ, Ч.2. – 2002. – 131 с.
  2. Пасічник В.В., Резніченко В.А. Організація баз даних та знань:Підручник/ за ред. М.З. Згуровського. – К.: Видавнича група ВНВ, 2006. – 384 с.
  3. Методичні вказівки до виконання лабораторних робіт з дисципліни «Організація баз даних і знань» для студентів напряму підготовки 0804 – «Компютерні науки» спеціальності 7.08.0403 «Програмне забезпечення автоматизованих систем» денної та заочної форми навчання/ ВНТУ; Укладач: О.Н. Романюк, А.В.Денесюк. – Вінниця: ВНТУ, 2007. – 57 с.
  4. Месюра В.І., Яровий А.А., Арсенюк І.Р. Експертні системи: Навчальний посібник/ ВНТУ. – Вінниця: ВНТУ, Ч.1. – 2006 . – 114 с.
  5. Гаврилова Т. А., Хорошевский В. Ф. Базы знаний интеллектуальных систем. Учебник. — СПб.: Питер, 2000.
  6. Дж. Джарратано, Г. Райли. Экспертные системы: принципы разработки и программирование — М. : «Вильямс», 2006. — 1152 стр.
  7. Питер Джексон Введение в экспертные системы. — 3-е изд. — М.: «Вильямс», 2001. — С. 624.