ANSI/ISO SQL-92
SQL-92 (также известный как ANSI/ISO SQL-92, ISO/IEC 9075:1992) — это международный стандарт языка структурированных запросов (SQL), принятый в 1992 году. Он является третьей редакцией стандарта SQL (после SQL-86 и SQL-89) и заменил их, став основой для большинства современных реляционных систем управления базами данных (СУБД). Стандарт определяет синтаксис, семантику и правила для операций определения данных (DDL), манипулирования данными (DML), управления доступом и транзакциями, а также для встроенного и динамического SQL.
История
Разработка SQL-92 началась как реакция на растущую фрагментацию языка SQL. Первые стандарты (SQL-86 и SQL-89) были неполными и оставляли множество возможностей для расширений, что приводило к несовместимости между разными СУБД. К началу 1990-х годов такие производители, как Oracle, IBM, Microsoft и Sybase, имели собственные диалекты SQL, что затрудняло переносимость приложений.
Работа над новым стандартом велась под эгидой Международной организации по стандартизации (ISO) и Американского национального института стандартов (ANSI). Ключевой целью было создание единого, всеобъемлющего стандарта, который бы охватывал все основные функции SQL, включая те, что ранее были реализованы только в коммерческих продуктах. Стандарт был официально опубликован в 1992 году и получил обозначение ISO/IEC 9075:1992 и ANSI X3.135-1992. Он был принят в качестве национального стандарта в США, странах Европейского союза и других государствах.
Структура и уровни соответствия
SQL-92 разделён на три уровня соответствия, что позволяло разработчикам СУБД поэтапно внедрять стандарт, не требуя немедленной реализации всех возможностей. Эти уровни были введены для облегчения перехода от более старых стандартов и для поддержки как простых, так и сложных систем.
- Начальный уровень (Entry Level): Этот уровень был практически идентичен SQL-89. Он включал основные операторы DDL (CREATE TABLE, CREATE INDEX), DML (SELECT, INSERT, UPDATE, DELETE) и простые типы данных (CHAR, VARCHAR, INTEGER, DECIMAL, FLOAT, DATE, TIME, TIMESTAMP). Большинство коммерческих СУБД того времени уже соответствовали этому уровню.
- Промежуточный уровень (Intermediate Level): Этот уровень добавлял ряд существенных возможностей, включая:
- Операции соединения таблиц: INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN.
- Подзапросы (subqueries) в предложениях FROM, WHERE и HAVING.
- Агрегатные функции: SUM, AVG, COUNT, MIN, MAX, а также предложение GROUP BY и HAVING.
- Ограничения целостности: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL.
- Типы данных: INTERVAL, BLOB, CLOB (хотя их реализация была необязательной).
- Управление транзакциями: COMMIT, ROLLBACK, SAVEPOINT.
- Полный уровень (Full Level): Этот уровень включал все возможности стандарта, включая:
- Динамический SQL (EXECUTE IMMEDIATE, PREPARE, EXECUTE).
- Встроенный SQL (Embedded SQL) для языков программирования (C, COBOL, Fortran, Pascal).
- Курсоры (CURSOR) с возможностью обновления.
- Управление доступом: GRANT, REVOKE с детальными привилегиями (SELECT, INSERT, UPDATE, DELETE, REFERENCES, USAGE).
- Расширенная работа с временными данными: функции EXTRACT, DATEADD, DATEDIFF (в стандарте — функции для работы с интервалами).
- Поддержка триггеров (TRIGGER) и хранимых процедур (PROCEDURE) — хотя их реализация была оставлена на усмотрение производителей.
Основные нововведения по сравнению с SQL-89
SQL-92 внёс значительные улучшения, которые сделали язык более мощным и удобным.
1. Операции соединения таблиц (JOIN)
В SQL-89 соединение таблиц выполнялось исключительно через условие WHERE (например, SELECT * FROM A, B WHERE A.id = B.id). SQL-92 ввёл явные операторы JOIN, что улучшило читаемость и позволило более гибко управлять соединениями, особенно при использовании внешних соединений.
- INNER JOIN: Возвращает строки, где есть совпадение в обеих таблицах.
- LEFT OUTER JOIN: Возвращает все строки из левой таблицы, даже если нет совпадений в правой.
- RIGHT OUTER JOIN: Возвращает все строки из правой таблицы.
- FULL OUTER JOIN: Возвращает все строки из обеих таблиц, заполняя NULL-ами отсутствующие значения.
- CROSS JOIN: Декартово произведение таблиц.
2. Подзапросы (Subqueries)
Подзапросы стали более мощными. Стандарт разрешил их использование в предложении FROM (как производные таблицы), в предложении HAVING, а также в операторах EXISTS, IN, ANY, ALL. Это позволило писать сложные запросы, которые ранее требовали временных таблиц или хранимых процедур.
3. Типы данных
Был введён ряд новых типов данных, включая:
- BLOB (Binary Large Object): Для хранения двоичных данных (изображения, аудио, видео).
- CLOB (Character Large Object): Для хранения больших текстовых данных.
- INTERVAL: Для представления временных интервалов (например,
INTERVAL '1-6' YEAR TO MONTH). - BOOLEAN: Для хранения логических значений (TRUE, FALSE, UNKNOWN).
4. Ограничения целостности (Constraints)
SQL-92 значительно расширил возможности определения ограничений целостности. Были введены:
- PRIMARY KEY: Уникальный идентификатор строки.
- FOREIGN KEY: Ссылочная целостность между таблицами.
- UNIQUE: Гарантия уникальности значений в столбце.
- CHECK: Проверка произвольного условия (например,
CHECK (salary > 0)). - NOT NULL: Запрет на NULL-значения.
5. Управление транзакциями (Transactions)
Стандарт определил четыре уровня изоляции транзакций (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) и механизмы для управления параллельным доступом. Это позволило разработчикам контролировать поведение СУБД при одновременной работе нескольких пользователей.
6. Динамический и встроенный SQL
SQL-92 ввёл стандартизированные способы использования SQL внутри программ на языках общего назначения.
- Встроенный SQL (Embedded SQL): SQL-код вставляется непосредственно в исходный код на C, COBOL, Fortran или Pascal, а затем обрабатывается препроцессором.
- Динамический SQL (Dynamic SQL): SQL-запросы формируются и выполняются во время выполнения программы, что позволяет создавать гибкие приложения, реагирующие на пользовательский ввод.
Влияние и наследие
SQL-92 стал важнейшей вехой в истории баз данных. Он фактически определил современный SQL и стал основой для всех последующих стандартов (SQL:1999, SQL:2003, SQL:2008, SQL:2011, SQL:2016, SQL:2023). Большинство современных СУБД, включая PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server, IBM Db2, SQLite, в значительной степени соответствуют SQL-92, хотя и имеют свои расширения.
Несмотря на то, что стандарт был принят более 30 лет назад, многие его положения остаются актуальными. Например, синтаксис JOIN, операторы CASE, подзапросы и ограничения целостности, введённые в SQL-92, используются повсеместно. Однако стандарт не охватывал такие важные области, как объектно-реляционное отображение (ORM), полнотекстовый поиск, работа с XML/JSON, оконные функции (window functions) и рекурсивные запросы, которые были добавлены в более поздних версиях.
Критика
Основная критика SQL-92 связана с его сложностью и неполнотой. Требование полного соответствия было трудновыполнимым для многих производителей, особенно для небольших СУБД. Кроме того, стандарт не решал проблему переносимости приложений между разными СУБД, так как каждый производитель продолжал добавлять собственные расширения, которые не были частью стандарта. Например, хранимые процедуры и триггеры, хотя и упоминались в SQL-92, не были полностью стандартизированы, что привело к появлению множества несовместимых диалектов (PL/SQL в Oracle, T-SQL в Microsoft SQL Server, PL/pgSQL в PostgreSQL).
Источники
- ISO/IEC 9075:1992, Information technology — Database languages — SQL.
- ANSI X3.135-1992, American National Standard for Information Systems — Database Language — SQL.
- C. J. Date, «An Introduction to Database Systems» (7th edition), Addison-Wesley, 2000.
- Jim Melton, «Understanding the New SQL: A Complete Guide», Morgan Kaufmann, 1993.
- Документация по стандарту SQL-92 на сайте ISO (международный стандарт).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →