В. М. Дубовой Укладач д т. н., проф
Вид материала | Документы |
- Р. А. Хальфин 08. 12. 2006 г. N 6530-рх методические рекомендации, 1062.91kb.
- Программа студенческой олимпиады мгмсу по стоматологии 30. 10., 33.94kb.
- М. А. Рыбалко (отв редактор), проф, 973.68kb.
- Реферат циклу підручників «Україна в світовій політиці», 148.74kb.
- Колективу авторів у складі: проф. Гаращенко Ф. Г., проф. Закусило О. К., проф. Зайченко, 259.94kb.
- Программа по курсу "Уголовное право" / Сост проф. Б. С. Волков, проф. И. Д. Козочкин,, 638.15kb.
- Квалификационные тесты по дерматовенерологии Москва, 2267.11kb.
- Інформаційні технології в журналістиці: вітчизняний І світовий досвід Київ 2002, 8272.38kb.
- И научные учреждения второе переработанное и дополненное издание, 8298.18kb.
- Программа учебного курса «Международное право» для студентов, 747.97kb.
Об'єднання таблиць
Вище було показано, що в многотабличном запиті можна поєднувати дані таблиць, однак цікаво і те, що та ж сама методика може використовуватися для об'єднання разом двох копій одиночної таблиці. Для об'єднання таблиці із собою бій можна зробити кожен рядок таблиці одночасно і комбінацією її із собою і комбінацією з кожним іншим рядком таблиці, а потім оцінити кожну комбінацію в термінах предиката. Це дозволяє легко створювати визначені види зв'язків між різними елементами усередині одиночної таблиці. Наприклад, допускається зобразити об'єднання таблиці із собою, як об'єднання двох копій однієї і тієї ж таблиці, причому вона насправді не копіюється, але 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