2.5. Інтервали
Інтервал являє собою різницю між двома значеннями типу дата-час. SQL підтримує два типи інтервалів: рік-місяць і день-час. Інтервал типу рік-місяць – це кількість років і місяців між двома датами, а інтервал день-час – кількість днів, годин, хвилин і секунд між двома моментами в межах одного місяця.
Інтервал часу можна задати двома способами: у вигляді початкового і кінцевого моментів або у вигляді початкового моменту і тривалості, наприклад:
□ (TIME '12: 25:30 ', TIME' 14: 30: 00 ') – інтервал, заданий початковим і кінцевим моментами;
□ (TIME '12: 45:00 ', INTERVAL '5' HOUR) - Інтервал, заданий початковим моментом і тривалістю в годинах. Щоб задати значення типу інтервал, використовується такий синтаксис:
INTERVAL 'довжина' YEAR | MONTH | DAY | HOUR | MINUTE | SECOND
Тут довжина – довжина інтервалу, після якої вказується одиниця вимірювання (можливі значення вказані через вертикальну межу):
YEAR – рік;
MONTH – місяць;
DAY – день;
HOUR – годину;
MINUTE – хвилина;
SECOND – секунда.
Наприклад, для завдання інтервалу довжиною 15 днів слід використати вираз INTERVAL '5' DAY.
2.6. Спеціальні типи даних
До спеціальних типів даних відносяться наступні типи:
□ ROW – запис;
□ ARRAY – масив;
□ MULTISET – мультимножина.
Використання цих типів даних порушує принцип, згідно з яким таблиці реляційної бази даних повинні знаходитися в першій нормальній формі.
Тип ROW (запис) дозволяє оголосити набір полів (запис) у якості значення стовпця таблиці. Таким чином, рядки таблиць можуть містити записи.
У багатьох базах даних є таблиці, які містять відомості про адреси. Адреса, як відомо, складається з декількох елементів, таких як поштовий, індекс, країна, місто, вулиця і т. д. Якщо в таблиці завести один символьний стовпець Адреса, в якому помістити всі елементи адреси просто як символьний рядок, то подальша робота з окремими елементами адреси буде досить клопіткою справою (вам доведеться використовувати функції розбору рядків). Тому на практиці для адреси зазвичай заводять кілька стовпців, по одному на кожен елемент (наприклад, стовпці Місто, Вулиця і т. д.). Якщо ж використовувати тип ROW, то можна зберігати всі елементи адреси як значення одного стовпця. У наступному прикладі спочатку на основі типу ROW створюється тип addr, а потім він призначається стовпцю Адреса при створенні таблиці клієнти:
CREATE ROW TYPE addr (Postcode VARCHAR (9), City VARCHAR (30), Street VARCHAR (30), House VARCHAR (10));
CREATE TABLE Клієнти(ID_кліента INTEGER PRIMARY KEY, Ім'я VARCHAR (25), Адреса addr, Телефон VARCHAR (15));
Тип даних ROW з'явився вперше в SQL: 1999, а раніше без нього чудово обходилися.
Тип ARRAY (масив) також вперше з'явився в SQL: 1999 і порушує принцип першої нормальної форми, але трохи по іншому, ніж тип ROW. Тип ARRAY дає можливість одному зі звичайних типів мати безліч значень усередині значення одного табличного стовпця. Наприклад, клієнт може мати кілька номерів телефонів і ви можете побажати зберігати їх всї як одне багатозначне значення єдиного стовпця телефон, а не як звичайні значення декількох стовпців телефон1, телефон2 і т. п. Ось приклад, в якому кожна клітинка стовпця телефон може містити до трьох номерів телефону:
CREATE TABLE Клієнти(Id_кліента INTEGER PRIMARY KEY, Ім'я VARCHAR (25), Адреса addr, Телефон VARCHAR (15) ARRAY [3]);
Наступний SQL-вираз додає в таблицю клієнти новий запис і вводить в неї значення стовпців:
INSERT INTO Клієнти (Ім'я, Телефон)
VALUES ('Петров Петро Петрович', {'444-4444 ', '123-4567', '777-8899 '});
Тип даних MULTISET (мультимножина) з'явився вперше в SQL: 2003. Якщо масив – це впорядкована безліч елементів, однозначно пов'язаних з їх місцем у масиві засобами індексу, то мультимножина – неупорядкована сукупність елементів. Цей тип даних використовується дуже рідко.
