SQL, илиЕзик за структурирани запитвания, (наанглийски:StructuredQueryLanguage, 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диалекти. Много от тези разширения са със затворен характер, например OraclePL/SQL,IBM SQL PL (SQL Procedural Language) иSybase /MicrosoftTransact-SQL. Общото за повечето комерсиални изпълнения е да пропускат поддръжката на основни възможности, заложени в стандарта, катоDATE илиTIME типове данни, предпочитайки техен собствен вариант. В резултат SQL кодът много рядко може да бъде „пренесен“ между различни архитектури без да се модифицира, и то значително, за разлика от ANSIC или ANSIFortran, които могат да се „пренасят“ без големи промени. Има няколко причини за това:
- сложността и размерът на 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*FROMBookWHEREprice>100.00ORDERBYtitle;
Това е пример, при който резултатът е списък от книги с определена цена. Извличат се данни от таблицатаbooks имащиprice по-голяма от 100.00. Резултатът е сортиран по азбучен ред на заглавието. Звездичката (*) означава – покажи всички колони на таблицатаbooks. Има възможност за указване на специфични колони.
SELECTBook.title,count(*)ASAuthorsFROMBookJOINBook_authorONBook.isbn=Book_author.isbnGROUPBYBook.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 алтернативи, но те са (обикновено) релационни. Вижнавигационна база от данни за алтернативи на релационния модел.