SQL (акроним от англ. Structured Query Language — «язык структурированных запросов») — это декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционных базах данных. Исторически и теоретически SQL считается неполным по Тьюрингу языком, поскольку его первоначальная архитектура была строго ограничена операциями над реляционными структурами. Однако непрерывное развитие стандартов и внедрение новых синтаксических конструкций значительно расширили его вычислительные возможности, превратив SQL в фундаментальный инструмент в истории языков программирования.

В профессиональной среде существует два устоявшихся варианта произношения названия языка. В русскоязычном сообществе преобладает чтение аббревиатуры по буквам («эс-кью-эл»), в то время как в англоязычной среде (в частности, в США) часто используется историческое произношение «сикуэл».

История создания

Концептуальной основой для создания языка послужила реляционная модель данных, представленная в 1972 году Эдгаром Коддом. До появления реляционной алгебры информация хранилась в сложных, неструктурированных файловых системах и многоуровневых структурах (например, при программировании на языке Кобол), что делало извлечение данных крайне трудоемким процессом.

После ознакомления с докладом Кодда, исследователи Дональд Чемберлин и Рэймонд Бойс приступили к разработке специализированного языка для новой модели. Разработка велась в течение 1973–1974 годов. Изначально авторы предполагали, что реляционная модель настолько интуитивно понятна, что новый язык запросов будет массово использоваться неспециалистами в области информатики: бухгалтерами, инженерами и архитекторами. В эпоху начала повсеместного распространения персональных компьютеров ожидалось, что написание запросов к базам данных станет таким же обыденным навыком, как и базовое программирование на языке Бейсик.

Первая научная публикация, описывающая новый язык, вышла в 1974 году. Изначально язык получил название SEQUEL (Structured English Query Language). Однако в 1977 году выяснилось, что данная аббревиатура уже зарегистрирована как торговая марка другой компанией в США, в результате чего наименование было официально сокращено до SQL.

Первой коммерческой реляционной системой управления базами данных (СУБД), успешно внедрившей язык SQL, стала система Oracle в 1979 году. На рубеже 1970–1980-х годов существовали и альтернативные языки запросов (например, язык QUEL в СУБД Ingres), однако SQL в кратчайшие сроки вытеснил конкурентов и стал доминирующим индустриальным стандартом.

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

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

Эволюция официальных стандартов SQL:

  • SQL-86 — первый официальный стандарт, принятый в 1986 году. Разделялся на два уровня соответствия, что позволяло разработчикам СУБД внедрять поддержку стандарта поэтапно.
  • SQL-92 — значительно расширенный стандарт, включавший уже три уровня сложности (начальный, средний и полный).
  • SQL:1999 (SQL-99) — переломный момент в развитии языка. В стандарт были добавлены регулярные выражения, рекурсивные запросы, триггеры и, что наиболее важно, процедурные элементы. Попытки следовать модным тенденциям 1990-х годов привели к внедрению в SQL некоторых концепций объектно-ориентированного программирования.
  • SQL:2003 — стандарт, обогативший язык механизмами для работы с данными в формате XML.
  • Последующие редакции продолжали интегрировать язык с веб-технологиями, а актуальный стандарт SQL:2023 включил в себя даже операции над графами.

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

Парадигмы и синтаксис

SQL изначально проектировался как строго декларативный язык. Это означает, что программист описывает только то, какой результат (какие данные) необходимо получить, но не задает пошаговый алгоритм их извлечения — построение оптимального плана выполнения запроса берет на себя ядро СУБД.

Фундаментальной операцией и «сердцем» языка является выборка данных, реализуемая с помощью оператора SELECT. Помимо извлечения информации, язык обладает встроенными конструкциями для удаления, добавления и модификации записей. В реальных программных комплексах сложные многоуровневые выборки могут реализовываться одним единственным, но крайне объемным оператором SELECT.

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

  SELECT * 
  FROM Рабочие 
  WHERE Зарплата > 50000

В современной индустрии (начиная с середины 1990-х годов) чистый код на SQL часто скрыт от конечного пользователя за визуальными интерфейсами. Пользователь взаимодействует с графическими формами (как, например, в Microsoft Access), а программа автоматически генерирует соответствующий SQL-код. В 2000-е годы классическим паттерном разработки являлась связка визуальной объектно-ориентированной среды (например, Delphi), транслятора SQL и файловой базы данных (например, Paradox).

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

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

Главным преимуществом SQL является его универсальность и статус «латыни для специалистов по базам данных». Язык выступает единым общепринятым стандартом: не SQL адаптируется под базы данных, а архитектура всех реляционных баз данных строится вокруг синтаксиса SQL. Декларативность языка освобождает разработчика от необходимости описывать низкоуровневые механизмы доступа к физическим носителям.

Однако язык подвергается серьезной критике по ряду архитектурных и методологических аспектов:

  • Нарушение чистоты реляционной модели. Теоретическая реляционная модель базируется на строгой бинарной логике Аристотеля (истина или ложь, данные существуют или отсутствуют). В SQL же внедрено понятие неопределенного значения (NULL), что переводит систему в плоскость троичной логики.
  • Проблема дубликатов. Язык допускает наличие дублирующихся записей как в самих таблицах, так и в результатах выборок, что прямо противоречит математической теории множеств, на которой основана реляционная модель.
  • Работа со столбцами. В SQL порядок следования столбцов имеет значение; к столбцам можно обращаться по их порядковым номерам. Допускается создание таблиц с безымянными столбцами или столбцами с дублирующимися именами. Классическая реляционная модель требует абсолютного равноправия атрибутов и запрещает подобное поведение.
  • Сложность оптимизации. При работе с огромными массивами данных (размером в целые серверные комнаты) программист вынужден отказываться от декларативного подхода и искусственно переписывать многоэтажные SQL-запросы специфическим образом, чтобы помочь оптимизатору СУБД выполнить запрос быстрее.
  • Иерархические данные. Поскольку язык жестко привязан к табличной реляционной модели, он крайне неэффективно работает с древовидными структурами данных. Хотя разработчики пытаются внедрять обходные пути для работы с графами и деревьями, архитектурно SQL для этого не предназначен.

Альтернативные концепции

Ограничения реляционной модели и языка SQL привели к появлению во второй половине 2000-х годов движения NoSQL (нереляционные базы данных). Сторонники этого подхода призывали отказаться от табличной организации данных в пользу иных структур (документных, колоночных, графовых) со своими собственными языками запросов. Однако, несмотря на критику, реляционная логика остается оптимальной для большинства классических задач. В качестве компромисса возникла концепция NewSQL, которая стремится объединить высокую масштабируемость систем NoSQL с сохранением традиционной поддержки языка SQL.

См. также

Scala Scheme

Смотреть видео