Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Konspekt_lektsiy_BD_amp_amp_SD

.pdf
Скачиваний:
29
Добавлен:
10.02.2016
Размер:
1.41 Mб
Скачать

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

51

 

 

'{ значення_1 символ значення_2 символ ... }'

або

ARRAY[значення_1 символ значення_2 символ ... ],

де символ — символ-роздільник.

Для розділення стандартних типів використовується кома ‘,’, виключаючи тип BOX, для якого використовується символ ‘;’. Кожний елемент значення — це константа або підмасив. Наприклад, представлення масиву в операціях внесення даних може бути таким:

'{10000, 10000, 10000, 10000}';

'{{"Meeting", "Lunch"}, {"Training", "Presentation"}}');

або таким:

ARRAY[10000, 10000, 10000, 10000], ARRAY[['Meeting', 'Lunch'], ['Training', 'Presentation']]);

Ефективність використання масиву визначається можливістю доступу до елементу за його індексом. Перший елемент масиву має індекс 1, який вказується в квадратних дужках: [1]. Якщо за вказаним індексом елемент відсутній, повертається NULL. При використанні багатовимірного масиву за першим індексом перераховуються додаткові індекси, наприклад [1][2]. Також підтримуються зрізи даних, коли номери індексів визначаються через інтервал, наприклад [1:3].

Існують три типи модифікації елементів масиву:

повна модифікація — весь зміст масиву замінюється новими даними, які задано масивом-константою;

модифікація зрізу — модифікується лише інтервальна підмножина елементів; модифікація елементу — модифікується окремий елемент за індексом.

Приклади зміни елементів масиву:

UPDATE

Sal_emp

SET

Pay_by_Quarter = '{25000,25000,27000,27000}'

WHERE

Name = 'Carol';

UPDATE

Sal_emp

SET

Pay_by_Quarter = ARRAY[25000,25000,27000,27000]

WHERE

Name = 'Carol';

UPDATE

Sal_emp

SET

Pay_by_Quarter[1:2] = '{27000,27000}'

WHERE

Name = 'Carol';

UPDATE

Sal_emp

SET

Pay_by_Quarter[4] = 15000

WHERE

Name = 'Bill';

Для обробки масивів СУБД PostgreSQL пропонує оператори та функції, представлені в наступних таблицях.

 

 

Таблиця 8 – Оператори обробки масивів

Оператор

Опис

Приклад використання

=

дорівнює

ARRAY[1,2,3] = ARRAY[1,2,3] = true

<>

не дорівнює

ARRAY[1,2,3] <> ARRAY[1,2,4] = true

<

менше ніж

ARRAY[1,2,3] < ARRAY[1,2,4] = true

>

більше ніж

ARRAY[1,4,3] > ARRAY[1,2,4] = true

<=

менше ніж або

ARRAY[1,2,3] <= ARRAY[1,2,3] = true

дорівнює

 

 

>=

більше ніж або

ARRAY[1,4,3] >= ARRAY[1,4,3] = true

дорівнює

 

 

@>

елементи одного масиву

ARRAY[1,4,3] @> ARRAY[3,1] = true

<@

містяться в другому

ARRAY[2,7] <@ ARRAY[1,7,4,2,6] = true

&&

перекриття

ARRAY[1,4,3] && ARRAY[2,1] = true

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

52

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Оператор

 

Опис

 

 

Приклад використання

||

 

конкатенація

 

 

ARRAY[1,2,3] || ARRAY[4,5,6] = {1,2,3,4,5,6}

 

 

 

ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] =

 

масивів

 

 

 

 

 

 

{{1,2,3},{4,5,6},{7,8,9}}

 

 

 

 

 

 

||

 

Включення

 

 

3 || ARRAY[4,5,6] = {3,4,5,6}

 

елементу до масиву

 

 

 

 

 

 

 

 

 

 

 

 

Таблиця 9 – Функції обробки масивів

 

 

 

 

 

 

Функція

 

 

 

Опис

Приклад

 

 

 

 

 

 

 

використання

array_append (anyarray,

 

Додати елемент до масиву

array_append(ARRAY[

anyelement)

 

1,2], 3) = {1,2,3}

 

 

 

 

array_cat (anyarray, anyarray)

 

Об`єднати два масиви

array_cat(ARRAY[1,2,

 

3], ARRAY[4,5])= {1,2,3,4,5}

 

 

 

 

 

 

 

array_ndims (anyarray)

 

Отримати розмірність маси-

array_ndims(ARRAY[[1,2,3],

 

ву

 

[4,5,6]])=2

 

 

 

 

 

array_dims (anyarray)

 

Отримати текстове предста-

array_dims(ARRAY[[1,2,3],

 

влення розмірності масиву

[4,5,6]]) = [1:2][1:3]

 

 

 

 

array_fill (anyelement, int[], [,

 

Отримати масив з ініціаліза-

array_fill(7, ARRAY[3],

 

int[]])

 

цією елементів

ARRAY[2]) =

 

 

[2:4]={7,7,7}

 

 

 

 

 

 

 

array_length (anyarray, int)

 

Отримати розмірність маси-

array_length(array[1,2,

 

 

 

 

ву вказаного рівня

3], 1) = 3

array_lower (anyarray, int)

 

Отримати найменшу розмір-

array_lower('[0:2]=

 

 

 

 

ність вказаного рівня масиву

{1,2,3}'::int[], 1) = 0

array_prepend (anyelement,

 

Додати елемент в початок

array_prepend(1, ARRAY[2,3])

anyarray)

 

масиву

 

= {1,2,3}

array_to_string (anyarray,

 

Отримати текстову строку з

array_to_string(ARRAY[1, 2,

 

елементів масиву, викорис-

3], '~^~') =

 

text)

 

товуючи вказаний символ-

 

 

1~^~2~^~3

 

 

 

 

роздільник

 

 

 

 

 

 

 

array_upper (anyarray, int)

 

Отримати найбільшу розмір-

array_upper(ARRAY[1,

 

 

 

 

ність вказаного рівня масиву

2,3,4], 1) = 4

 

 

 

 

Отримати масив з текстової

String_to_array('xx~^~yy~^~zz

string_to_array (text, text)

 

строки, використовуючи вка-

', '~^~') =

 

 

 

 

заний символ-роздільник

{xx,yy,zz}

unnest(anyarray)

 

Перетворити масив в рядки

Unnest(ARRAY[1,2])

 

 

 

 

таблиці

 

 

Одним з найзручніших серед додаткових структур даних діалекту PostgreSQL є такий елемент БД, як послідовність (sequence). Цей елемент є ще одним варіантом одноіменного складеного типу (див. розділ „Структури даних“, стор. 5), який містить впорядкований числовий ряд з фіксованою різницею між його елементами (фіксованим кроком). В PostgreSQL ця структура реалізується у вигляді однорядкової таблиці, найважливішими полями якої є

Ім’я,

Крок

(або

Прирощення),

Мінімальне_значення,

 

Максимальне_значення,

Початкове_значення,

Поточне_значення.

Для оперування послідовностями в цьому діалекті SQL використовується низка команд і функцій. Перш за все, це генератор послідовності, який реалізується командою створення:

CREATE SEQUENCE назва;

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

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

53

 

 

ртежу якої за замовчуванням будуть записані такі значення: в поле Ім’я — назва, поля Крок,

Мінімальне і Початкове_значення отримають значення 1, а поле Максимальне_значення

значення (263 1)або 9 223 372 036 854 775 807, що можна перевірити командою

SELECT * FROM назва;

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

Якщо необхідно задати інші характеристики послідовності, то для цього використовується більш розширений синтаксис команди CREATE SEQUENCE:

CREATE [TEMP[ORARY]] SEQUENCE назва [INCREMENT [BY] прирощення]

[MINVALUE мінімальне_значення | NO MINVALUE] [MAXVALUE максимальне_значення | NO MAXVALUE] [START [WITH] початкове_значення];

Необхідно мати на увазі, що при негативному значенні прирощення поля Максимальне і Початкове_значення за замовчуванням отримають значення (1) , а поле Мінімаль-

не_значення (263 +1).

Функція NEXTVAL(назва) змінює поточне значення послідовності „назва“ на значення прирощення та повертає нове значення у вигляді величини типу integer. Саме ця функція ви-

користовується при автоматичній генерації ідентифікаторів сутностей.

Функція CURRVAL(назва) повертає значення, отримане функцією NEXTVAL останнім для послідовності „назва“ у поточній сесії. Якщо функція NEXTVAL ніколи не викликалась для цієї послідовності в цій сесії, то буде згенеровано повідомлення про помилку.

Функція LASTVAL повертає значення, яке найбільш часто поверталось функцією NEXTVAL у поточній сесії. Ця функція ідентична CURRVAL, за винятком того, що замість використання імені послідовності як аргументу вона витягує значення останньої послідовності, для якої була використана функція NEXTVAL у поточній сесії. Якщо функція NEXTVAL ніколи не викликалася в цій сесії, то буде згенеровано повідомлення про помилку.

SETVAL(назва, нове_значення) виконує „скидання“ лічильника послідовності „назва“. Це означає, що при наступному виклику функція NEXTVAL поверне та/або згенерує і поверне значення (нове_значення + 1), а функція CURRVAL — значення нове_значення.

Для видалення послідовності або декількох послідовностей одночасно використовується команда:

DROP SEQUENCE назва1 [,назва2, ...];

Таблиці

Для визначення таблиць МВД SQL має такі команди: CREATE TABLE — для створення таблиці, ALTER TABLE — для модифікації таблиці і DROP TABLE — для її знищення.

Найбільш простий варіант команди створення таблиці:

CREATE TABLE таблиця

 

(поле

тип_поля

[DEFAULT значення][,

поле

тип_поля

[DEFAULT значення][,…]]);

Операнди таблиця і поле визначають імена відповідних елементів. Як тип_поля вказується або ім’я домену, або один з базових типів. Причому будь-який числовий тип може вказуватися без розміру, який буде прийнятий за замовчуванням, а параметр DEFAULT скасовує

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

54

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

 

 

аналогічне значення домену. Приклад:

CREATE TABLE

Student

 

(SeсondName

CHAR(30),

 

FirstName

CHAR(20),

 

Patronymic

CHAR(30),

 

SNum

SMALLINT,

 

Spec

CHAR(2)

DEFAULT ‘ОП’,

GNam

INTEGER,

 

Address

CHAR(30),

 

Email

CHAR(30));

 

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

лошення типу:

поле тип_поля обмеження

Наприклад, якщо для стовпця не вказане значення за замовчуванням і при додаванні кортежу (рядка) опущене значення відповідного атрибута, то до комірки таблиці буде введене значення NULL.

Якщо така ситуація для даного поля неприпустима, то в обмеження необхідно ввести оператор NOT NULL. Наприклад:

… SecondName

char(30)

NOT NULL,

FirstName

char(20)

NOT NULL, …

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

Іншим варіантом є обмеження за значенням. Для цього у визначенні поля використовується оператор CHECK. Наприклад, може виконуватися перевірка значення на відповідність діапазону. Наприклад:

CREATE TABLE Rating

 

 

(Kod

INTEGER

CHECK(Kod > 0)

NOT NULL,

DKod

INTEGER

CHECK(Kod > 0)

NOT NULL,

Mark

INTEGER

DEFAULT 0

CHECK(Mark >= 0 AND Mark <= 100),

MDate

DATE

NOT NULL);

 

Крім того, перевірка може виконуватися і на належність значення заданій множині: … Spec char(2) CHECK(Spec IN(‘АП’, ‘ОС’, ‘АМ’, ‘АС’, ‘ОМ’, ‘ОІ’)), …

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

CREATE TABLE таблиця

(поле

тип_поля

[обмеження_C][,

поле

тип_поля

[обмеження_C][,…]],

обмеження_Т);

 

Наприклад (змінимо попередній приклад).

CREATE TABLE Rating

 

(Kod

INTEGER

NOT NULL,

DKod

INTEGER

NOT NULL,

Mark

INTEGER

DEFAULT 0,

CHECK(Kod > 0 AND Dkod > 0 AND (Mark BETWEEN 0 AND 100)) ,

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

55

 

 

 

MDate

DATE NOT NULL);

 

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

Обмеження за значенням відхиляють операцію відновлення, якщо значення атрибутів кортежу не відповідають умовам обмеження.

Якщо ми вже торкнулися перевірки значень і використовували в прикладах низку операторів, застосовуваних при перевірці значень, зробимо відступ від визначення таблиць і розглянемо

Логічні оператори

Результатом їхньої дії буде значення „істина“ або „неправда“. До них відносяться оператори порівняння, булеві оператори і спеціальні оператори.

Оператори порівняння аналогічні тим, що застосовуються чи існують у більшості мов програмування: =, >, <, >=, <=, <>.

Їхнє використання також аналогічне більшості мов.

Булеві оператори в SQL реалізують 3 операції булевої алгебри, що утворюють повний базис: AND, OR, NOT.

Спеціальних операторів у SQL сім: IN, BETWEEN, LIKE, IS NULL, EXISTS, ANY (SOME) та ALL. Проте три останні оператори використовуються тільки з вкладеними підзапитами, тому будуть розглянуті у відповідному параграфі (стор. 91) розділу „Мова маніпулювання даними (ММД, DML) SQL“.

Оператор IN цілком визначає деяку множину значень. Наприклад:

… Spec CHAR(2) CHECK(Spec IN(‘АП’, ‘АМ’, ‘АС’, ‘ОМ’, ‘ОІ’, ‘ОС’)), ...

Аналогом цього була б досить складна конструкція типу:

… Spec CHAR(2) CHECK(Spec = ‘АП’ OR Spec = ‘АМ’ OR … OR Spec = ‘ОС’), …

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

… SecondName char(30) CHECK(SecondName BETWEEN ‘A’ AND ‘МАЛИЙ’), …

дозволить увести будь-яке прізвище від А до М, точніше, до МАЛИЙ, але не дозволить, наприклад, МАЛАХОВ. Якщо необхідно виключити границі діапазону з числа припустимих значень, можна скористатися інструкцією такого вигляду:

… Mark

INTEGER CHECK((Mark BETWEEN 0 AND 100)

 

AND NOT Mark IN(0,100))…

Оператор LIKE застосовуваний тільки до символьних полів типу CHAR і VARCHAR і використовується для накладення шаблонів на рядки.

Для цього в операторі використовуються спеціальні символи-шаблони: символ „підкреслення“ (‘_’), що заміняє один будь-який символ, і символ „відсоток“ (‘%’), що заміняє символьний рядок довільної довжини. Наприклад, шаблону „д_м“ відповідають рядки „дам“, „дим“, „дум“ тощо, а шаблону „%M%B“ в полі прізвища

… SecondName char(30) CHECK(SecondName LIKE ‘%M%B’), …

відповідають і МАЛАХОВ, і ЛОМОНОСОВ, але не відповідає, наприклад, МАЛИНОВСЬКИЙ. Для того, щоб у шаблоні оператора LIKE використовувати і самі символи ‘_’ та ‘%’

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

56

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

 

 

необхідно будь-який символ, наприклад слеш ‘/’, визначити як Escape-символ і випереджати їм кожний з керуючих, у тому числі і самого себе:

… SpName

char(60) CHECK(SpName LIKE ‘%/_%/%%//%’ ESCAPE ‘/’), …

У цьому прикладі команда CHECK пропустить будь-які символьні рядки, в яких у будь-якому місці, але послідовно зустрічаються символи ‘_’, ‘%’ і ‘/’. Наприклад:

„У спец_фонд виділити 15% доходу, але не більш 1000 грн/місяць“

Оператор IS NULL використовується в командах ММД для визначення кортежів, у яких відсутні значення тих чи інших атрибутів. Наприклад:

… Patronymic IS NULL …

відповідає кортежам, у яких відсутнє по-батькові. Зворотний йому оператор

IS NOT NULL дозволяє відсіяти відсутні значення.

В діалекті SQL СУБД PostgreSQL, згідно з розширенням, введеним в стандарті SQL’99, були додані

Регулярні вирази.

Регулярні вирази застосовують для:

пошуку у рядку підрядка, який задовольняє шаблону регулярного виразу;

пошуку та заміни у рядку підрядка, який задовольняє шаблону регулярного виразу;

перевірки на відповідність заданого рядка шаблону;

добування з рядка підрядка, який задовольняє шаблону регулярного виразу. Синтаксис регулярних виразів визначений стандартом POSIX (Portable Operating

System Interface for Unix - переносимий інтерфейс операційних систем Unix). В стандарт SQL’99 було додано можливість використання регулярних виразів через оператор SIMILAR TO як розвиток оператора LIKE:

рядок SIMILAR TO шаблон;

рядок NOT SIMILAR TO шаблон;

Як і оператор LIKE, оператор SIMILAR TO повертає істину, якщо вміст всього рядку відповідає вмісту шаблону.

Шаблон оператора SIMILAR TO крім символів ‘%’, ‘_’ використовує додаткові симво-

ли:

символ ‘|’ позначає альтернативи елементів;

символ ‘?’ позначає повторення попереднього елемента 0 або 1 раз;

символ ‘*’ позначає повторення попереднього елемента 0 або більше раз;

символ ‘+’ позначає повторення попереднього елемента 1 або більше раз;

символи ‘{m}’ позначають повторення попереднього елемента рівно m раз;

символи ‘{m,}’ позначають повторення попереднього елемента m або більше раз;

символи ‘{m, n}’ позначають повторення попереднього елемента від m до n раз;

символи ‘( )’ групують елементи в один логічний блок;

символи ‘[ ]’ визначають клас символів через перерахування припустимих символів або

з використанням символу діапазону ‘-’; Якщо вказані символи необхідно використовувати в шаблоні як звичайні, перед ними

використовують символ ‘\’. Також потрібно пам’ятати, що в шаблоні всі символи ‘\’ потрібно також дублювати, тобто писати як ‘\\’.

Розглянемо кілька прикладів демонстрації можливостей оператору SIMILAR TO у порівнянні з оператором LIKE.

Для пошуку рядків, в яких назва вулиці з адреси студента не містить цифр, можна виконати запит:

SELECT * FROM Student WHERE (Address).Street NOT SIMILAR TO ‘%[0-9]+%’;

В шаблоні регулярного виразу визначено новий клас символів як діапазон припустимих

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

57

 

 

цифр, кількість яких від 1 та більше. Якщо виключити оператор NOT, буде отримано рядки, в яких присутня будь-яка кількість цифр. Шаблон ‘[0-9]+’ забезпечить отримання рядків, в яких всі символи — цифри.

Для пошуку рядків, в яких адреса електронної поштової скриньки студента містить 3 або 4 латинські букви, після яких іде 5 цифр, можна виконати запит:

SELECT * FROM Student WHER Email SIMILAR TO ‘%[a-z]{3,4}[0-9]{5}%’

Для пошуку рядків, в яких зміст поштових повідомлень містить дійсні числа, наприклад 12.24 або .12, можна виконати запит:

SELECT * FROM Letters WHERE Content SIMILAR TO ‘%[0-9]?.[0-9]+%’

Для пошуку рядків, в яких зміст поштових повідомлень містить час у форматах типу „9:15 am“ або „12:25 pm“, використовується запит:

SELECT * FROM Letters

WHERE Content SIMILAR TO ‘%(1[012]|[1-9]):[0-5][0-9]? +(am|pm)%’

Так як вказаний формат має два варіанти визначення цифр перед символом ‘:’, в шаблоні використовуються символи альтернативи та групування в один логічний блок.

Для пошуку рядків, в яких зміст поштових повідомлень містить час у форматах типу „01:10“ або „23:25“, можна виконати запит:

SELECT * FROM Letters

WHERE Content SIMILAR TO ‘%([01]?[0-9]|2[0-3]):[0-5][0-9]%’

Наступні два приклада ілюструють використання ESCAPE-символу для символівшаблонів оператору SIMILAR TO. Так, для пошуку рядків, в яких зміст поштових повідомлень містить телефонний номер у форматі (777) 777-77-77, можна виконати запит:

SELECT * FROM Letters

WHERE Content SIMILAR TO ‘%\\([0-9]{3,5}\\)[ ]+[0-9]{3}\\-[0-9]{2}\\-[0-9]{2}%’

Якщо необхідно шукати мобільний телефонний номер у форматі +38 (код) 777-77-77, де код може приймати значення 050, 063, 067 або 093 можна використати шаблон

‘%\\+38\\((050|063|067|093)\\) +[0-9]{3}\\-[0-9]{2}\\-[0-9]{2}%’

Для пошуку рядків, в яких зміст поштових повідомлень містить E-mail адресу, наприклад opu@opu.ua, використовується запит:

SELECT * FROM Letters

WHERE Content SIMILAR TO ‘%[a-z0-9._%-]+@[a-z0-9._%-]+\.[a-z]{2,4}%’

СУБД PostgreSQL також підтримує регулярні вирази через наступні оператори:

‘~’ пошук за шаблоном, який чутливий до регістру символів;

‘~ *’ пошук за шаблоном, який нечутливий до регістру символів;

‘! ~’ пошук по виключаючому шаблону, нечутливому до регістру символів;

‘! ~ *’ пошук по виключаючому шаблону, нечутливому до регістру символів.

Ці оператори повністю забезпечують стандарт POSIX. На відміну від оператора SIMI-

LAR TO, вони повертають істину, якщо шаблон регулярного виразу відповідає будь-якій частині рядка, тому початковий та кінцевий символ ‘%’ в шаблоні використовувати нема потреби.

В POSIX регулярний вираз визначається як один або декілька розділів, які відокремлені символом ‘|’, та встановлює відповідність між будь-якою частиною рядку і змістом одного з розділів. Розділ включає нуль або більше кількісних атомів або обмежень, які можуть бути зчеплені. Регулярний вираз встановлює відповідність з першим та наступними підрозділами, а порожній підрозділ відповідає порожньому рядку. Кількісний атом може супроводжуватися поодиноким кількісним показником. Без кількісного показника регулярний вираз шукає

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

58

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

 

 

відповідність одному атому, а з кількісним показником – декільком атомам. Атом може приймати одну з форм:

символи ‘(re)’, де ‘re’ – будь-який регулярний вираз;

символ ‘.’ (крапка), що відповідає будь-якому символу;

символи ‘[chars]’, де ‘chars’ – будь-яка послідовність символів;

символи ‘\kkk’, де ‘kkk’ – ASCII-код;

символи ‘\c’, де ‘c’ – спеціальний символ. Наприклад: ‘\d’ – тільки цифри, ‘\s’ – пробіл, ‘\w’ – букви та символ ‘_’, ‘\D’ – протилежність ‘\d’, ‘\S’ – протилежність ‘\s’, ‘\W’ – протилежність ‘\w’, ‘\n’ – символ переходу на новий рядок, ‘\r’ – символ повернення каретки, ‘\t’ – символ табуляції;

символ ‘х’ – будь-який поодинокий символ;

символи ‘\m’, де ‘m’ – позитивне ціле для визначення атому через його зворотне посилання на m-й атом у формі ‘(re)’, що найчастіше використовується для визначення підрядків, які послідовно повторюються;

символи ‘re1(?=re2)’ забезпечують випереджаючий перегляд підрядка, який відповідає атому ‘re2’ та знаходиться після підрядка, який відповідає атому ‘re1’;

символи ‘re1(?!re2)’ забезпечують випереджаючий перегляд підрядка, який протиречить атому ‘re2’ та знаходиться після підрядка, який відповідає атому ‘re1’.

Всередині символів квадратних дужок заборонено використовувати символи ‘\D’, ‘\S

та ‘\W’.

На жаль, символи ‘\w’ та ‘\D’ коректно працюють з буквами кирилиці не у всіх кодуваннях, тому для врахування букв кирилиці необхідно використовувати символи [chars], наприклад, символи [А-Яа-я].

Також потрібно пам’ятати, що в шаблоні всі символи ‘\’ потрібно дублювати, тобто писати як ‘\\’.

Кількісні показники, як і для оператора SIMILAR TO, можуть бути представлені наступними формами: символ ‘?’, символ ‘*’, символ ‘+’, символи ‘{m}’, символи ‘{m,}’ та симво-

ли ‘{m, n}’.

Для пошуку рядків, в яких прізвище студента містить дві та більше однакових латинських букв або букв кирилиці, використовується запит:

SELECT * FROM Student WHERE SecondName ~ '([a-zA-Zа-яА-Я]+)\\1';

При обробці регулярного виразу вся група символів між круглими дужками помічається як змінна $1. Коли зустрічається \1, це визначається як посилання на значення змінної $1, тобто повтор букви.

Для пошуку рядків, в яких вміст поштових повідомлень містить три та більше однакових слів, що повторюються, використовується запит:

SELECT * FROM Letters WHERE Content ~ '([a-zA-Zа-яА-Я]+)(\\s+)\\1\\2\\1';

При обробці регулярного виразу вся група символів між круглими дужками помічається як змінна $1. Наступний пропуск визначається наступною групою в круглих дужках та помічається як змінна $2. Коли зустрічається \1, це визначається як посилання на значення змінної $1, тобто повтор слова. Змінна $2 еквівалентна одному та більше пропусків, а змінна $1 знову посилається на перше слово, тобто третій повтор слова.

При встановлені відповідності між шаблоном і рядком визначається максимальна кількість символів рядка, які збігаються з символами шаблону. Для визначення максимальної кількості символів рядка до символів кількісних показників необхідно додати символ ‘?’.

Обмеження регулярних виразів визначаються символами:

символ ‘^’ встановлює відповідність між шаблоном та символами рядку тільки на його початку;

символ ‘$’ встановлює відповідність між шаблоном та символами рядку тільки наприкінці рядка;

символ ‘\A’ встановлює відповідність між шаблоном та символами рядку тільки на його

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

59

 

 

початку при наявності декількох рядків;

символ ‘\m’ встановлює відповідність між шаблоном та символами тільки на його початку слова;

символ ‘\M’ встановлює відповідність між шаблоном та символами тільки наприкінці слова;

символ ‘\y’ встановлює відповідність між шаблоном та символами тільки на початку або наприкінці слова;

символ ‘\Y’ встановлює відповідність між шаблоном та символами, які не є початковими або кінцевими;

символ ‘\Z’ встановлює відповідність між шаблоном та символами рядку тільки наприкінці рядка при наявності декількох рядків.

Для пошуку рядків, в яких ім`я студента містить у першому символі ‘А’ або в останньому символі ‘с’ використовується запит:

SELECT * FROM Student WHERE SecondName ~ ‘(^А|с$)’;

Для добування підрядку, що задовольняє шаблону регулярного виразу, з рядка використовується функція SUBSTRING(string from pattern).

Якщо в шаблоні присутні круглі дужки, то повертається підрядок по шаблону усередині дужок.

Наприклад, у результаті виконання функції

SUBSTRING(‘ E-mail my@ukr.net ‘ FROM ‘[a-z0-9._%-]+@[a-z0-9._%-]+\.[a-z]{2,4}’);

буде виділений підрядок „my@ukr.net“.

Якщо ж у шаблон включити круглі дужки, то функція

SUBSTRING(‘ E-mail my@ukr.net ‘ FROM ‘([a-z0-9._%-]+)@[a-z0-9._%-]+\.[a-z]{2,4}’)

виділить підрядок „my“.

Для добування зі змісту поштових повідомлень підрядків, які містять дві цифри, що слідують за двома будь-якими символами, використовується запит:

SELECT SUBSTRING(Content FROM ‘(..[0-9]{2})’)

FROM Letters WHERE Content SIMILAR TO ‘%([0-9]{2})%’;

Для добування зі змісту поштових повідомлень підрядків, які містять час у форматах типу „9:15 am“ або „12:25 pm“, використовується запит:

SELECT SUBSTRING (Content FROM ‘((1[012]|[1-9]):[0-5][0-9]? (am|pm))’)

FROM Letters WHERE Content SIMILAR TO ‘%(1[012]|[1-9]):[0-5][0-9]? (am|pm)%’

Для добування зі змісту поштових повідомлень підрядків, які містять телефонні номери у форматі (777) 777-777-77, використовується запит:

SELECT SUBSTRING(Content FROM ‘(\\([0-9]{3,5}\\)[ ]+[0-9]{3}\\-[0-9]{2}\\-[0-9]{2})’) FROM Letters WHERE Content SIMILAR TO ‘%\\([0-9]{3,5}\\)[ ]+[0-9]{3}\\-[0-

9]{2}\\-[0-9]{2}%’

Для пошуку та заміни в рядку source підрядку, що задовольняє шаблону регулярного виразу pattern у рядку, на підрядок replacement використовується функція

REGEXP_REPLACE(source, pattern, replacement [, flags]).

У рядку шаблона pattern припустимі усі раніше описані метасимволи.

Рядок replacement може включати шаблон ‘\n’, де ‘n’ приймає значення від 1 до 9 і визначає n-ий дужковий підвираз шаблону, який замінюється. Опція flags може приймати значення g, що вказує на заміну всіх збігів, а не тільки першого.

Наприклад, у результаті виконання функції

REGEXP_REPLACE(‘2+2=4’, ‘\\d’, ‘цифра’)

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

60

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних

 

 

замість першої двійки буде включений рядок ‘цифра’: цифра+2=4 У той же час, у результаті виконання функції

REGEXP_REPLACE (‘2+2=4’, ‘\\d’, ‘цифра’, ‘g’)

всі цифри будуть замінені рядком ‘цифра’: цифра+цифра=цифра При виконанні функції

regexp_replace(‘ d@9 dd’, ‘\\w@\\d’, ‘XY’, ‘g’)

буде виконана заміна підрядку d@9 на підрядок XY, у той час як при виконанні функції regexp_replace(‘ d@9 dd’, ‘\\w(@)\\d’, ‘X\\1Y’, ‘g’)

підрядок d@9 буде замінений на X@Y відповідно до елемента шаблону заміни \1, який посилається на перший дужковий підвираз.

Додаткові функції REGEXP_MATCHES, REGEXP_SPLIT_TO_TABLE і REGEXP_SPLIT_TO_ARRAY використовують регулярні вирази для формування з рядка множини підрядків.

Функція REGEXP_MATCHES(string, pattern [, flags ]) повертає з рядка string масив підрядків відповідно до шаблону pattern. Якщо шаблон містить дужкові підвирази, функція повертає масив, у якому n-й елемент визначений як результат відповідності рядка з n-м дужковим виразом. Значення опції flags еквівалентні функції REGEXP_REPLACE.

Функція REGEXP_SPLIT_TO_TABLE(string, pattern [, flags ]) повертає з рядка string

множину підрядків відповідно до шаблона pattern у вигляді роздільника між підрядками. Функція REGEXP_SPLIT_TO_ARRAY має той же синтаксис, але повертає масив підрядків.

Виконавши запит

SELECT REGEXP_MATCHES(‘Привіт Світ!’, ‘(Привіт) (Світ)’);

дістаємо масив підрядків {‘Привіт’, ‘Світ’}. Виконавши запит

SELECT REGEXP_MATCHES(‘привітсвітпрощавайсвіт’, ‘(п[^с]+)(с[^п]+)’,’g’);

одержуємо два масиви підрядків {‘привіт’, ‘світ’}, {‘прощавай’, ‘світ’}. Виконавши запит

SELECT REGEXP_SPLIT_TO_ARRAY(‘Как прекрасен этот мир! Посмотри!’, ‘\\s+’);

дістаємо масив підрядків {‘Как, прекрасен, этот, мир!’, ‘Посмотри!’} Виконавши запит

SELECT ch FROM REGEXP_SPLIT_TO_TABLE(‘Как прекрасен этот мир!’, ‘\\s+’) AS ch;

одержуємо відповідь у вигляді записів з підрядками у вигляді окремих слів: ‘Как, прекрасен, этот, мир!’

Виконавши запит

SELECT ch FROM REGEXP_SPLIT_TO_TABLE(‘Как прекрасен этот мир!’, ‘\\s*’) AS ch;

одержуємо відповідь у вигляді записів, які містять підрядки з одного символу: ‘К’, ‘а’, ‘к’, ‘ ’, ‘п’, ‘р’, ‘е’, ‘к’, ‘р’, ‘а’, ‘с’, ‘е’, ‘н’, ‘ ’, ‘э’, ‘т’, ‘о’, ‘т’, ‘ ’, ‘м’, ‘и’, ‘р’, ‘!’

Це всі логічні оператори SQL.

Повертаємося до визначення таблиць. Одним з варіантів обмежень як на стовпці, так і на таблиці є визначення ключів.

Потенційні ключі

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

Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

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