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 попадат в няколко групи.
Извличане на данни[редактиране | редактиране на кода]
Ако се ограничи до командите за извличане на данни, SQL действа като декларативен език.
SELECT
се използва за извличането на нула или повече реда от една или повече таблици в базата данни. В повечето приложения,SELECT
е най-често използваната команда. При специфицирането наSELECT
запитване, потребителят специфицира описание на желания резултат, но без операциите, които трябва да се извършат, за да се постигне той. Прехвърлянето на запитване в ефективно подреждане за запитвания (query plan) се извършва от системата или по-специално от оптимизатора на запитвания(query optimizer).- Често срещани ключови, думи свързани със
SELECT
, са:FROM
се използва за индикация от кои таблици се взимат данните, както и как тези таблици се свързват (JOIN).WHERE
– идентифицира кои редове да се извлекат.GROUP
BY
– комбинира/групира редове със сходни данни в елементи с по-малко редове.HAVING
– кои от „комбинираните редове“ (комбинираните редове се получават от запитване включващоGROUP
BY
или когато часттаSELECT
съдържа съединения /aggregates/), трябва да се извлекат.HAVING
функционира общо взето катоWHERE
, но използва резултата отGROUP
BY
и може да използва съединяващи функции (aggregate functions).ORDER
BY
– идентифицира кои колони се използват за сортиране на резултата.
- Често срещани ключови, думи свързани със
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
Източници[редактиране | редактиране на кода]
- ↑ ((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. Посетен на 9 юни 2007.
- ↑ 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
- ↑ www-03.ibm.com
- ↑ archives.postgresql.org
Външни препратки[редактиране | редактиране на кода]
- Discussion on alleged SQL flaws (C2 wiki)
- SQL tutorial ((en))
- Oracle SQL tutorials ((en))
- Web page about FSQL: References and links.
- Galindo J., Urrutia A., Piattini M., „Fuzzy Databases: Modeling, Design and Implementation“. Idea Group Publishing Hershey, USA, 2005.