Історія мови SQL
Мова SQL, призначена для взаємодії з базами даних, з’явилася в середині 70-х рр. (перші публікації датуються 1974 р.) і була розроблена у компанії IBM у рамках проекту експериментальної реляційної СУБД System R. Вихідна назва мови SEQUEL (Structured English Query Language) тільки частково відбиває суть цієї мови. Звичайно, мова була орієнтований головним чином на зручну й зрозумілу користувачам формулювання запитів до реляційних БД. Але, у дійсності, вона майже із самого початку була повною мовою БД, що забезпечує крім засобів формулювання запитів і маніпулювання БД наступні можливості:
- засоби визначення й маніпулювання схемою БД;
- засоби визначення обмежень цілісності й тригерів;
- засоби визначення подань БД;
- засоби визначення структур фізичного рівня, що підтримують ефективне виконання запитів;
- засоби авторизації доступу до відносин й їхніх полів;
- засоби визначення крапок збереження транзакції, і виконання фіксації й відкотів транзакцій.
У мові були відсутні засобу явної синхронізації доступу до об’єктів БД із боку паралельно виконуваних транзакцій: із самого початку передбачалося, що необхідну синхронізацію неявно виконує СУБД.
Сьогодні мова SQL реалізована у всіх комерційних реляційних СУБД і майже у всіх СУБД, які споконвічно ґрунтувалися не на реляційному підході. Всі компанії-виробники проголошують відповідність своєї реалізації стандарту SQL, і насправді реалізовані діалекти SQL дуже близькі. Цього вдалося домогтися не відразу.
Найбільш близькі до System R були дві системи компанії IBM – SQL/DS й DB2. Розроблювачі обох систем використали досвід проекту System R, а СУБД SQL/DS прямо ґрунтувалася на програмному коді System R. Звідси гранична близькість діалектів SQL, реалізованих у цих системах, до SQL System R. З SQL System R були вилучені тільки ті частини, які були недостатньо пророблені (наприклад, крапки збереження) або реалізація яких викликала занадто більші технічні труднощі (наприклад, обмеження цілісності й тригери). Можна назвати цей шлях до комерційної реалізації SQL рухом зверху вниз.
Інший підхід застосовувався в таких системах, як Oracle, Informix й Sybase. Незважаючи на розходження в способах розробки систем, реалізація SQL скрізь відбувалася «знизу нагору». У перших випущених на ринок версіях цих систем використовувалася обмежена підмножина SQL System R. Зокрема, у першій відомій нам реалізації SQL у СУБД Oracle в операторах вибірки не допускалося використання вкладених підзапитів і була відсутня можливість формулювання запитів із з’єднаннями декількох відносин.
Проте, незважаючи на ці обмеження й на дуже слабку, спочатку, ефективність СУБД, орієнтація компаній на підтримку різних апаратних платформ і зацікавленість користувачів у переході до реляційних систем дозволили компаніям домогтися комерційного успіху й приступитися до вдосконалювання своїх реалізацій. У поточних версіях Oracle, Informix, Sybase й Microsoft SQL Server підтримуються досить потужні діалекти SQL, хоча реалізація іноді викликає сумніви.
Особливістю більшості сучасних комерційних СУБД, що утрудняє порівняння існуючих діалектів SQL, є відсутність однакового опису мови. Звичайний опис розкиданий по різним руководствам і перемішане з описом специфічних для даної системи язикових засобів, що не мають прямого відношення до SQL. Проте можна сказати, що базовий набір операторів SQL, що включає оператори визначення схеми БД, вибірки й маніпулювання даними, авторизації доступу до даних, підтримки вбудовування SQL у мови програмування й оператори динамічного SQL, у комерційних реалізаціях устоявся й більш-менш відповідає стандарту.
Діяльність по стандартизації мови SQL почалася практично одночасно з появою його перших комерційних реалізацій. В 1982 р. комітету з базам даних Американського національного інституту стандартів (ANSI) було доручено розробити специфікацію стандартної мови реляційних баз даних. Перший документ із числа наявних в автора проектів стандарту датований жовтнем 1985 р. й є вже не першим проектом стандарту ANSI. Стандарт був прийнятий ANSI в 1986 р., а в 1987 р. схвалений Міжнародною організацією по стандартизації (ISO). Цей стандарт прийнятий називати SQL/86.
Зрозуміло, що як основу стандарту не можна було використати SQL System R. По-перше, цей варіант мови не був належним чином технічно пророблений. По-друге, його занадто складно було б реалізувати (хто знає, як би зложилася доля SQL, якби всі ідеї проекту System R були реалізовані повністю). Тому за основу був узятий діалект мови SQL, що зложився в IBM до початку 1980-х рр. По суті, цей діалект являв собою технічно пророблену підмножину SQL System R.
ДО 1989 р. стандарт SQL/86 був трохи розширений, і був підготовлений і прийнятий наступний стандарт, що одержав назву ANSI/ISO SQL/89. Аналіз доступних документів показує, що процес стандартизації SQL відбувався дуже складно з використанням не тільки наукових доводів. У результаті SQL/89 у багатьох частинах має надзвичайно загальний характер і допускає дуже широке тлумачення. У цьому стандарті повністю відсутні такі важливі розділи, як маніпулювання схемою БД і динамічний SQL. Багато важливих аспектів мови у відповідності зі стандартом визначаються в реалізації.
Можливо, найбільш важливими досягненнями стандарту SQL/89 є чітка стандартизація синтаксису й семантики операторів вибірки даних і маніпулювання даними й фіксація засобів обмеження цілісності БД. Були специфіковані засоби визначення первинного й зовнішнього ключів відносин і так званих перевірочних обмежень цілісності, які являють собою підмножину обмежень цілісності SQL System R, що перевіряються негайно,. Засоби визначення зовнішніх ключів дозволяють легко формулювати вимоги так називаної посилальної цілісності БД.
Усвідомлюючи неповноту стандарту SQL, на тлі завершення розробки цього стандарту фахівці різних компаній почали роботу над стандартом SQL2. Ця робота також тривала кілька років, було випущене безліч проектів стандарту, поки нарешті в березні 1992 р. не був прийнятий остаточний проект стандарту (SQL/92). Цей стандарт істотно повніше стандарту SQL/89 й охоплює практично всі аспекти, необхідні для реалізації додатків: маніпулювання схемою БД, керування транзакціями (з’явилися крапки збереження) і сесіями (сесія – це послідовність транзакцій, у межах якої зберігаються тимчасові відносини), підключення до БД, динамічний SQL. Нарешті, були стандартизовані відношення-каталоги БД, що взагалі ж не зв’язано безпосередньо з мовою, але дуже сильно впливає на реалізацію.
В 1995 р. стандарт був доповнений специфікацією інтерфейсу рівня виклику (Call-Level Interface – SQL/CLI). SQL/CLI являє собою набір специфікацій інтерфейсів процедур, виклики яких дозволяють виконувати оператори, що задають динамічно, SQL. По суті справи, SQL/CLI являє собою альтернативу динамічному SQL. Інтерфейси процедур визначені для всіх основних мов програмування: З, Ada, Pascal, PL/1 і т.д. Варто помітити, що стандарт SQL/CLI послужив основою для створення повсюдно розповсюджених сьогодні інтерфейсів ODBC (Open Database Connectivity) і JDBC (Java Database Connectivity).
В 1996 р. до стандарту SQL/92 був доданий ще один компонент – SQL/PSM (Persistent Stored Modules). Основна мета цієї специфікації полягає в тому, щоб стандартизувати способи визначення й використання збережених процедур, тобто спеціальним образом оформлених програм, що включають оператори SQL, які зберігаються в базі даних, можуть викликатися додатками й виконуються усередині СУБД.
Незадовго до завершення робіт з визначення стандарту SQL2 була почата розробка стандарту SQL3. Спочатку планувалося завершити проект в 1995 р. і включити в мову деякі об’єктні можливості: обумовлені користувачами типи даних, підтримку тригерів, підтримку темпоральних властивостей даних і т.д. Реально роботу над новим стандартом удалося частково завершити тільки в 1999 р., і із цієї причини (а також у зв’язку із проблемою 2000 року) стандарт одержав назву SQL:1999.
Приведемо коротку характеристику поточного стану стандарту SQL:1999 і перспектив його розвитку. Насамперед, помітимо, що кожен новий варіант стандарту мови SQL був істотно об’ємніше попередніх версій. Так, якщо стандарт SQL/89 займав близько 600 сторінок, то обсяг SQL/92 становив на 300 із зайвим сторінок більше. Найперші проекти SQL3 займали близько 1500 сторінок. Це цілком природно, тому що мова ускладнюється, а його специфікації стають більше детальними й точними. Але розроблювачі SQL3 прийшли до виводу, що при таких обсягах стандарту ймовірність його прийняття й наступної успішної підтримки помітно зменшується. Тому було ухвалене рішення розбити стандарт на відносно незалежні частини, які можна було б розробляти й підтримувати окремо.
В 1999 р. були прийняті п’ять перших частин стандарту SQL:1999. Перша частина (SQL/Framework) присвячена опису концептуальної структури стандарту. У цій частині приводиться розгорнута анотація наступних чотирьох частин і формулюються вимоги до реалізацій, що претендують на відповідність стандарту.
Друга частина SQL:1999 (SQL/Foundation) утворить базис стандарту. Уводиться система типів мови, формулюються правила визначення функціональних залежностей і можливих ключів, визначаються синтаксис і семантика основних операторів SQL:
- операторів визначення й маніпулювання схемою бази даних;
- операторів маніпулювання даними;
- операторів керування транзакціями;
- операторів керування підключеннями до бази даних і т.д.
Третю частину займає уточнена в порівнянні з SQL/92 специфікація SQL/CLI. У четвертій частині специфікується SQL/PSM – синтаксис і семантика мови визначення збережених процедур. Нарешті, у п’ятої частини – SQL/Bindings – визначаються правила зв’язування SQL для стандартних версій мов програмування FORTRAN, COBOL, PL/1, Pascal, Ada, C й MUMPS.
У стандарт SQL:1999 повинні були ввійти ще кілька частин. Серед них специфікації наступних засобів:
- керування розподіленими транзакціями (SQL/Transaction);
- підтримка темпоральних властивостей даних (SQL/Temporal);
- керування зовнішніми даними (SQL/MED);
- зв’язування з об’єктно-орієнотованими мовами програмування (SQL/OLB);
- підтримка оперативної аналітичної обробки (SQL/OLAP).
Наприкінці 2003 р. був прийнятий й опублікований новий варіант міжнародного стандарту SQL:2003. Багато фахівців уважали, що у варіанті стандарту, що випливає за SQL:1999, будуть усього лише виправлені неточності SQL:1999. Але насправді, в SQL:2003 специфікований ряд нових і важливих властивостей, частина з яких ми торкнемося в цьому курсі.
Перетерпіла деякі зміни загальна організація стандарту. Стандарт SQL:2003 складається з наступних частин:
- 9075-1, SQL/Framework;
- 9075-2, SQL/Foundation;
- 9075-3, SQL/CLI;
- 9075-4, SQL/PSM;
- 9075-9, SQL/MED;
- 9075-10, SQL/OLB;
- 9075-11, SQL/Schemata;
- 9075-13, SQL/JRT;
- 9075-14, SQL/XML.
Частини 1-4 й 9-10 з необхідними змінами залишилися такими ж, як й в SQL:1999 (розд. 7.4). Частина 5 (SQL/Bindings) перестала існувати; відповідні специфікації включені в частину 2. Розділ частини 2 SQL:1999, присвячений інформаційній схемі, виділений в окрему частину 11. З’явилися дві нові частини – 13 й 14. Частина 13 повністю називається «SQL Routines and Types Using the Java Programming Language» («Використання підпрограм і типів SQL у мові програмування Java»). Поява такої частини стандарту виправдано підвищеною увагою до мови Java з боку провідних виробників SQL-орієнтованих СУБД. Нарешті, остання частина SQL:2003 присвячена специфікаціям язикових засобів, що дозволяють працювати з XML-документами в середовищі SQL.
Провідні постачальники відповідних СУБД (сьогодні це компанії IBM, Oracle й Microsoft) намагаються максимально швидко реагувати на потреби й кон’юнктуру ринку й розширюють свої продукти всі новими й новими можливостями. Очевидна потреба в стандартизації відповідних язикових засобів, але процес стандартизації явно не поспіває за змінами, що відбуваються.