SQL (от  — язык структурированных запросов) — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.

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

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

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

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

История

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

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

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

Первая общедоступная статья о SEQUEL была опубликована в 1974 году. Через месяц после этого Рей Бойс скончался. После его смерти язык SEQUEL продолжил развитие как часть проекта IBM System R. Пэт Селинджер () занималась разработкой стоимостного оптимизатора (), Рэймонд Лори () занимался компилятором запросов.

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

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

Изначально термин «SQL» являлся аббревиатурой, однако в первом официальном стандарте ANSI 1986 года фраза «Structured Query Language» нигде не упоминалась, а язык назывался «Database Language — SQL»American National Standard for information systems — Database Language — SQL (ANSI X3.135-1986). Approved October 16, 1986. American National Standards Institute, Inc. В последующих стандартах ISO/IEC 9075:1989 и ISO/IEC 9075:1992 вместо «Database Language — SQL» использовалось название «Database Language SQL», или просто «language SQL»ISO/IEC 9075:1992, Database Language SQL  — July 30, 1992. Однако в описании стандарта ISO/IEC 9075-1:2011 на сайте ISO указывалось: «».

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

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

В 1983 году Международная организация по стандартизации (ISO) и Американский национальный институт стандартов (ANSI) приступили к разработке стандарта языка SQL. По прошествии множества консультаций и отклонения нескольких предварительных вариантов, в 1986 году ANSI представил свою первую версию стандарта, описанную в документе ANSI X3.135-1986 под названием «Database Language — SQL» (Язык баз данных SQL). Неофициально этот стандарт SQL-86 получил название SQL1. Год спустя была завершена работа над версией стандарта ISO 9075-1987 под тем же названием. Разработка этого стандарта велась под патронажем Технического комитета TC97 (), областью деятельности которого являлись процессы вычисления и обработки информации (). Именно его подразделение, именуемое как Подкомитет 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, включив в себя множество дополнений, имевшихся в предыдущих версиях инструкций.

Как и SQL1, SQL92 так же был разделён на несколько уровней, однако, во-первых, число уровней было увеличено с двух до трёх, а во-вторых, они получили названия вместо порядковых цифр: начальный (), средний (), полный (). Уровень «полный», как и Уровень 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.

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

Год Название Иное название Изменения 1986 SQL-86 SQL-87 Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году. 1989 SQL-89 FIPS 127-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 2011 SQL:2011 Реализована поддержка хронологических баз данных (PERIOD FOR), поддержка конструкции FETCH. 2016 SQL:2016 Защита на уровне строк, полиморфные табличные функции, JSON.2023SQL:2023Операции над графами. Агрегатная функция ANY_VALUE(). Поддержка шестнадцатеричных/двоичных/восьмеричных литералов, улучшение поддержки JSON.

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

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

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