Стандарт 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 остаётся незаменимым инструментом для задач, требующих сложных запросов, целостности данных и транзакционной обработки.
Источники
- Международный стандарт ISO/IEC 9075-1:2023 «Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework)».
- Международный стандарт ISO/IEC 9075-2:2023 «Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation)».
- Книга «SQL: The Complete Reference» (James R. Groff, Paul N. Weinberg, Andrew J. Oppel).
- Документация по стандартам SQL на сайте ISO (International Organization for Standardization).
- Обзорные статьи на сайте «SQL Standards» (sqlstandards.org).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →