Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД SQL(засоби визначення даних).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
40.01 Кб
Скачать

1.2. Ddl: оператори створення представлень (запитів)

Представлення – це віртуальна таблиця, що сама по собі не існує, але для користувача виглядає таким чином, начебто вона існує. Представлення (view) – це таблиця, вміст якої береться з інших таблиць за допомогою запиту. При цьому нові копії даних не створюються

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

Коли вміст базових таблиць міняється, СУБД автоматично перевиконує запити, що створюють view, що приводить до відповідних змін у представленнях.

Представлення визначається за допомогою команди

      CREATE VIEW <ім'я_представлення> [<ім'я_стовпця>,...]

             AS <запит>

Повніший синтаксис речення CREATE VIEW має вигляд

CREATE VIEW ім'я_представлення

        [(стовпець[,стовпець] ...)]

        AS підзапит

        [WITH CHECK OPTION];

де: підзапит, що випливає за AS і є визначенням даного представлення, не виконується, а просто зберігається в каталозі;

необов'язкова фраза «WITH CHECK OPTION» (з перевіркою) указує, що для операцій INSERT і UPDATE над цим представленням повинна здійснюватися перевірка, що забезпечує задоволення WHERE фрази підзапита;

список імен стовпців повинний бути обов'язково визначений лише в тих випадках, коли:

а) хоча б один зі стовпців підзапиту не має імені (створюється за допомогою вираження, чи SQL-функції константи);

б) два чи більш стовпці підзапиту мають те саме ім'я;

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

При цьому повинні дотримуватися наступні обмеження:

  • представлення повинне базуватися на єдиному запиті (UNION не припустиме)

  • вихідні дані запиту, що формує представлення, повинні бути не упорядковані (ORDER BY не припустимо)

 

Наприклад, створимо представлення М'ясні_блюда

CREATE VIEW М'ясні_блюда

AS SELECT БЛ, Блюдо, В, Вихід

FROM    Блюда

WHERE  Основа = ‘М'ясо’;

яке може розглядатися користувачем як нова таблиця в базі даних.

 

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

  • Якщо представлення засноване на одній таблиці, зміни даних у ньому допускаються. При цьому змінюються дані в зв'язаній з ним таблиці.

  • Якщо представлення засноване більш ніж на одній таблиці, то зміни даних у ньому не допускаються, тому що в більшості випадків СУБД не може правильно відновити схему базових таблиць зі схеми представлення.

Знищення непотрібних представлень виконується за допомогою речення DROP VIEW (знищити представлення), що має наступний формат:

    DROP VIEW <ім'я_представлення>

 

2. Ddl: оператори створення індексів

Для ускорения поиска данных можно создавать индексы. Индекс - это системная таблица, построенная по значениям заданного столбца заданной таблицы. В нем размещается перечень уникальных значений указанного столбца таблицы со ссылками на те ее строки, где встречаются эти значения (структура, похожая на предметный указатель книги). Например, индекс, построенный для столбца Основа таблицы Блюда, будет содержать следующие сведения:

Значення стовпця

Рядки, в яких зустрічається таке значення

Кава

32

33

 

 

 

 

 

 

Крупа

20

21

 

 

 

 

 

 

Молоко

7

8

12

18

22

24

28

31

М'ясо

2

6

9

13

14

 

 

 

Овочі

1

3

17

23

15

 

 

 

Риба

4

5

10

11

 

 

 

 

Фрукти

25

26

27

29

30

 

 

 

Яйця

16

19

 

 

 

 

 

 

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

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

Для побудови індексу в SQL існує речення CREATE INDEX (створити індекс), що має формат

CREATE [UNIQUE] INDEX ім'я_індексу ON базова_таблиця

        (стовпець [[ASC] | DESC] [, стовпець [[ASC] | DESC]] ...);

де UNIQUE (унікальний) указує, що ніяким двом рядкам у індексованій базовій таблиці не дозволяється приймати те саме значення для індексованого стовпця (чи комбінації стовпців) у те саме час.

Наприклад, індекси для стовпців БЛ і Основа таблиці Блюда створюються за допомогою речень

CREATE UNIQUE INDEX Блюда_БЛ ON Блюда (БЛ);

CREATE INDEX Блюда_Основа ON Блюда (Основа);

            У великих (більш 1000 рядків) таблицях пошук індексованих значень виконується на порядок швидше, ніж пошук неіндексованих, а в дуже великих таблицях - на два-три порядків. Питання про кількість індексованих стовпців зважується, виходячи з того, наскільки часто передбачається модифікувати таблиці БД. Якщо база даних не повинна модифікуватися, то на це питання можна дати позитивна відповідь. Однак при видаленні чи додаванні рядка таблиці повинні бути перебудовані всі індекси, побудовані для її стовпців, а при зміні значення індексованого стовпця - індекс цього стовпця. Коли модифікується багато - кілька сотень (тисяч) рядків - і після модифікації кожного рядка перебудовуються всі її індекси, час модифікації може бути на порядок (кілька порядків) більше часу модифікації рядків з неіндексованими стовпцями. Тому перед модифікацією множини рядків таблиці доцільно знищити індекси її стовпців, що можна зробити за допомогою речення DROP INDEX (знищити індекс), що має наступний формат:

DROP INDEX ім'я_індексу;

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