- •Тема 5. Мова реляційних запитів sql.
- •Роль та історія розвитку sql.
- •Простий приклад
- •Історія
- •Стандарти
- •3. Декларативність
- •Питання сумісності
- •Переваги стандартів sql
- •1. Незалежність від конкретної субд
- •2. Наявність стандартів
- •Недоліки стандартів sql
- •1. Невідповідність реляційної моделі даних
- •Коротко про стандарт sql:2003
- •Cтворення таблиці
- •Видалення таблиці
- •Вираз select
- •Частина from
- •Частина where
- •Відповідність шаблону
- •Значення null
- •Частина order by
- •Приклад нотації для визначення оператора select в Oracle
- •Декартів добуток
- •Тета-з’єднання
- •Натуральне з’єднання
Недоліки стандартів sql
1. Невідповідність реляційної моделі даних
Творець реляційної моделі даних Едгар Кодд, Крістофер Дейт та їхні прихильники указують на те, що SQL не є істинно реляційною мовою. Зокрема вони указують на такі проблеми SQL[3]:
Рядки, що повторюються
Невизначені значення (null)
Явна вказівка порядку стовпчиків зліва направо
Стовпці без імені та імена стовпчиків, що дублюються
Використання покажчиків
Висока надлишковість
У опублікованому Крістофером Дейтом і Г'ю Дарвеном Третьому Маніфесті вони висловлюють принципи СУБД наступного покоління і пропонують мову Tutorial D, яка є достовірно реляційною.
2. Складність
Хоча SQL і замислювався, як засіб роботи кінцевого користувача, врешті-решт він став настільки складним, що перетворився на інструмент програміста.
3. Відступи від стандартів
Незважаючи на наявність міжнародного стандарту ANSI SQL-92, багато компаній, СУБД (наприклад, Oracle, Sybase, Microsoft, MySQL), що займаються розробкою, вносять зміни до мови SQL, вживаної в розроблених ними СУБД, тим самим відступаючи від стандарту. Таким чином з'являються специфічні для кожної конкретної СУБД діалекти мови SQL.
4. Складність роботи з ієрархічними структурами
Раніше SQL не пропонував стандартного способу маніпуляції деревовидними структурами. Деякі постачальники СУБД пропонували свої рішення. Наприклад, Oracle використовує вираз CONNECT BY.
Процедурні розширення
Оскільки SQL не є мовою програмування (тобто не надає засобів для автоматизації операцій з даними), введені різними виробниками розширення стосувалися в першу чергу процедурних розширень. Це збережені процедури (англ. stored procedures) і процедурні мови-«надбудови». Практично в кожній СУБД застосовується своя процедурна мова. Подібні мови для найпопулярніших СУБД приведені в такій таблиці:
СУБД |
Коротка назва |
Розшифровка |
Borland InterBase/ Firebird |
PSQL |
Procedural SQL |
IBM DB2 |
SQL PL |
SQL Procedural Language (розширює SQL/PSM) |
Microsoft SQL Server/ Sybase ASE |
Transact-SQL |
Transact-SQL |
MySQL |
SQL/PSM |
SQL/Persistent Stored Module |
Oracle |
PL/SQL |
Procedural Language/SQL (заснований на мові Ada) |
PostgreSQL |
PL/pgSQL |
Procedural Language/PostgreSQL Structured Query Language (схожий на Oracle PL/SQL) |
Коротко про стандарт sql:2003
Запис SQL-операторів
Для успішного вивчення мови SQL необхідно привести короткий опис структури SQL-операторів і нотації, які використовуються для визначення формату різних конструкцій мови. Оператор SQL складається з зарезервованих слів, а також зі слів, що визначаються користувачем. Зарезервовані слова є постійною частиною мови SQL і мають фіксоване значення. Їх слід записувати в точності так, як це встановлено, можна розбивати на частини для переносу з одного рядка на іншу. Слова, визначені користувачем, задаються їм самим (відповідно до синтаксичними правилами) і являють собою ідентифікатори або імена різних об'єктів бази даних. Слова в операторі розміщуються також відповідно до встановлених синтаксичними правилами.
Ідентифікатори мови SQL призначені для позначення об'єктів в базі даних і є іменами таблиць, уявлень, стовпців і інших об'єктів бази даних. Символи, які можуть використовуватися в створюваних користувачем ідентифікаторах мови SQL, повинні бути визначені як набір символів. Стандарт SQL задає набір символів, який використовується за умовчанням, - він включає рядкові і прописні букви латинського алфавіту (А-Я, AZ), цифри (0-9) і символ підкреслення (_). На формат ідентифікатора накладаються наступні обмеження:
ідентифікатор може мати довжину до 128 символів;
ідентифікатор повинен починатися з букви;
ідентифікатор не може містити пробіли.
<ідентифікатор>::=<буква>
{<буква>|<цифра>}[,...n]
Більшість компонентів мови не чутливі до регістру. Оскільки у мови SQL вільний формат, окремі SQL-оператори і їх послідовності будуть мати більш читаний вигляд при використанні відступів і вирівнювання.
Мова, в термінах якого дається опис мови SQL, називається метамовою. Синтаксичні визначення зазвичай задають за допомогою спеціальної металінгвістічна символіка, звана Бекуса-Науера формулами (БНФ). Прописні букви використовуються для запису зарезервованих слів і повинні вказуватися в операторах точно так, як це буде показано. Рядкові букви вживаються для запису слів, що визначаються користувачем. Застосовувані в нотації БНФ символи і їх позначення показані в таблиці.
Таблиця 5.1. Символи в нотації БНФ
Символ |
Позначення |
::= |
Рівне за визначенням |
| |
Необхідність вибору одного з декількох наведених значень |
<…> |
Описана за допомогою метамови структура мови |
{…} |
Обов'язковий вибір деякої конструкції зі списку |
[…] |
Необов'язковий вибір деякої конструкції зі списку |
[,…n] |
Необов'язкова можливість повторення конструкції від нуля до декількох разів |
Типи даних мови SQL, визначені стандартом
Дані - це сукупна інформація, що зберігається в базі даних у вигляді одного з кількох різних типів. За допомогою типів даних встановлюються основні правила для даних, що містяться в конкретному стовпчику таблиці, в тому числі розмір виділюваної для них пам'яті.
У мові SQL є шість скалярних типів даних, визначених стандартом. Їх короткий опис представлено в таблиці.
Таблиця 5.2. Символи в нотації БНФ
Тип даних |
Оголошення |
Символьний |
CHAR | VARCHAR |
Бітовий |
BIT | BIT VARYING |
Точні числа |
NUMERIC | DECIMAL | INTEGER | SMALLINT |
Округлені числа |
FLOAT | REAL | DOUBLE PRECISION |
Дата/час |
DATE | TIME | TIMESTAMP |
Інтервал |
INTERVAL |
<символьний_тип>::=
{ CHARACTER [ VARYING][довжина] | [CHAR | VARCHAR][ довжина]}
<бітовий_тип>::=
BIT [VARYING][довжина]
<фіксований_тип>::=
{NUMERIC[точність[,маштаб]]|{DECIMAL|DEC}
[точність[, маштаб]]
| {INTEGER |INT}| SMALLINT}
<дійсний_тип>::=
{ FLOAT [точність]| REAL |DOUBLE PRECISION}
<тип_дати/часу>::=
{DATE | TIME[точність][WITH TIME ZONE]| TIMESTAMP[точність][WITH TIME ZONE]}
Поняття домену
Домен – це набір допустимих значень для одного або декількох атрибутів. Якщо в таблиці бази даних або в декількох таблицях присутні стовпці, що володіють одними і тими ж характеристиками, можна описати тип такого стовпця і його поведінку через домен, а потім поставити у відповідність кожному з однакових стовпців ім'я домену. Домен визначає всі потенційні значення, які можуть бути присвоєні атрибуту.
Стандарт SQL дозволяє визначити домен за допомогою наступного оператора:
<домен>::=
CREATE DOMAIN ім’я_домену [AS]
тип_даних
[ DEFAULT значення]
[ CHECK (допустимі_значення)]
Кожному створюваному домену присвоюється ім'я, тип даних, значення за замовчуванням і набір припустимих значень. Слід зазначити, що наведений формат оператора є неповним. Тепер при створенні таблиці можна вказати замість типу даних ім'я домену.
Видалення доменів з бази даних виконується за допомогою оператора:
DROP DOMAIN ім’я_домену [ RESTRICT | CASCADE]
У разі зазначення ключового слова CASCADE будь стовпці таблиць, створені з використанням видаляється домену, будуть автоматично змінені і описані як містять дані того типу, який був вказаний у визначенні видаляється домену.
Альтернативою доменам в середовищах SQL Server і Oracle є користувальницькі типи даних.
Базовий синтаксис деяких основних операторів
