SQL

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
SQL
Класс языка Мультипарадигмальный
Появился в 1974
Автор Дональд Чемберлин
Рэймонд Бойс
Разработчик ISO/IEC
Расширениефайлов .sql
Выпуск
Система типов Статическая,строгая
Диалекты SQL-86, SQL-89,SQL-92,SQL:1999,SQL:2003,SQL:2008,SQL:2011,SQL:2016
Испытал влияние Datalog
Повлиял на Agena,CQL,LINQ,Windows PowerShell[2]
Сайт iso.org/standard/63555.h…
Логотип ВикискладаМедиафайлы на Викискладе
SQL
Расширение .sql
MIME-тип application/x-sqlиapplication/sql[3][4]
Разработчик ISO/IEC
Опубликован 1986
Последний выпуск SQL:2023 (2023)
Тип формата Базы данных
Расширен из логика первого порядка
Стандарт(ы) ISO/IEC 9075
Открытый формат? Да
Сайт iso.org/standard/76583.h…
Логотип ВикискладаМедиафайлы на Викискладе

SQL(МФА:[ˈɛsˈkjuˈɛl];аббр.отангл.StructuredQueryLanguage— «язык структурированных запросов») —декларативныйязык программирования,применяемый для создания, модификации и управления данными вреляционной базе данных,управляемой соответствующейсистемой управления базами данных.

Является, прежде всего,информационно-логическим языком,предназначенным для описания, изменения и извлечения данных, хранимых вреляционных базах данных.В общем случае SQL (без ряда современных расширений) считаетсяязыком программированиянеполным по Тьюрингу,но вместе с тем стандарт языка спецификациейSQL/PSMпредусматривает возможность егопроцедурных расширений.

Изначально SQL был основным способом работы пользователя сбазой данныхи позволял выполнять следующий набор операций:

  • создание в базе данных новой таблицы;
  • добавление в таблицу новых записей;
  • изменение записей;
  • удаление записей;
  • выборка записей из одной или нескольких таблиц (в соответствии с заданным условием);
  • изменение структур таблиц.

Со временем SQL усложнился — обогатился новыми конструкциями, обеспечил возможность описания и управления новыми хранимыми объектами (например, индексы, представления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.

При всех своих изменениях SQL остаётся самым распространённым лингвистическим средством для взаимодействия прикладного программного обеспечения с базами данных. В то же время современныеСУБД,а также информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов.

Первые разработки

[править|править код]

Дональд Чемберлин(Donald D. Chamberlin) иРаймонд Бойсначали работу над языком реляционных баз данных после того, как узнали ореляционной моделиотЭ. Кодда,встретившись с ним на симпозиуме в Нью-Йорке в 1972 году. По воспоминаниям Чемберлина, это было «откровением». Авторы были впечатлены выразительностью и компактностьюреляционной алгебрыи реляционного исчисления, предложенных Э. Коддом, для представления сложных запросов. Кодд использовал символическую запись с математическими обозначениями операций, но Чемберлин и Бойс захотели спроектировать язык так, чтобы им мог воспользоваться любой пользователь, даже не имеющий навыков программирования и знаний математики[5].

После симпозиума Кодда, Чемберлин и Бойс провели следующий год в экспериментах над дизайном языка. Первой их попыткой был языкSQUARE(Specifying Queries in A Relational Environment), но он был сложен в практическом использовании из-за математической нотации с верхними и нижними индексами.

После переезда в Исследовательскую лабораторию Сан-Хосе в 1973 году, Чемберлин и Бойс начали работу над совершенно новым языком, который был названSEQUEL(отStructured English QUEry Language,«английский язык структурированных запросов»). Авторы надеялись, что после небольшой практики даже пользователи-неспециалисты (например, бухгалтеры, инженеры, архитекторы, градостроители[6]) смогут читать запросы так, словно последние написаны на обычном английском языке. Язык был назван «декларативным», поскольку он описывал желаемый результат, а не детальный план поиска этой информации. Предполагалось, что переводом декларативного запроса в детальный план исполнения будет заниматься специальный оптимизирующийкомпилятор[5].

Первая общедоступная статья о SEQUEL была опубликована в 1974 году[6].Через месяц после этого Рей Бойс скончался. После его смерти язык SEQUEL продолжил развитие как часть проектаIBM System R[5].Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (cost-based optimizer), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.

В 1977 году авторы получили письмо от юриста британской авиастроительной группы компанийHawker Siddeley,уведомляющее, что этой компании принадлежит торговая марка «SEQUEL». Было принято решение сократить название языка до SQL (отStructured Query Language,«язык структурированных запросов»)[7][8].Тем не менее, первоначальное название SEQUEL повлияло на современное произношение аббревиатуры SQL (см. нижеПерейти к разделу «#Произношение»).

Первыми СУБД, поддерживающими новый язык, стали в1979 годуOracle V2 для машинVAXкомпанииRelational Software(впоследствии ставшей компаниейOracle) иSystem/38фирмы IBM, основанная на System/R.

Изначально термин SQL являлся аббревиатурой, однако в первом официальном стандарте ANSI 1986 года фраза «Structured Query Language» нигде не упоминалась, а язык назывался «Database Language — SQL»[9].В последующих стандартах ISO/IEC 9075:1989 и ISO/IEC 9075:1992 вместо «Database Language — SQL» использовалось название «Database Language SQL», или просто «language SQL»[10].Однако в описании стандарта ISO/IEC 9075-1:2011 на сайте ISO указывалось: «ISO/IEC 9075 defines Structured Query Language (SQL)»[11].

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

Стандартизация

[править|править код]

Поскольку к началу 1980-х годов существовало несколько вариантов СУБД разных производителей, причём, каждый из них обладал собственной реализацией языка запросов, было принято решение разработать стандарт языка, который будет гарантировать переносимость ПО с одной СУБД на другую (при условии, что они будут поддерживать этот стандарт).

В 1983 годуМеждународная организация по стандартизации(ISO) иАмериканский национальный институт стандартов(ANSI) приступили к разработке стандарта языка SQL. По прошествии множества консультаций и отклонения нескольких предварительных вариантов, в 1986 году ANSI представил свою первую версию стандарта, описанную в документе ANSI X3.135-1986 под названием «Database Language — SQL» (Язык баз данных SQL)[9].Неофициально этот стандарт SQL-86 получил название SQL1. Год спустя была завершена работа над версией стандарта ISO 9075-1987 под тем же названием. Разработка этого стандарта велась под патронажем Технического комитета TC97 (англ.Technical Committee TC97), областью деятельности которого являлись процессы вычисления и обработки информации (англ.Computing and Information Processing). Именно его подразделение, именуемое как Подкомитет SC21 (англ.Subcommittee SC21), курировало разработку стандарта, что стало залогом идентичности стандартов ISO и ANSI для SQL1 (SQL-86).

Стандарт SQL1 разделялся на два уровня. Первый уровень представлял собой подмножество второго уровня, описывавшего весь документ в целом. То есть, такая структура предусматривала, что не все спецификации стандарта SQL1 будут относиться к Уровню 1. Тем самым поставщик, заявлявший о поддержке данного стандарта, должен был заявлять об уровне, которому соответствует его реализация языка SQL. Это значительно облегчило принятие и поддержку стандарта, поскольку производители могли реализовывать его поддержку в два этапа.

Со временем к стандарту накопилось несколько замечаний и пожеланий, особенно с точки зрения обеспечения целостности и корректности данных, в результате чего в 1989 году данный стандарт был расширен, получив название SQL89. В частности, в него была добавлена концепцияпервичногоивнешнего ключей.ISO-версия документа получила название ISO 9075:1989 «Database Language SQL with Integrity Enhancements» (Язык баз данных SQL с добавлением контроля целостности). Параллельно была закончена и ANSI-версия.

Сразу после завершения работы над стандартом SQL1 в 1987 году была начата работа над новой версией стандарта, который должен был заменить стандарт SQL89, получив название SQL2, поскольку дата принятия документа на тот момент была неизвестна. Таким образом, фактически SQL89 и SQL2 разрабатывались параллельно. Новая версия стандарта была принята в 1992 году, заменив стандарт SQL89. Новый стандарт, озаглавленный как SQL92, представлял собой по сути расширение стандарта SQL1, включив в себя множество дополнений, имевшихся в предыдущих версиях инструкций[10].

Как и SQL1, SQL92 так же был разделён на несколько уровней, однако, во-первых, число уровней было увеличено с двух до трёх, а во-вторых, они получили названия вместо порядковых цифр:начальный(англ.entry),средний(англ.intermediate),полный(англ.full). Уровень «полный», как и Уровень 2 в SQL1, подразумевал весь стандарт целиком. Уровень «начальный» представлял собой подмножество уровня «средний», в свою очередь, представлявшего собой подмножество уровня «полный». Уровень «начальный» был сравним с Уровнем 2 стандарта SQL1, но спецификации этого уровня были несколько расширены. Таким образом, цепочка включений уровней стандартов выглядела примерно следующим образом: SQL1 Уровень 1 → SQL1 Уровень 2 → SQL92 «Начальный» → SQL92 «Средний» → SQL92 «Полный».

После принятия стандарта SQL92 к нему были добавлены ещё несколько документов, расширявших функциональность языка. Так, в 1995 году был принят стандартSQL/CLI(Call Level Interface, интерфейс уровня вызовов), впоследствии переименованный в CLI95. На следующий год был принят стандартSQL/PSM(Persistent Stored Modules, постоянно хранимые модули), получивший название PSM-96.[12]

Следующим стандартом сталSQL:1999(SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже (SQL:2008). История версий стандарта:

Год Название Иное название Изменения
1986 SQL-86 SQL-87 Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году.
1989 SQL-89 FIPS127-1 Немного доработанный вариант предыдущего стандарта.
1992 SQL-92 SQL2, FIPS 127-2 Значительные изменения (ISO 9075); уровеньEntry Levelстандарта SQL-92 был принят как стандарт FIPS 127-2.
1999 SQL:1999 SQL3 Добавлена поддержкарегулярных выражений,рекурсивныхзапросов, поддержкатриггеров,базовые процедурные расширения, нескалярные типы данных и некоторыеобъектно-ориентированныевозможности.
2003 SQL:2003 Введены расширения для работы сXML-данными, оконные функции (применяемые для работы сOLAP-базами данных), генераторы последовательностей и основанные на них типы данных.
2006 SQL:2006 Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL иXQuery.
2008 SQL:2008 Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003[13]
2011 SQL:2011 Реализована поддержкахронологических баз данных(PERIOD FOR), поддержка конструкции FETCH[14].
2016 SQL:2016 Защита на уровне строк, полиморфные табличные функции,JSON.
2023 SQL:2023 Операции надграфами.Агрегатная функция ANY_VALUE(). Поддержка шестнадцатеричных/двоичных/восьмеричных литералов, улучшение поддержкиJSON.[15]

Вопросы совместимости

[править|править код]

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

До1996 годавопросами соответствия коммерческих реализаций SQL стандарту занимался в основномНациональный институт стандартов и технологий(NIST), который и устанавливал уровень соответствия стандарту. Поздне́е подразделение, занимавшееся СУБД, было расформировано, и на текущий момент все усилия по проверке СУБД на соответствие стандарту ложатся на её производителя.

Впервые понятие «уровня соответствия» было предложено в стандарте SQL-92. А именно, ANSI и NIST определяли четыре уровня соответствия реализации этому стандарту:

  1. Entry(базовый)
  2. Transitional(переходный) — проверку на соответствие этому уровню проводил только NIST
  3. Intermediate(промежуточный)
  4. Full(полный)

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

Положение изменилось с введением стандарта SQL:1999. Отныне стандарт приобрёл модульную структуру — основная часть стандарта была вынесена в раздел «SQL/Foundation», все остальные были выведены в отдельные модули. Соответственно, остался только один уровень совместимости —Core,что означало поддержку этой основной части. Поддержка остальных возможностей оставлена на усмотрение производителей СУБД. Аналогичное положение имело место и с последующими версиями стандарта.

ДвижениеNoSQLвторой половины 2000-х годов, зафиксировавшее в своём названии «отрицание SQL», было вызвано не столько отказом от языка как такового, а объединило СУБД, отказавшиеся от реляционной модели и принципов строгой согласованности радигоризонтальной масштабируемостии ряда других качеств. При этом в ранних NoSQL-системах поддержка SQL действительно отсутствовала, со временем некоторые из таких СУБД обзавелись специфическими SQL-подобными языками запросов (CQL,N1QL,AQL[англ.]и другими). В 2010-е годы ряд СУБД отнёс себя к категорииNewSQL,в них при сохранении свойств масштабируемости NoSQL-систем реализована и поддержка SQL, в разных системах — разной степени совместимости со стандартами. Кроме того, поддержка SQL в 2010-е годы появилась не только в СУБД, но и дляэкосистемы Hadoop(Spark SQL,Phoenix[англ.],Impala), а также всвязующем программном обеспечении(брокер сообщенийKafka,система потоковой обработкиFlink), таким образом, язык постепенно становится фактическим стандартом доступа к любым обрабатываемым данным, не только реляционной природы.

Язык SQL представляет собой совокупность операторов, инструкций, вычисляемых функций.

Согласно общепринятомустилю программирования,операторы (и другие зарезервированные слова) в SQL обычно рекомендуется писатьпрописными буквами[16].

Операторы SQL делятся на:

  • операторы определения данных (Data Definition Language,DDL):
    • CREATE создаёт объект базы данных (саму базу, таблицу,представление,пользователя и так далее),
    • ALTER изменяет объект,
    • DROP удаляет объект;
  • операторы манипуляции данными (Data Manipulation Language,DML):
    • SELECTвыбирает данные, удовлетворяющие заданным условиям,
    • INSERTдобавляет новые данные,
    • UPDATEизменяет существующие данные,
    • DELETEудаляет данные;
  • операторы определения доступа к данным (Data Control Language,DCL):
    • GRANT предоставляет пользователю (группе) разрешения на определённые операции с объектом,
    • REVOKE отзывает ранее выданные разрешения,
    • DENY задаёт запрет, имеющий приоритет над разрешением;
  • операторы управлениятранзакциями(Transaction Control Language,TCL):
    • COMMITприменяет транзакцию,
    • ROLLBACKоткатывает все изменения, сделанные в контексте текущей транзакции,
    • SAVEPOINTделит транзакцию на более мелкие участки.

Преимущества и недостатки

[править|править код]

Преимущества

[править|править код]
Независимость от конкретной СУБД

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

Наличие стандартов

Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах (например, базовая часть стандарта SQL:2003 состоит из более чем 1300 страниц текста).

Декларативность

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

Несоответствие реляционной модели данных

Создатели реляционной модели данныхЭдгар Кодд,Кристофер Дейти их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие дефекты SQL с точки зрения реляционной теории[17]:

  • допущение строк-дубликатов в таблицах и результатах выборок, что в рамках реляционной модели данных невозможно и недопустимо;
  • поддержка неопределённых значений (NULL), создающая фактически многозначную логику;
  • значимость порядка столбцов, возможность ссылок на столбцы по номерам (в реляционной модели столбцы должны быть равноправны);
  • допущение столбцов без имени, дублирующихся имён столбцов.

В опубликованном Кристофером Дейтом иХью ДарвеномТретьем манифесте[18]они излагают принципы СУБД следующего поколения и предлагают языкTutorial D,который является подлинно реляционным.

Сложность

Хотя SQL и задумывался как средство работы конечного пользователя, позже он стал настолько сложным, что превратился в инструмент программиста.

Отступления от стандартов

Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.

Сложность работы с иерархическими структурами

Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения (например, вOracle Databaseиспользуется выражениеCONNECT BY). В настоящее время в ANSI стандартизована рекурсивная конструкцияWITHиз диалекта SQLDB2Microsoft SQL Serverрекурсивные запросы (Recursive Common Table Expressions) появились с версии 2005[19].

Процедурные расширения

[править|править код]

Поскольку SQL не является привычным процедурным языком программирования (то есть не предоставляет средств для построения циклов, ветвлений и так далее), вводимые разными производителями расширения касались в первую очередь процедурных расширений. Этохранимые процедуры(stored procedures) и процедурные языки-«надстройки». Практически в каждой СУБД применяется свой процедурный язык, в частности, в Oracle Database используетсяPL/SQL(поддерживается также вDB2иTimesten[англ.]), в Interbase и Firebird —PSQL,в DB2 —SQL PL[англ.]Microsoft SQL ServerиAdaptive Server EnterpriseTransact-SQLPostgreSQLPL/pgSQL.

Произношение

[править|править код]

Несмотря на то, что аббревиатура SQL формально должна произносится как «эс-кью-эл» ([ˈɛsˈkjuˈɛl]), первоначальная версия сокращённого названия языка — SEQUEL — совпадала по написанию со словомsequelи до сих пор часто произносится как «си́квел» (/ˈskwəl/)[20][21].

Различия в произношении наблюдаются даже среди специалистов. Так, один из авторов языка, Д. Чемберлин использует произношение «эс-кью-эл», аК. Дейт— «сиквел»[21].В ролике, рекламирующемMicrosoft SQL Server,Билл Гейтсна 16-й секунде использует вариант «сиквел», а на 38-й — «эс-кью-эл»[22].

Официальное произношениеСУБДMySQL,согласно документации, — «Май-эс-кью-эл»[23],PostgreSQL— "Пост-грес-кью-эл", тогда как разработчики Microsoft SQL Server и Oracle предпочитают произношение «сиквел», например, в таких терминах как PL/SQL и T-SQL[21].

  1. SQL:2023 is out— 2023.
  2. Ryan Paul.A guided tour of the Microsoft Command Shell.Ars Technica.Дата обращения: 10 апреля 2011.Архивировано3 февраля 2012 года.
  3. http:// iana.org/assignments/media-types/application/sql— 2013.
  4. Shafranovich Y.The application/sql Media Type(англ.)IETF,2013. — 5 p. —doi:10.17487/RFC6922
  5. 123Chamberlin, Donald (2012). "Early History of SQL".IEEE Annals of the History of Computing.34(4): 78—82.doi:10.1109/MAHC.2012.61.S2CID1322572.
  6. 12Donald D. Chamberlin, Raymond F. Boyce.SEQUEL: A structured English query language // Proceedings of the SIGFIDET '74. —N. Y.:AC, 1974. —С. 249—264.—doi:10.1145/800296.811515.
  7. Andy Oppel.Databases Demystified.— San Francisco, CA: McGraw-Hill Osborne Media. — С. 90—91. —ISBN 0-07-146960-5.Архивировано14 января 2012 года.
  8. Chamberlin, Donald D.Oral history interview with Donald D. Chamberlin(3 октября 2001). — «We changed the original name "SEQUEL" to SQL because we got a letter from somebody’s lawyer that said the name "SEQUEL" belonged to them. We shortened it to SQL, for Structured Query Language, and the product was known as SQL/DS.» Дата обращения: 14 января 2020.Архивировано24 февраля 2020 года.
  9. 12American National Standard for information systems — Database Language — SQL(ANSI X3.135-1986). Approved October 16, 1986. American National Standards Institute, Inc
  10. 12ISO/IEC 9075:1992, Database Language SQLАрхивная копияот 21 июня 2006 наWayback Machine- July 30, 1992
  11. ISO/IEC 9075-1:2011 Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework).Дата обращения: 9 июня 2023.Архивировано16 февраля 2023 года.
  12. Standardization of SQL.Дата обращения: 24 августа 2011.Архивировано11 января 2012 года.
  13. Re: Window functions patch v04 for the September commit fest.Дата обращения: 6 октября 2008.Архивировано11 января 2009 года.
  14. Fred Zemke.What's new in SQL:2011(неопр.).— 2012.Архивировано10 августа 2013 года.
  15. Eisentraut, PeterSQL:2023 is out(англ.).Peter Eisentraut(1 июня 2023). Дата обращения: 1 октября 2023.Архивировано1 октября 2023 года.
  16. Джо Селко.Стиль программирования Джо Селко на SQL. —СПб.:Питер, 2006. — 206 с.
  17. O’Reilly NetworkАрхивировано3 мая 2007 года.An Interview with Chris Date
  18. The Third Manifesto.Дата обращения: 4 апреля 2007.Архивировано19 декабря 2008 года.
  19. Nigel Rivett.SQL Server 2005 Common Table ExpressionsАрхивная копияот 3 апреля 2019 наWayback Machine// red-gate, 02.08.2006
  20. Is it Pronounced “S-Q-L” or “Sequel”?Архивная копияот 9 июня 2023 наWayback Machine// database.guide, 05.06.2016
  21. 123S.Q.L or Sequel: How to Pronounce SQL?Архивная копияот 8 июня 2023 наWayback Machine// learnsql, 03.09.2014
  22. EsberGatesSQLServerCommercialнаYouTube
  23. MySQL 5.7 Reference ManualАрхивная копияот 29 мая 2023 наWayback Machine

    The official way to pronounce “MySQL” is “My Ess Que Ell” (not “my sequel” )