SQL

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
SQL
Парадигма: мульти-парадигмовий
Дата появи: 1974
Творці: Дональд Чамберлін та Раймонд Бойс
Розробник: IBM
Останній реліз: SQL:2008 (2008)
Система типізації: строга статична типізація
Основні реалізації: багато
Діалекти: SQL-86, SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2006, SQL:2008[1]
Під впливом від: Datalog
Вплинула на: CQL, LINQ, Windows PowerShell
ОС: крос-платформова

SQL (англ. Structured query language — мова структурованих запитів) — декларативна мова програмування для взаємодії користувача з базами даних, що застосовується для формування запитів, оновлення і керування реляційними БД, створення схеми бази даних і її модифікації, системи контролю за доступом до бази даних. Сам по собі SQL не є ні системою керування базами даних, ні окремим програмним продуктом. Не бувши мовою програмування в тому розумінні, як C або Pascal, SQL може формувати інтерактивні запити або, бувши вбудованою в прикладні програми, виступати в якості інструкцій для керування даними. Стандарт SQL, крім того, вміщує функції для визначення зміни, перевірки і захисту даних.

SQL — це діалогова мова програмування для здійснення запиту і внесення змін до бази даних, а також управління базами даних. Багато баз даних підтримує SQL з розширеннями до стандартної мови. Ядро SQL формує командна мова, яка дозволяє здійснювати пошук, вставку, оновлення, і вилучення даних, використовуючи систему управління і адміністративні функції. SQL також включає CLI (Call Level Interface) для доступу і управління базами даних дистанційно.

Перша версія SQL була розроблена на початку 1970-х років у IBM. Ця версія мала назву SEQUEL і була призначена для обробки й пошуку даних, що містилися в реляційній базі даних IBM, System R . Мова SQL пізніше була стандартизована Американськими Держстандартами (ANSI) в 1986. Спочатку SQL розроблялась як мова запитів і управління даними, пізніші модифікації SQL створено продавцями системи управління базами даних, які додали процедурні конструкції, control-of-flow команд і розширення мов. З випуском стандарту SQL:1999 такі розширення були формально запозичені як частина мови SQL через Persistent Stored Modules (SQL/PSM).

Критики SQL включає відсутність крос-платформенності, невідповідною обробкою відсутніх даних (дивіться Null (SQL) ), і іноді неоднозначна граматика і семантика мови.

Історія[ред.ред. код]

На початку 1970-х років в одній з дослідницьких лабораторій компанії IBM була розроблена експериментальна реляційна СУБД System R, для якої потім була створена спеціальна мова SEQUEL, що дозволяла відносно просто управляти даними в цій СУБД. Абревіатура SEQUEL розшифровувалася як англ. Structured English QUEry Language — «структурована англійська мова запитів». Пізніше з юридичних міркувань[2] мова SEQUEL була перейменована в SQL. Коли в 1986 році перший стандарт мови SQL був прийнятий ANSI (American National Standards Institute), офіційною вимовою стало [,es kju:' el] — ес-к'ю-ел. Попри це, навіть англомовні фахівці по колишньому часто називають SQL сіквел, замість ес-кью-ел.

Метою розробки було створення простої непроцедурної мови, якою зміг би скористатися будь-який користувач, що навіть не має навиків програмування. Власне розробкою мови запитів займалися Дональд Чемберлін (Donald D. Chamberlin) і Рей Бойс (Ray Boyce). Пет Селінджер (Pat Selinger) займалася розробкою вартісного оптимізатора (англ. cost-based optimizer), Реймонд Лорі (Raymond Lorie) займався компілятором запитів.

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

Першими СУБД, що підтримують нову мову SQL, стали в 1979 році Oracle V2 для машин VAX від компанії Relational Software Inc. (що згодом стала компанією Oracle) і System/38 від IBM, заснована на System/R.

Перший офіційний стандарт мови SQL був прийнятий ANSI в 1986 і ISO (Міжнародною організацією зі стандартизації) в 1987 (так званий SQL-86) і дещо уточнений в 1989 році. Подальший розвиток мови постачальниками СУБД зажадав ухвалення в 1992 р. нового розширеного стандарту (ANSI SQL-92 або просто SQL2). Наступним стандартом став SQL:1999 (SQL3). В наш час[Коли?] діє стандарт, прийнятий в 2003 році (SQL:2003) з невеликими модифікаціями, внесеними пізніше.

Стандарти[ред.ред. код]

Повністю історія версій стандартів-ревізій SQL:

Рік Назва Інша назва Коментар
1986 SQL-86 SQL-87 Вперше оприлюднено ANSI. Ратифіковано ISO в 1987.
1989 SQL-89 FIPS 127-1 Невеликі зміни.
1992 SQL-92 SQL2 Вагомі зміни.
1999 SQL:1999 SQL3 Додано регулярні вирази, рекурсивні запити, тріґери та деякі об'єктно-орієнтовані нововведення.
2003 SQL:2003 SQL 2003 Впроваджено розширення для роботи з XML-даними.
2006 SQL:2006 SQL 2006 ISO/IEC 9075-14:2006. Функціональність работи з XML-даними значно розширено. З'явилась можливісь сумісного використання в SQL та XQuery.
2008 SQL:2008 SQL 2008 Вдосконалено можливості віконних функцій, усунуто деякі неоднозначності стандарту SQL:2003. Легалізовано ORDER BY поза визначенням курсору. Додано трігери INSTEAD OF. Додано заяви TRUNCATE.
2011 SQL:2011 SQL 2011 ISO/IEC 9075:2011.

Синтаксис[ред.ред. код]

Елементи мови[ред.ред. код]

SQL складається з наступних елементів мови:

  • Положення, які є складовими компонентами заяв і запитів.
  • Предикати для тризначної логіки (3VL) (так / ні / невідомо) або логічних значень, які використовуються для обмеження наслідків заяв та *запитів або змінити хід виконання програми.
  • Запити для видачі скалярних величин або таблиць, що складаються із стовпців і рядків даних.
  • Запити вилучення даних на основі певних критеріїв.
  • Заяви впливу на схеми і даних, зв'язків.
  • Заяви управлінням транзакціями, ходом виконання програми, завдань та діагностики.

Оператори[ред.ред. код]

Оператор Опис Приклад
= Рівно Author = 'Alcott'
<> or != Не рівно Dept <> 'Sales'
> Більше Hire_Date > '2012-01-31'
< Менше Bonus < 50000.00
>= Більше рівно Dependents >= 2
<= Менше рівно Rate <= 0.05
BETWEEN Між діапазоном, включно Cost BETWEEN 100.00 AND 500.00
LIKE Збіг з шаблоном символів First_Name LIKE 'Will%'
IN Рівно одному з множини вказаних DeptCode IN (101, 103, 209)
IS or IS NOT Перевірка на наявність (не пусте) Address IS NOT NULL

Типи даних[ред.ред. код]

Структура SQL[ред.ред. код]

SQL (Structured query language — мова структурованих запитів), складається з:

Data Definition Language[ред.ред. код]

Основна стаття: DDL

  • CREATE — створення об'єкта (наприклад, таблиці);
  • ALTER — зміна об'єкта (наприклад, додавання/зміна полів таблиці);
  • DROP — видалення об'єкта.

Data Manipulation Language[ред.ред. код]

Основна стаття: DML

  • INSERT — вставка стрічки;
  • SELECT — вибірка;
  • UPDATE — зміна;
  • DELETE — видалення.

Data Control Language[ред.ред. код]

Основна стаття:DCL

  • GRANT — надання прав користувачу;
  • DENY — явна заборона для користувача;
  • REVOKE — відміна заборони/дозволу користувачу.

Transaction Control Language[ред.ред. код]

Основна стаття: TCL

  • BEGIN TRANSACTION — почати транзакцію;
  • COMMIT — прийняти зміни прийняті в транзакції;
  • ROLLBACK — відкат.

Питання сумісності[ред.ред. код]

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

До 1996 року питаннями відповідності комерційних реалізацій SQL стандарту займався в основному інститут NIST, який і встановлював рівень відповідності стандарту. Але пізній підрозділ, що займався СУБД, був розформований, і в цей час всі зусилля з перевірки СУБД на відповідність стандарту лягають на її виробника.

Вперше поняття «Рівня відповідності» було запропоноване в стандарті SQL-92. А саме, ANSI і NIST визначали чотири рівні відповідності реалізації цьому стандарту:

  • Entry (базовий)
  • Transitional (перехідний) — перевірку на відповідність цьому рівню проводив тільки інститут NIST
  • Intermediate (проміжний)
  • Full (повний)

Легко можна зрозуміти, що кожен подальший рівень відповідності свідомо мав на увазі відповідність попередньому рівню. Далі, згідно з цими рівнями стандартів будь-яка СУБД, яка відповідала рівню Entry, могла заявляти себе як «SQL-92 відповідна», хоча насправді переносимість і відповідність стандарту обмежувалося набором можливостей, що входять у цей рівень.

Положення змінилося з введенням стандарту SQL:1999. Відтепер стандарт придбав модульну структуру — основна частина стандарту була винесена в розділ «SQL/Foundation», всі інші були виведені в окремі модулі. Відповідно, залишився тільки один рівень сумісності — Core, що означало підтримку цієї основної частини. Підтримка решти можливостей залишена на розсуд виробників СУБД. Аналогічне положення мало місце і з подальшими версіями стандарту.

Переваги[ред.ред. код]

Незалежність від конкретної СУБД[ред.ред. код]

Незважаючи на наявність діалектів і відмінностей в синтаксисі, в більшості своїй тексти SQL-запитів, що містять, DDL і DML, можуть бути досить легко перенесені з однієї СУБД в іншу. Існують системи, розробники яких спочатку закладалися на застосування щонайменше кількох СУБД (наприклад: система електронного документообігу Documentum може працювати як з Oracle, так і з Microsoft SQL Server та IBM DB2). Природно, що при застосуванні деяких специфічних для реалізації можливостей такої переносимості добитися вже дуже важко.

Наявність стандартів[ред.ред. код]

Наявність стандартів і набору тестів для виявлення сумісності і відповідності конкретній реалізації SQL загальноприйнятому стандарту тільки сприяє «стабілізації» мови. Правда, варто звернути увагу, що сам по собі стандарт місцями занадто формалізований і роздутий в розмірах, наприклад, Core-частину стандарту SQL:2003 включає понад 1300 сторінок тексту.

Декларативність[ред.ред. код]

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

Недоліки[ред.ред. код]

Невідповідність реляційної моделі даних[ред.ред. код]

Творець реляційної моделі даних Едгар Кодд, Крістофер Дейт та їхні прихильники указують на те, що SQL не є істинно реляційною мовою. Зокрема вони указують на такі проблеми SQL[3]:

  • Рядки, що повторюються
  • Невизначені значення (null)
  • Явна вказівка порядку стовпчиків зліва направо
  • Стовпці без імені та імена стовпчиків, що дублюються
  • Відсутність підтримки властивості «=»
  • Використання покажчиків
  • Висока надлишковість

У опублікованому Крістофером Дейтом і Г'ю Дарвеном Третьому Маніфесті[4] вони висловлюють принципи СУБД наступного покоління і пропонують мову Tutorial D, яка є достовірно реляційною.

Складність[ред.ред. код]

Хоча SQL і замислювався, як засіб роботи кінцевого користувача, врешті-решт він став настільки складним, що перетворився на інструмент програміста.

Відступи від стандартів[ред.ред. код]

Незважаючи на наявність міжнародного стандарту ANSI SQL-92, багато компаній, СУБД (наприклад, Oracle, Sybase, Microsoft, MySQL), що займаються розробкою, вносять зміни до мови SQL, вживаної в розроблених ними СУБД, тим самим відступаючи від стандарту. Таким чином з'являються специфічні для кожної конкретної СУБД діалекти мови SQL.

Складність роботи з ієрархічними структурами[ред.ред. код]

Раніше SQL не пропонував стандартного способу маніпуляції деревовидними структурами. Деякі постачальники СУБД пропонували свої рішення. Наприклад, Oracle використовує вираз CONNECT BY. В наш час[Коли?] як стандарт прийнята рекурсивна конструкція WITH.

Процедурні розширення[ред.ред. код]

Оскільки 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)

Простий приклад[ред.ред. код]

Простий запит для виведення списку із атрибутами Name, Address, Class із таблиці School у певній базі даних має такий вигляд:

SELECT Name, Address, Class
FROM School;

Виноски[ред.ред. код]

Команды SQL на русском языке с примерами

  1. http://archives.postgresql.org/pgsql-hackers/2008-09/msg00071.php
  2. «„SEQUEL“ був торговою маркою британської авіабудівної групи компаній Hawker Siddeley» // Andy Oppel. Databases Demystified. — San Francisco, CA: McGraw-Hill Osborne Media. — С. 90—91. — ISBN 0-07-225364-9.
  3. O'Reilly Network. An Interview with Chris Date
  4. The Third Manifesto

Див. також[ред.ред. код]