Открыть сервис

Стандарт SQL

SQL (Structured Query Language, структурированный язык запросов) — это декларативный язык программирования, предназначенный для управления данными в реляционных системах управления базами данных (СУБД). SQL является основным инструментом для создания, модификации, хранения и извлечения данных, а также для управления доступом к ним. Стандарт SQL представляет собой набор спецификаций, разрабатываемых и поддерживаемых международными организациями по стандартизации, которые определяют синтаксис, семантику и функциональные возможности языка, обеспечивая переносимость кода между различными СУБД.

История развития

Предпосылки и создание

В конце 1960-х — начале 1970-х годов Эдгар Кодд, работавший в IBM, разработал реляционную модель данных, которая легла в основу современных баз данных. В 1974 году исследователи IBM Дональд Чемберлин и Рэймонд Бойс создали язык SEQUEL (Structured English Query Language), предназначенный для работы с реляционными базами данных в рамках проекта System R. Первая реализация SEQUEL была коммерчески недоступна, но послужила прототипом для будущего SQL.

В 1979 году компания Relational Software, Inc. (позже переименованная в Oracle) выпустила первую коммерческую реализацию SQL, опередив IBM. Это стало стимулом для унификации языка, так как разные производители начали создавать собственные диалекты, что затрудняло переносимость приложений.

Первый стандарт (SQL-86)

В 1986 году Американский национальный институт стандартов (ANSI) принял первый официальный стандарт SQL, известный как SQL-86. В 1987 году к нему присоединилась Международная организация по стандартизации (ISO). Этот стандарт зафиксировал базовый синтаксис языка: операторы SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE INDEX и другие. Однако он был достаточно ограниченным и не охватывал многие важные возможности, такие как триггеры, хранимые процедуры или управление транзакциями.

SQL-89 и SQL-92

Стандарт SQL-89 (ANSI X3.135-1989) внёс незначительные изменения и уточнения, но не добавил принципиально новых функций. Настоящий прорыв произошёл в 1992 году с выходом SQL-92 (также известного как SQL2). Этот стандарт значительно расширил язык, включив в него:

  • Операции соединения таблиц (JOIN), включая INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN.
  • Поддержку целостности данных (ограничения PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE).
  • Управление транзакциями (COMMIT, ROLLBACK).
  • Динамический SQL.
  • Типы данных DATE, TIME, TIMESTAMP, INTERVAL.

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

SQL:1999 (SQL3)

Стандарт SQL:1999 (SQL3) был опубликован в 1999 году и стал самым масштабным обновлением. Он добавил в язык множество объектно-реляционных возможностей:

  • Типы данных, определяемые пользователем (UDT).
  • Наследование таблиц и типов.
  • Рекурсивные запросы (с помощью WITH RECURSIVE).
  • Триггеры (процедуры, автоматически выполняемые при событиях в таблице).
  • Хранимые процедуры и функции на языке SQL/PSM (Persistent Stored Modules).
  • Поддержка больших объектов (BLOB, CLOB).
  • Новые типы данных: BOOLEAN, ARRAY, ROW.

SQL:2003

Стандарт SQL:2003 ввёл важные нововведения, связанные с обработкой XML-данных:

  • SQL/XML — расширение, позволяющее генерировать, хранить и запрашивать XML-документы из SQL-запросов.
  • Функции окна (Window Functions), такие как ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), которые позволяют выполнять вычисления над наборами строк, связанных с текущей строкой.
  • Генерация последовательностей (GENERATED AS IDENTITY).
  • MERGE (upsert) — оператор, объединяющий вставку и обновление данных.

SQL:2006, SQL:2008, SQL:2011

Последующие версии стандарта уточняли и расширяли существующие возможности:

  • SQL:2006 — улучшение поддержки XML и XQuery.
  • SQL:2008 — добавление оператора TRUNCATE TABLE, расширение синтаксиса FETCH FIRST и OFFSET для ограничения количества строк.
  • SQL:2011 — введение поддержки темпоральных таблиц (Temporal Tables), позволяющих хранить историю изменений данных и выполнять запросы к данным на определённый момент времени.

SQL:2016 и SQL:2023

Стандарт SQL:2016 добавил:

  • Поддержку JSON (JavaScript Object Notation) — функции для разбора, создания и запросов JSON-документов.
  • Полнотекстовый поиск (Full-Text Search) — стандартизированные функции для поиска по текстовым полям.
  • Политики доступа на уровне строк (Row-Level Security) — механизм ограничения видимости данных для разных пользователей.
  • Улучшение темпоральных таблиц.

Стандарт SQL:2023, опубликованный в июне 2023 года, является последней на данный момент версией. Он включает:

  • Расширенную поддержку JSON (JSON_TABLE, JSON_VALUE, JSON_QUERY, JSON_EXISTS).
  • Новые функции для работы с массивами и мультимножествами.
  • Улучшение функций окна (WINDOW clause).
  • Поддержку свойств графов (Graph properties) — начальная стандартизация для работы с графовыми данными.

Структура и компоненты

Стандарт SQL определяет несколько основных подъязыков, каждый из которых отвечает за определённый класс операций.

DDL (Data Definition Language)

Язык определения данных используется для создания, изменения и удаления объектов базы данных (таблиц, представлений, индексов, схем). Основные операторы:

  • CREATE — создание объекта.
  • ALTER — изменение структуры объекта.
  • DROP — удаление объекта.
  • TRUNCATE — удаление всех данных из таблицы без удаления самой таблицы.

DML (Data Manipulation Language)

Язык манипулирования данными предназначен для работы с содержимым таблиц. Основные операторы:

  • SELECT — извлечение данных.
  • INSERT — добавление новых строк.
  • UPDATE — изменение существующих данных.
  • DELETE — удаление строк.

DCL (Data Control Language)

Язык управления данными отвечает за права доступа и безопасность. Основные операторы:

  • GRANT — предоставление прав пользователю или роли.
  • REVOKE — отзыв прав.

TCL (Transaction Control Language)

Язык управления транзакциями позволяет управлять группами операций, которые должны быть выполнены атомарно (все или ничего). Основные операторы:

  • BEGIN TRANSACTION — начало транзакции.
  • COMMIT — фиксация изменений.
  • ROLLBACK — отмена изменений.
  • SAVEPOINT — установка точки сохранения внутри транзакции.

Уровни соответствия

Стандарт SQL определяет несколько уровней соответствия, которые позволяют производителям СУБД реализовывать не все возможности, а только определённый набор. Это деление было особенно актуально для SQL-92, где выделялись три уровня:

  • Entry SQL (начальный) — минимальный набор функций, обязательный для всех СУБД.
  • Intermediate SQL (промежуточный) — расширенный набор, включающий, например, соединения JOIN и ограничения целостности.
  • Full SQL (полный) — полная реализация всех возможностей стандарта, включая триггеры, хранимые процедуры и динамический SQL.

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

Диалекты и совместимость

Несмотря на существование международного стандарта, на практике большинство СУБД (Oracle, Microsoft SQL Server, PostgreSQL, MySQL, SQLite) реализуют лишь его подмножество, добавляя при этом собственные расширения и диалекты. Это приводит к тому, что SQL-код, написанный для одной СУБД, может не работать или работать некорректно в другой.

Основные различия между диалектами касаются:

  • Типов данных (например, VARCHAR2 в Oracle против VARCHAR в PostgreSQL).
  • Синтаксиса функций (например, функция для получения текущей даты: CURRENT_DATE в SQL Server, SYSDATE в Oracle, NOW() в PostgreSQL).
  • Управления транзакциями (автоматический коммит в MySQL по умолчанию).
  • Реализации хранимых процедур (PL/SQL в Oracle, T-SQL в SQL Server, PL/pgSQL в PostgreSQL).
  • Поддержки оконных функций (некоторые старые версии MySQL не поддерживали их до версии 8.0).

Критика

Стандарт SQL подвергается критике по нескольким причинам:

  • Сложность и объём. Современные версии стандарта (SQL:2023) насчитывают тысячи страниц, что делает его полное изучение и реализацию крайне трудоёмкими.
  • Неполнота реализации. Ни одна СУБД не реализует стандарт полностью, что приводит к фрагментации и зависимости от конкретного производителя.
  • Отсутствие некоторых современных возможностей. Например, стандарт долгое время не включал поддержку JSON, что привело к появлению нестандартных решений.
  • Императивные конструкции. Несмотря на декларативную природу, SQL содержит императивные элементы (хранимые процедуры, триггеры), что усложняет его использование для некоторых задач.

Значение

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

Источники

  1. Международный стандарт ISO/IEC 9075-1:2023 «Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework)».
  2. Международный стандарт ISO/IEC 9075-2:2023 «Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation)».
  3. Книга «SQL: The Complete Reference» (James R. Groff, Paul N. Weinberg, Andrew J. Oppel).
  4. Документация по стандартам SQL на сайте ISO (International Organization for Standardization).
  5. Обзорные статьи на сайте «SQL Standards» (sqlstandards.org).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →