SQL:1992
SQL:1992 (также известный как SQL2) — это вторая крупная ревизия международного стандарта языка структурированных запросов SQL (Structured Query Language), принятая в 1992 году. Стандарт был разработан комитетами ANSI (Американский национальный институт стандартов) и ISO (Международная организация по стандартизации) и официально опубликован как ISO/IEC 9075:1992. SQL:1992 стал первой широко признанной и практически реализованной версией стандарта, заменившей устаревший SQL:1989 и заложившей основу для реляционных баз данных на последующие десятилетия.
История и предпосылки
Предшествующие стандарты
Первый стандарт SQL был принят в 1986 году (SQL:1986), а затем незначительно пересмотрен в 1989 году (SQL:1989). Однако эти версии были крайне ограничены: они определяли лишь базовый синтаксис, основные типы данных (CHAR, VARCHAR, INTEGER, DECIMAL, FLOAT, DATE, TIME) и минимальный набор операций (SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE INDEX). Отсутствовали такие важные элементы, как внешние ключи, ограничения целостности, транзакции, соединения таблиц (JOIN) в полном объёме, а также поддержка работы с множествами (UNION, INTERSECT, EXCEPT). Производители СУБД (систем управления базами данных) — Oracle, IBM DB2, Microsoft SQL Server, Sybase, Informix — реализовывали эти возможности по-своему, что приводило к несовместимости.
Разработка SQL:1992
Работа над новой версией началась в конце 1980-х годов под эгидой комитетов ANSI X3H2 (США) и ISO/IEC JTC 1/SC 32 (международный). Целью было создание единого, полного и практичного стандарта, который охватывал бы все основные возможности реляционных СУБД того времени. Стандарт был опубликован в 1992 году и состоял из нескольких частей, хотя основная часть (ISO/IEC 9075:1992) описывала собственно язык SQL. В отличие от предыдущих версий, SQL:1992 был значительно объёмнее — около 600 страниц текста.
Основные нововведения и характеристики
SQL:1992 ввёл множество ключевых возможностей, которые стали стандартом де-факто для реляционных баз данных.
1. Расширенная поддержка целостности данных
Стандарт впервые чётко определил механизмы обеспечения ссылочной целостности:
- Внешние ключи (FOREIGN KEY) — полностью специфицированы синтаксис и семантика, включая каскадные операции (ON DELETE CASCADE, ON UPDATE CASCADE, SET NULL, SET DEFAULT, NO ACTION).
- Ограничения CHECK — возможность задавать произвольные логические условия для столбцов и таблиц.
- Ограничения UNIQUE и NOT NULL — уточнены и стандартизированы.
- Ограничения PRIMARY KEY — чётко определены как комбинация NOT NULL и UNIQUE.
2. Типы данных
SQL:1992 расширил набор встроенных типов данных:
- Символьные типы: CHARACTER (CHAR), CHARACTER VARYING (VARCHAR), CHARACTER LARGE OBJECT (CLOB) — для больших текстовых данных.
- Числовые типы: INTEGER, SMALLINT, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, FLOAT.
- Дата и время: DATE, TIME, TIMESTAMP (с возможностью указания точности до долей секунды), а также INTERVAL для работы с интервалами времени.
- Битовые типы: BIT, BIT VARYING (позднее заменены на BINARY и VARBINARY в более новых стандартах).
- Большие объекты: BLOB (Binary Large Object) — для хранения произвольных двоичных данных.
3. Расширенные операции запросов
- Полноценные соединения (JOIN):
- INNER JOIN (внутреннее соединение)
- LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN (внешние соединения)
- CROSS JOIN (декартово произведение)
- NATURAL JOIN (соединение по одноимённым столбцам)
- Операции над множествами: UNION, INTERSECT, EXCEPT (с опциональным ключевым словом ALL для сохранения дубликатов).
- Подзапросы (subqueries) — вложенные запросы в предложениях WHERE, HAVING, FROM, а также в списке SELECT.
- Агрегатные функции: COUNT, SUM, AVG, MIN, MAX — с поддержкой группировки (GROUP BY) и фильтрации групп (HAVING).
- Сортировка: ORDER BY с возможностью сортировки по нескольким столбцам и указанием направления (ASC, DESC).
4. Управление данными и транзакциями
- Транзакции: введены операторы BEGIN TRANSACTION, COMMIT, ROLLBACK, а также уровни изоляции (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE). Стандарт определил, что СУБД должна обеспечивать атомарность, согласованность, изолированность и долговечность (ACID) для транзакций.
- Управление доступом: операторы GRANT и REVOKE для разграничения прав пользователей и ролей. Введены привилегии на уровне таблиц, столбцов, представлений и процедур.
5. Схемы и каталоги
SQL:1992 ввёл понятие схемы (schema) как именованного контейнера для объектов базы данных (таблиц, представлений, индексов, ограничений). Схемы группируются в каталоги (catalog). Это позволило организовать многоуровневое пространство имён и упростило администрирование.
6. Представления (VIEW)
Определены правила создания и использования представлений, включая возможность обновляемых представлений (при определённых ограничениях). Стандарт также описал механизм проверки целостности для представлений (WITH CHECK OPTION).
7. Уровни соответствия
SQL:1992 ввёл три уровня соответствия (conformance levels), чтобы производители могли постепенно внедрять стандарт:
- Entry SQL (входной уровень) — минимальный набор возможностей, охватывающий SQL:1989.
- Intermediate SQL (промежуточный уровень) — включает большинство нововведений (внешние ключи, CHECK, UNION, JOIN, подзапросы, агрегатные функции).
- Full SQL (полный уровень) — все возможности стандарта, включая INTERSECT, EXCEPT, CLOB, BLOB, управление транзакциями с полной изоляцией, каталоги и схемы.
Критика и ограничения
Несмотря на революционность для своего времени, SQL:1992 имел ряд недостатков, которые были устранены в последующих версиях (SQL:1999, SQL:2003 и т.д.):
- Отсутствие объектно-реляционных возможностей: не было поддержки пользовательских типов данных, наследования, методов, коллекций (массивов, мультимножеств).
- Слабая поддержка процедурной логики: стандарт не включал хранимые процедуры, функции, триггеры, курсоры с возможностью обновления. Эти возможности оставались на усмотрение производителей.
- Неполная поддержка рекурсивных запросов: рекурсивные обобщённые табличные выражения (WITH RECURSIVE) появились только в SQL:1999.
- Проблемы с типами данных: например, тип BIGINT был определён неоднозначно (размер зависел от реализации), а поддержка временных зон для TIMESTAMP была ограничена.
- Сложность полной реализации: многие производители (особенно Oracle и Microsoft) долгое время не поддерживали полный уровень SQL:1992, предпочитая собственные расширения.
Влияние и реализация
SQL:1992 стал основой для всех современных реляционных СУБД. К концу 1990-х годов большинство коммерческих продуктов (Oracle 7/8, IBM DB2 Universal Database, Microsoft SQL Server 6.5/7.0, Sybase Adaptive Server Enterprise, Informix Dynamic Server) заявили о поддержке SQL:1992 на уровне Intermediate или Full. Открытые СУБД (PostgreSQL, MySQL, Firebird) также ориентировались на этот стандарт.
Стандарт значительно упростил переносимость приложений между разными СУБД, хотя на практике оставались различия в диалектах (например, в синтаксисе для работы с датами, в именовании типов данных, в реализации транзакций). Тем не менее, SQL:1992 стал тем «общим знаменателем», на который можно было опираться при разработке кросс-платформенного программного обеспечения.
Интересные факты
- SQL:1992 был первым стандартом, который включал полноценное описание внешних ключей и каскадных операций. До этого их реализация в разных СУБД сильно различалась.
- Стандарт ввёл ключевое слово NULL как специальное значение, обозначающее отсутствие данных, и определил трёхзначную логику (TRUE, FALSE, UNKNOWN) для сравнений с NULL.
- В SQL:1992 впервые появилась возможность задавать DEFAULT значения для столбцов.
- Стандарт определил синтаксис для CREATE ASSERTION — глобальных ограничений целостности, которые должны проверяться при любом изменении данных. Однако эта возможность практически не была реализована в коммерческих СУБД из-за высокой сложности.
- SQL:1992 был пересмотрен и дополнен в 1999 году (SQL:1999), который ввёл объектно-реляционные расширения, рекурсивные запросы, хранимые процедуры и триггеры.
Источники
- ISO/IEC 9075:1992, Information technology — Database languages — SQL
- ANSI X3.135-1992, American National Standard for Information Systems — Database Language — SQL
- «A Guide to the SQL Standard» (C. J. Date, Hugh Darwen, 1993) — подробное описание SQL:1992
- «SQL:1992 — The Next Generation» (статья в журнале «Database Programming & Design», 1992)
- «Understanding the New SQL: A Complete Guide» (Jim Melton, Alan R. Simon, 1993) — официальное руководство от разработчиков стандарта
- «SQL:1992 and the Relational Model» (C. J. Date, 1993) — критический анализ стандарта
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →