SQL-92
SQL-92 (также известный как SQL2) — это третья версия стандарта языка структурированных запросов (SQL), принятая в 1992 году. Он является одной из наиболее значимых и широко внедрённых ревизий стандарта, заложившей основу для современного реляционного управления базами данных. SQL-92 определил синтаксис и семантику языка, обеспечив значительно более высокий уровень переносимости кода между различными системами управления базами данных (СУБД) по сравнению с предыдущими версиями.
История
Стандарт SQL был впервые принят Американским национальным институтом стандартов (ANSI) в 1986 году (SQL-86), а затем — Международной организацией по стандартизации (ISO) в 1987 году. Первая ревизия, SQL-89, была незначительным обновлением. Однако к началу 1990-х годов стало очевидно, что для обеспечения реальной совместимости и расширения функциональности требуется фундаментальная переработка.
Работа над SQL-92 (официальное обозначение — ISO/IEC 9075:1992) велась подкомитетом ISO/IEC JTC 1/SC 32. Стандарт был опубликован в 1992 году. Его ключевой целью было устранение неоднозначностей и пробелов, которые производители СУБД (такие как Oracle, IBM, Microsoft) трактовали по-своему, что приводило к фрагментации языка. SQL-92 стал первым стандартом, который ввёл чёткую трёхуровневую классификацию соответствия.
Классификация соответствия (Уровни SQL-92)
Для упрощения внедрения производителями, SQL-92 определил три уровня соответствия. СУБД могла претендовать на поддержку стандарта, реализовав хотя бы начальный уровень. Это стимулировало постепенную миграцию от проприетарных расширений к стандартному языку.
- Начальный уровень (Entry Level): Представляет собой строгое подмножество SQL-89. Он охватывает базовые операции: простые запросы
SELECT, вставку (INSERT), обновление (UPDATE), удаление (DELETE), создание таблиц (CREATE TABLE) и простые соединения (JOIN). Большинство коммерческих СУБД того времени (например, Oracle 7, IBM DB2, Microsoft SQL Server 4.2) быстро достигли этого уровня. - Промежуточный уровень (Intermediate Level): Включает все возможности начального уровня плюс значительное количество новых функций. Среди них: динамический SQL, управление курсорами с помощью
FETCH,DECLARE CURSOR, поддержка схем (SCHEMA), ограничения целостности (CHECK,UNIQUE,FOREIGN KEY), а также операции над множествами (UNION,INTERSECT,EXCEPT). Этот уровень стал де-факто стандартом для серьёзных приложений. - Полный уровень (Full Level): Включает все возможности промежуточного уровня и добавляет наиболее сложные конструкции: вложенные запросы с корреляцией (correlated subqueries), рекурсивные запросы (хотя полноценная рекурсия была стандартизирована позже), триггеры (в зачаточном виде), домены (
DOMAIN), а также полную поддержку соединений (NATURAL JOIN,CROSS JOIN,OUTER JOINс полным синтаксисом). Полный уровень был реализован лишь немногими СУБД того времени, так как требовал глубокой переработки ядра.
Основные нововведения и характеристики
SQL-92 ввёл множество конструкций, которые стали стандартом на десятилетия.
Типы данных
Стандарт впервые чётко определил и расширил набор встроенных типов данных:
- Символьные:
CHARACTER(n),CHARACTER VARYING(n)(илиVARCHAR),CHARACTER LARGE OBJECT(CLOB). - Числовые:
INTEGER,SMALLINT,NUMERIC(p,s),DECIMAL(p,s),FLOAT(p),REAL,DOUBLE PRECISION. - Дата и время:
DATE,TIME(p),TIMESTAMP(p), а также типыINTERVALдля работы с интервалами времени. - Битовые:
BIT(n),BIT VARYING(n).
Манипуляция данными (DML)
- Соединения (JOIN): SQL-92 ввёл синтаксис явного соединения, который стал обязательным. Ключевые слова
INNER JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN,FULL OUTER JOIN,CROSS JOINиNATURAL JOINпозволили писать более читаемые и надёжные запросы по сравнению с неявным синтаксисомFROM t1, t2 WHERE t1.id = t2.id. - Операции над множествами: Стандартизированы операторы
UNION(объединение),INTERSECT(пересечение) иEXCEPT(разность), а также их модификаторыALL(для сохранения дубликатов). - Вложенные запросы: Расширена поддержка подзапросов в предложениях
WHERE,HAVINGиFROM. Введены предикатыIN,ANY,ALL,SOME,EXISTS. - Условная логика: Введено выражение
CASE, позволяющее реализовывать условную логику внутри запроса (например,CASE WHEN condition THEN result ELSE default END).
Определение данных (DDL)
- Схемы (SCHEMA): Введена концепция схемы как логического контейнера для объектов базы данных (таблиц, представлений, индексов). Это улучшило организацию и управление правами доступа.
- Ограничения целостности (Constraints): Стандарт детально описал ограничения:
PRIMARY KEY,FOREIGN KEY(с каскадными действиямиON DELETE CASCADE,ON UPDATE SET NULL),UNIQUE,CHECK,NOT NULL. - Домены (DOMAIN): Позволяли определить пользовательский тип данных с заданными ограничениями и значением по умолчанию, который затем можно было использовать в нескольких таблицах.
- Представления (VIEW): Определена полная поддержка представлений, включая представления с проверкой (
WITH CHECK OPTION).
Управление данными (DCL)
- Транзакции: Стандартизированы операторы
COMMITиROLLBACKдля управления транзакциями. Определены уровни изоляции транзакций (хотя их полная спецификация была дана позже). - Права доступа: Операторы
GRANTиREVOKEдля управления привилегиями пользователей (SELECT, INSERT, UPDATE, DELETE, REFERENCES, USAGE).
Другие важные аспекты
- Динамический SQL: Введены конструкции
EXECUTE IMMEDIATEиPREPARE/EXECUTEдля выполнения SQL-запросов, сформированных во время выполнения программы. - Курсоры: Полностью определён механизм курсоров для построчной обработки результатов запроса, включая чувствительность к изменениям (
INSENSITIVE,SCROLL).
Влияние и критика
SQL-92 оказал колоссальное влияние на индустрию баз данных. Он стал тем стандартом, на который ориентировались все крупные производители СУБД. Благодаря ему разработчики получили возможность писать код, который с минимальными изменениями работал на Oracle, DB2, Sybase, Informix и Microsoft SQL Server. Это значительно снизило стоимость разработки и миграции приложений.
Однако стандарт не был лишён недостатков.
- Сложность полного внедрения: Полный уровень SQL-92 был настолько объёмным и сложным, что ни одна СУБД того времени не реализовала его полностью. Даже промежуточный уровень часто внедрялся с оговорками.
- Пробелы в функциональности: SQL-92 не включал поддержку многих важных возможностей, которые стали критически важными позже: рекурсивные запросы (стандартизированы в SQL:1999), триггеры (лишь в зачаточном виде), хранимые процедуры (стандартизированы в SQL:1999), полнотекстовый поиск, аналитические функции (оконные функции).
- Неоднозначности: Несмотря на значительные усилия, некоторые конструкции (например, поведение с NULL-значениями в определённых контекстах) оставались предметом различных интерпретаций.
Наследие
SQL-92 оставался действующим стандартом до выхода SQL:1999 (SQL3) и заложил основу для всех последующих версий. Большинство современных СУБД (PostgreSQL, MySQL, MariaDB, Oracle, Microsoft SQL Server) в значительной степени поддерживают синтаксис и семантику SQL-92, особенно на начальном и промежуточном уровнях. Изучение SQL-92 до сих пор является обязательной частью образования в области баз данных, так как он представляет собой чётко определённое и стабильное ядро языка, которое остаётся актуальным спустя три десятилетия.
Источники
- ISO/IEC 9075:1992, Information technology — Database languages — SQL.
- Melton, J., & Simon, A. R. (1993). Understanding the New SQL: A Complete Guide. Morgan Kaufmann.
- Date, C. J. (2003). An Introduction to Database Systems (8th ed.). Addison-Wesley.
- Когаловский, М. Р. (2002). Энциклопедия технологий баз данных. Финансы и статистика.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →