Направо към съдържанието

SQL

от Уикипедия, свободната енциклопедия
SQL
Парадигмамултипарадигмален: обектно ориентиран, функционален, процедурен
Реализиране през1969
АвторЕдгар Код & IBM
Последна стабилна версияSQL:2011 (2011)
Типизация на даннитестатична типизация, силна типизация
ИмплементацияМного
Файлово разширение.sql
УебсайтISO/IEC 9075 – 1:2008: ИТ – езици за бази данни – SQL – Част 1: Структура (SQL/Структура)
SQL в Общомедия

SQL, или Език за структурирани запитвания, (на английски: Structured Query Language, SQL) е популярен език за програмиране, предназначен за създаване, видоизменяне, извличане и обработване на данни от релационни системи за управление на бази данни. Стандартизиран е от ANSI и ISO.

SQL обикновено се произнася ес-кю-ел (ess-cue-el) (виж английската азбука) – или сикуъл (sequel). Имената на продукти, съдържащи SQL, имат всеки свое произношение, например: MySQL официално се произнася май-ес-кю-ел (my ess cue el); PostgreSQLпостгрес (postgres); и Microsoft SQL Server на български като Майкрософт ескюел сървър, а иначе като Майкрософт сикуъл сървър (Microsoft-sequel-server).

Появяването на SQL се свързва с възникването на релационни модели за бази от данни. Публикацията „A Relational Model of Data for Large Shared Data Banks“[1] на Едгар Ф. Код е публикувана през юни 1970, като черновите били разпространявани вътрешно в IBM през 1969. В нея той описва релационен модел, който впоследствие е приет като „базов“ модел за релационни системи за управление на бази данни. През 70-те, група от центъра за разработки на IBM в Сан Хосе разработва комерсиална система за бази от данни „System R“, която се базира на модела на Код, но не много стриктно. Доналд Д. Чембърлейн и Рейнолд Ф. Бойс от IBM разработват езика „SEQUEL“ (Structured English Query Language), който да управлява и извлича данните от System R. Акронимът SEQUEL след това бива съкратен до SQL, защото думата 'SEQUEL' е търговска марка на Hawker-Siddeley – авиационна компания от Обединеното кралство.[2]

Първата некомерсиална, релационна база от данни, която е не-SQL, е Ingres – разработена през 1974 в Калифорнийски университет, Бъркли.

През 1978, IBM започва методично тестване в клиентски тестови центрове успешно демонстрирайки ползата и практичността на системата. В резултат на това IBM започва да разработва комерсиални продукти базирани на прототипа на тяхната System R осъществяваща SQL, като System/38 (известена през 1978 и достъпна от август 1979), SQL/DS (представена през 1981), и DB2 (през 1983).[3]

По същото време Relational Software, Inc. (сега Oracle Corporation) забеляза потенциала на концепцията, описана от Чембърлейн и Бойс и разработва своя версия на РСУБД за флота на САЩ, ЦРУ и др. През лятото на 1979 компанията Relational Software, Inc. представя Oracle V2 (Версия 2) за VAX миникомпютри като първата достъпна на пазара реализация на SQL. Oracle често погрешно е хвалена че е изпреварила IBM с две години, докато всъщност те са изпреварили представянето на IBM – System/38 с няколко седмици. Следвайки големия интерес на обществеността много скоро и други доставчици започват да разработват свои версии.

SQL е приет като стандарт от ANSI (American National Standards Institute) през 1986 и от ISO (Международна организация по стандартизация) през 1987. ANSI декларира че официалното произношение на SQL е /ɛs kjuː ɛl/ (ес-кю-ел), докато много англоговорещи професионалисти по бази от данни все още го произнасят като сикуел (sequel).

SQL стандартът преминава през няколко версии:

Година Име Псевдоним Коментари
1986 SQL-86 SQL-87 Първо публикуван от ANSI. Одобрен от ISO през 1987.
1989 SQL-89 Въвежда механизмите за налагане на отношения при външните ключове.
1992 SQL-92 SQL2 Доста промени. Нови функции.
1999 SQL:1999 SQL3 Добавя „regular expression“ сравнения, рекурсивни запитвания (recursive queries), тригери (triggers), „non-scalar“ типове и някои обектно ориентирани възможности. (Последните две са спорни и все още не са широко поддържани.)
2003 SQL:2003 Въвежда XML възможности, window функции, стандартизирани последователности (sequences) и колони (columns) с автоматично създаване на значения (включително „identity-columns“).
2006 SQL:2006 Функционалността на работа с XML-данни е значително разширена. Добавена е възможност за съвместно използване на заявките в SQL и XQuery.
2008 SQL:2008 Подобрени са възможностите на прозоречните функции, отстранени са някои нееднозначности в стандарта SQL:2003[4]
2011 SQL:2011

Текстът на SQL стандарта не е свободно достъпен. SQL:2003 може да бъде закупен от ISO или ANSI. Една от последните чернови е достъпна като zip архив от Whitemarsh Information Systems Corporation. Zip архивът съдържа много PDF файлове, дефиниращи части от спецификацията на SQL:2003.

Освен стандартния SQL, дефиниран от ANSI и ISO, съществуват още много негови разширения и вариации. На практика почти всички разработчици предоставят различни вариации и разширения на SQL, които в литературата често се описват като SQL диалекти. Много от тези разширения са със затворен характер, например Oracle PL/SQL, IBM SQL PL (SQL Procedural Language) и Sybase / Microsoft Transact-SQL. Общото за повечето комерсиални изпълнения е да пропускат поддръжката на основни възможности, заложени в стандарта, като DATE или TIME типове данни, предпочитайки техен собствен вариант. В резултат SQL кодът много рядко може да бъде „пренесен“ между различни архитектури без да се модифицира, и то значително, за разлика от ANSI C или ANSI Fortran, които могат да се „пренасят“ без големи промени. Има няколко причини за това:

  • сложността и размерът на SQL стандарта означават, че повечето бази от данни не осъществяват стриктно целия стандарт.
  • стандарта не специфицира как базата данни се държи в няколко важни области (като индексите(indexes)), оставяйки на изпълняващия го да реши по какъв начин да става то.
  • SQL стандартът специфицира синтаксиса, на който базата данни трябва да отговаря. Но спецификацията на семантиката на езика е по-слабо дефинирана и позволява различно тълкуване.
  • много доставчици на бази от данни имат множество клиенти и ако SQL стандартът е в конфликт с начина на работа на предишни инсталирани версии на тяхната база от данни, те не искат да я променят заради обратната съвместимост.

SQL е създаден със специфична, ограничена цел – запитвания към данни в релационна база от данни. Като такъв той е множествено базиран, декларативен език за програмиране а не процедурен език като C или BASIC които, бидейки неспециализирани, са направени да разрешават по-голям обхват от проблеми. Разширения на езика като PL/SQL намаляват разликата добавяйки процедурни елементи, и контролни структури. Друг подход е да се позволи вграждане на кода. Например Oracle и други включват Java в базата данни, докато PostgreSQL позволява функциите за бъдат написани на различни езици, като Perl, Tcl, и C.

Популярна шега относно SQL е че „SQL не е структуриран, нито ограничен до запитвания, нито език (на английски: is not structured, nor is it limited to queries, nor is it a language).“ Основа за това е, че чистият SQL не е класически програмен език, тъй като не отговаря на Дефиницията на Тюринг. От друга страна обаче той е език за програмиране, защото има граматика, синтаксис и е предназначен за програмиране. Тази шега наподобява забележката на Волтер относно Свещената римска империя, че не е била „нито свещена, нито Римска, нито империя“ /not holy, nor Roman, nor an empire./

SQL е в контраст с по-мощните езици за програмиране от четвърта генерация, ориентирани към бази от данни като Focus или SAS с неговата относителна функционална простота и по-прости команди. Това намалява трудностите по поддържането на изходния код на SQL, но също прави по-трудно програмирането на въпроси като 'Кой имаше 10-те най-високи резултата?', което води до разработката на процедурни разширения. Обаче то прави възможно изходния SQL код да се създава (и оптимизира) от програма, водещо до разработката на „естествени“ езици за запитвания към бази от данни, и 'довлечи и пусни' пакети за програмиране на бази от данни с 'обектно ориентирани' интерфейси. Често те позволяват преглед на резултатния SQL изходен код за подобряване, с образователна цел или за да се използва в друга среда.

Ключовите думи на SQL попадат в няколко групи.

Извличане на данни

[редактиране | редактиране на кода]

Ако се ограничи до командите за извличане на данни, SQL действа като декларативен език.

  • SELECT се използва за извличането на нула или повече реда от една или повече таблици в базата данни. В повечето приложения, SELECT е най-често използваната команда. При специфицирането на SELECT запитване, потребителят специфицира описание на желания резултат, но без операциите, които трябва да се извършат, за да се постигне той. Прехвърлянето на запитване в ефективно подреждане за запитвания (query plan) се извършва от системата или по-специално от оптимизатора на запитвания(query optimizer).
    • Често срещани ключови, думи свързани със SELECT, са:
      • FROM се използва за индикация от кои таблици се взимат данните, както и как тези таблици се свързват (JOIN).
      • WHERE – идентифицира кои редове да се извлекат.
      • GROUPBY – комбинира/групира редове със сходни данни в елементи с по-малко редове.
      • HAVING – кои от „комбинираните редове“ (комбинираните редове се получават от запитване включващо GROUPBY или когато частта SELECT съдържа съединения /aggregates/), трябва да се извлекат. HAVING функционира общо взето като WHERE, но използва резултата от GROUPBY и може да използва съединяващи функции (aggregate functions).
      • ORDERBY – идентифицира кои колони се използват за сортиране на резултата.
SELECT *
    FROM Book
    WHERE price > 100.00
    ORDER BY title;

Това е пример, при който резултатът е списък от книги с определена цена. Извличат се данни от таблицата books имащи price по-голяма от 100.00. Резултатът е сортиран по азбучен ред на заглавието. Звездичката (*) означава – покажи всички колони на таблицата books. Има възможност за указване на специфични колони.

SELECT Book.title,
        count(*) AS Authors
    FROM  Book JOIN Book_author
       ON Book.isbn = Book_author.isbn
    GROUP BY Book.title;

Пример 2 показва използването на „обединение“ (join) между таблици и групиране. В този пример се показва колко автора има всяка книга. Ето и примерен резултат:

 Title Authors
 ---------------------- -------
 SQL Examples and Guide 3
 The Joy of SQL 1
 How to use Wikipedia 2
 Pitfalls of SQL 1
 How SQL Saved my Dog 1

Манипулиране на данни

[редактиране | редактиране на кода]

Има няколко стандартни групи от запазени думи в SQL, една от тях е Език за манипулиране на данни (DML). Той се използва за добавяне, модифициране и изтриване на данни.

  • INSERT – добавя нула или повече редове към съществуваща таблица.
  • UPDATE – модифицира данните в съществуващ ред.
  • MERGE – комбинира данни от множество таблици. Нещо като комбинация от INSERT и UPDATE. Дефинирана е в стандарта SQL:2003; преди това някои бази от данни имаха същата функционалност с друг синтаксис, понякога наречени „upsert“.
  • TRUNCATE – изтрива всички данни от таблица (нестандартна, но често срещана SQL команда).
  • DELETE – премахва нула или повече от съществуващите редове в таблица.
Примери:
INSERT INTO my_table (field1, field2, field3) VALUES ('test', 'N', NULL);
UPDATE my_table SET field1 = 'updated value' WHERE field2 = 'N';
DELETE FROM my_table WHERE field2 = 'N';

Управление на трансакции

[редактиране | редактиране на кода]

Трансакциите имат за цел да осигурят цялост и съгласуваност на данните. Основно тяхно свойство е така наречената атомарност (Atomicity), която определя, че дадена трансакция или трябва да завърши успешно всички промени, или трябва да върне данните до първоначално състояние.

  • START TRANSACTION (или BEGIN WORK, в зависимост от SQL диалекта) – маркира началото на трансакция. Допустимо е неявното стартиране на трансакция. (До SQL92 в стандарта не фигурира команда за явно стартиране на трансакция)
  • COMMIT – всички промени се записват.
  • ROLLBACK – отказва всички промени след последния COMMIT или ROLLBACK, така че данните са възстановени в състоянието в което са били преди началото на трансакцията.

COMMIT и ROLLBACK комуникират с контрола на трансакции и „заключване“ (transaction control and locking). И двете команди завършват трансакция и отключват данните. При липса на START TRANSACTION действието зависи от разработчика на продукта.

Пример:
START TRANSACTION;
UPDATE inventory SET quantity = quantity – 3 WHERE item = 'pants';
COMMIT;

Дефиниране на данни

[редактиране | редактиране на кода]

Втората група – Език за дефиниране на данни (DDL) позволява на потребителя да дефинира нови таблици и асоциирани с тях елементи. Повечето комерсиални SQL бази от данни имат собствени разширения на DDL, позволяващи контрол на възможностите на системата, които не са включени в стандарта.

Основни кодови думи са CREATE и DROP.

  • CREATE – създава обект (например таблица) в базата данни.
  • DROP – изтрива съществуващ обект от базата данни.

Някои бази от данни имат ALTER команда, позволяваща на потребителя да модифицира съществуващ обект -- например добавяне на колона в съществуваща таблица.

Пример:
CREATE TABLE my_table (
my_field1 INT UNSIGNED,
my_field2 VARCHAR (50),
my_field3 DATE NOT NULL,
PRIMARY KEY (my_field1, my_field2)

)

Контролиране на данни

[редактиране | редактиране на кода]

Третата група от SQL запазени думи е Език за контролиране на данни (DCL). Той оторизира достъпа до данни и потребителските позволения за преглед и манипулиране на данни в базата.

Има две основни ключови думи:

  • GRANT – оторизира един или повече потребители за извършване на операции върху обект.
  • REVOKE – премахва или ограничава позволенията, дадени на потребител.
Пример:
GRANT SELECT, UPDATE ON my_table TO some_user, another_user
  • ANSI-стандартът на SQL поддържа -- като идентификатор на коментар за един ред (някои разширения използват фигурни скоби или C-подобни /* коментари */ за коментари на повече редове).
Пример:
SELECT * FROM inventory -- Retrieve everything from inventory table
  • Някои SQL сървъри позволяват функции, дефинирани от потребителя.

Технически SQL е декларативен език за програмиране, предназначен за използване с SQL бази от данни. Теоретиците и някои практици отбелязват, че много от оригиналните възможности на SQL са вдъхновени от, но са в нарушение на релационния модел за управление на бази от данни и неговата реализация на векторни изчисления (tuple calculus).

Също има критики относно използването в практиката на SQL:

  • Синтаксисът на езика е сложен (понякога наричан „COBOL-like“).
  • Няма стандартизация или общоприет начин за разделяне на големи команди в няколко по-малки, като връзката да става по име. В резултат „run-on SQL sentences“ води до дълбоко йерархично наследяване, когато по-подходящ е подходът като „граф“ (връзка по име).

Има разлика между алтернативите на релационни и SQL бази от данни. Този списък съдържа SQL алтернативи, но те са (обикновено) релационни. Виж навигационна база от данни за алтернативи на релационния модел.

  1. ((en)) Codd, Edgar F. A Relational Model of Data for Large Shared Data Banks // Communications of the ACM 13 (6). Association for Computing Machinery, June 1970. DOI:10.1145/362384.362685. с. 377 – 87. Архивиран от оригинала на 2007-06-12. Посетен на 9 юни 2007.
  2. Donald D. Chamberlin and Raymond F. Boyce, 1974. „SEQUEL: A structured English query language“, International Conference on Management of Data, Proceedings of the 1974 ACM SIGFIDET (now SIGMOD) workshop on Data description, access and control, Ann Arbor, Michigan, pp. 249 – 264
  3. www-03.ibm.com
  4. archives.postgresql.org