Sql

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

Стандартизиран е от ANSI и ISO.

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

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“ на Едгар Ф. Код е публикувана през юни 1970, като черновите били разпространявани вътрешно в IBM през 1969. В нея той описва релационен модел, който впоследствие е приет като „базов“ модел за релационни системи за управление на бази данни. През 70-те, група от центъра за разработки на IBM в Сан Хосе разработва комерсиална система за бази от данни „System R“, която се базира на модела на Код, но не много стриктно. Доналд Д. Чембърлейн и Рейнолд Ф. Бойс от IBM разработват езика „SEQUEL“ (Structured English Query Language), който да управлява и извлича данните от System R. Акронимът SEQUEL след това бива съкратен до SQL, защото думата 'SEQUEL' е търговска марка на Hawker-Siddeley – авиационна компания от Обединеното кралство.

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

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

По същото време 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
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 попадат в няколко групи.

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

Ако се ограничи до командите за извличане на данни, 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 бази от данни. Теоретиците и някои практици отбелязват, че много от оригиналните възможности на SQL са вдъхновени от, но са в нарушение на релационния модел за управление на бази от данни и неговата реализация на векторни изчисления (tuple calculus).

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

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

SQL алтернативи

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

  • IBM Business System 12 (IBM BS12)
  • Tutorial D
  • TQL – Luca Cardelli (Може да бъде и не релационна)
  • Top's Query Language – чернова на език вдъхновен от IBM BS12. Нарочно преименуван на SMEQL за да се избегне объркване с подобен проект наречен TQL.
  • Hibernate Query Language (HQL) – Java базиран използва модифициран SQL
  • Quel представен през 1974 от U.C. Berkeley Ingres проекта.
  • Стандарт за обектно представяне на данни – Object Data Management Group.
  • Object Query Language – Object Data Management Group.
  • Datalog
  • EJB Query Language
  • LINQ

Източници

Външни препратки

Tags:

Sql ИсторияSql ЦелSql SQL ключови думиSql Критики на SQLSql SQL алтернативиSql ИзточнициSql Външни препраткиSqlANSIISOАнглийски езикДанниЕзик за програмиранеРелационни системи за управление на бази данни

🔥 Trending searches on Wiki Български:

Обикновена челядинкаДаниъл Дей-ЛюисПредлогРобокоп (филм, 2014)Кос (остров)РомбЕлвис ПреслиАушвицЖизелХемофилияБачковски манастирДжони Лий МилърИван Асен IIМета (компания)АгностицизъмСписък на български сериалиДен на Освобождението на България от османско игоСтатуя на СвободатаНиколай Илиев (футболист)РусияПреподобна СтойнаМалтаТикТокКомунизъмЕминемВенецияКазахстанВеселин МариновМоника БелучиКопривщицаГлаголицаЛевурдаКейт БланшетФилип КиркоровРепублика Южна АфрикаДяволското гърлоПроизведения на Иван ВазовМоскваОдринДеветнадесетомайски превратСтанимир Стоилов – МъриАпендицитФинландияМиа ХалифаГлорияПауловнияПланината помежду ниПарламентарни избори в България (2023)Орлин ПавловПалма де МайоркаКондофрейВиктор АнгеловЗлатолист (област Благоевград)ПФК Черно море (Варна)АнелияПарижДелян ДобревЮжен централен район за планиранеСветовно първенство по футболЕлена РайноваДържавна сигурностЗемяБелоградчишки скалиФутболно игрищеБългариМонакоРангел Вълчанов24 майШвейцарияНина ДобревЗвукАл ПачиноКарлос НасарХристо СмирненскиФреди МеркюриАвстрияМарк Селби🡆 More