ANSI X3.135-1986
ANSI X3.135-1986 — это американский национальный стандарт (American National Standard for Information Systems — Database Language SQL), который впервые официально определил язык структурированных запросов SQL (Structured Query Language). Принятый в 1986 году, он стал первым стандартом для реляционных баз данных, закрепив базовый синтаксис и функциональность языка, который до этого существовал в виде нескольких проприетарных реализаций. Стандарт был разработан комитетом X3H2 (позднее — NCITS H2) Американского национального института стандартов (ANSI). В 1987 году он был принят как международный стандарт ISO 9075-1987, что положило начало глобальной унификации языков запросов к базам данных.
История
Предпосылки создания
К началу 1980-х годов на рынке реляционных систем управления базами данных (СУБД) доминировали несколько коммерческих продуктов, каждый из которых использовал собственный диалект SQL. Наиболее известными были:
- System R (IBM) — прототип, на котором основывался язык SEQUEL (Structured English Query Language), предшественник SQL.
- Oracle (корпорация Oracle, основанная в 1977 году) — первая коммерческая СУБД, использующая SQL.
- DB2 (IBM, 1983) — первая реляционная СУБД для мейнфреймов, поддерживающая SQL.
- Ingres (Калифорнийский университет в Беркли) — использовала собственный язык QUEL.
Отсутствие единого стандарта приводило к несовместимости приложений, сложности переноса данных между системами и затрудняло обучение специалистов. В 1982 году ANSI сформировал комитет X3H2 для разработки стандарта языка баз данных. Работа велась на основе предложений от IBM, Oracle, Digital Equipment Corporation (DEC) и других компаний.
Разработка и принятие
Комитет X3H2, возглавляемый Доном Дойчем (Don Deutsch), провёл несколько лет, согласовывая синтаксис, типы данных, операции манипуляции данными и определения схем. Основой для стандарта послужил язык SQL, реализованный в IBM DB2, но с рядом упрощений и уточнений. В 1986 году был опубликован проект стандарта ANSI X3.135-1986, который после общественного обсуждения был утверждён. В 1987 году он был принят Международной организацией по стандартизации (ISO) как ISO 9075-1987, что сделало его первым международным стандартом языка SQL.
Значение для индустрии
Принятие ANSI X3.135-1986 создало единую терминологию и базовый набор команд, что позволило разработчикам писать переносимый код. Однако стандарт был достаточно минималистичным: он не охватывал многие возможности, реализованные в коммерческих СУБД (например, хранимые процедуры, триггеры, ограничения целостности, операции с датами). Это привело к появлению многочисленных расширений, которые впоследствии были стандартизированы в более поздних версиях (SQL-89, SQL-92, SQL:1999 и т.д.).
Основные положения стандарта
Синтаксис и структура
ANSI X3.135-1986 определял следующие основные категории операторов:
- DDL (Data Definition Language) — операторы определения данных:
CREATE TABLE,CREATE VIEW,CREATE INDEX,ALTER TABLE,DROP TABLE,DROP VIEW,DROP INDEX. Стандарт поддерживал только создание и удаление таблиц, представлений и индексов; изменение структуры таблиц (ALTER TABLE) было ограничено добавлением столбцов. - DML (Data Manipulation Language) — операторы манипуляции данными:
SELECT,INSERT,UPDATE,DELETE.SELECTподдерживал базовые операции: соединение таблиц (JOIN), агрегатные функции (COUNT,SUM,AVG,MAX,MIN), группировку (GROUP BY), сортировку (ORDER BY), подзапросы. - DCL (Data Control Language) — операторы управления доступом:
GRANTиREVOKEдля предоставления и отзыва привилегий на объекты базы данных. - TCL (Transaction Control Language) — операторы управления транзакциями:
COMMITиROLLBACK. Стандарт определял поддержку транзакций, но не уточнял уровни изоляции.
Типы данных
Стандарт определял ограниченный набор типов данных:
- CHAR(n) — строка фиксированной длины.
- VARCHAR(n) — строка переменной длины (не во всех реализациях).
- NUMERIC(p, s) — точное число с фиксированной точкой.
- DECIMAL(p, s) — синоним NUMERIC.
- INTEGER — целое число.
- SMALLINT — короткое целое.
- FLOAT — число с плавающей точкой.
- REAL — вещественное число.
- DOUBLE PRECISION — двойная точность.
Отсутствовали типы для дат, времени, больших двоичных объектов (BLOB), а также пользовательские типы.
Ограничения целостности
Стандарт поддерживал только базовые ограничения:
PRIMARY KEY— первичный ключ таблицы (неявно создавал уникальный индекс).FOREIGN KEY— внешний ключ, ссылающийся на первичный ключ другой таблицы.UNIQUE— уникальность значений столбца.NOT NULL— запрет на NULL-значения.CHECK— проверка условий (например,CHECK (age > 0)).
Ограничения CHECK и FOREIGN KEY были реализованы не во всех СУБД того времени.
Представления (Views)
Стандарт определял создание представлений (CREATE VIEW) как виртуальных таблиц, основанных на запросе SELECT. Представления могли быть обновляемыми только в простейших случаях (одна таблица, без агрегации и группировки).
Критика и ограничения
Неполнота
ANSI X3.135-1986 был минимальным стандартом, который не охватывал многие возможности, уже реализованные в коммерческих продуктах:
- Отсутствие хранимых процедур и функций — вся логика должна была выполняться на стороне приложения.
- Отсутствие триггеров — автоматические реакции на события (вставка, обновление, удаление) не поддерживались.
- Отсутствие операций с датами и временем — даты приходилось хранить как строки или числа.
- Отсутствие поддержки динамического SQL — запросы формировались статически.
- Отсутствие поддержки курсоров — для обработки множества строк требовались внешние языки программирования (позднее курсоры были добавлены в SQL-89).
Проблемы совместимости
Хотя стандарт был принят, многие производители СУБД (Oracle, IBM, Sybase, Microsoft) продолжали использовать собственные расширения, что приводило к несовместимости. Например, в Oracle использовался синтаксис SELECT ... FROM DUAL для запросов без таблиц, а в DB2 — SELECT ... FROM SYSIBM.SYSDUMMY1. Стандарт не определял способа соединения таблиц через JOIN (он появился только в SQL-92), поэтому использовались синтаксис WHERE и вложенные запросы.
Отсутствие обработки ошибок
Стандарт не определял поведение СУБД при возникновении ошибок (например, нарушение целостности, деление на ноль). Каждая реализация обрабатывала такие ситуации по-своему.
Влияние на последующие стандарты
SQL-89 (ANSI X3.135-1989)
В 1989 году была принята обновлённая версия стандарта, которая добавила:
- Поддержку курсоров (
DECLARE CURSOR,FETCH,CLOSE). - Уточнение поведения
NULL-значений. - Небольшие синтаксические улучшения.
SQL-92 (ANSI X3.135-1992)
Революционный стандарт, который значительно расширил функциональность:
- Введение явных соединений (
INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN). - Поддержка типов данных
DATE,TIME,TIMESTAMP. - Хранимые процедуры и функции (на уровне спецификации).
- Триггеры и ограничения целостности.
- Уровни изоляции транзакций (
READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE). - Динамический SQL.
SQL:1999 и далее
Последующие версии стандарта (SQL:1999, SQL:2003, SQL:2008, SQL:2011, SQL:2016, SQL:2023) добавили поддержку объектно-реляционных возможностей, XML, JSON, оконных функций, рекурсивных запросов, массивов, пользовательских типов и других современных функций.
Реализации и совместимость
Основные СУБД, поддерживавшие ANSI X3.135-1986
- Oracle (версии 5 и 6) — одна из первых коммерческих реализаций, но с многочисленными расширениями.
- IBM DB2 (версия 1 для MVS) — базовая реализация, близкая к стандарту.
- Sybase (версия 4.0) — поддерживала стандарт, но добавляла собственные расширения.
- Microsoft SQL Server (версия 4.2, 1988) — основана на Sybase, поддерживала стандарт.
- Ingres (версия 6.0) — перешла на SQL с QUEL только в конце 1980-х.
- Informix (версия 3.0) — поддерживала стандарт, но с отличиями.
Проблемы переносимости
Из-за различий в реализации даже базовых операторов (например, SELECT с подзапросами) код, написанный для одной СУБД, часто не работал на другой. Разработчики были вынуждены использовать условную компиляцию или писать несколько версий запросов. Стандарт ANSI X3.135-1986 служил скорее минимальным знаменателем, чем реальным руководством к переносимости.
Интересные факты
- Название «SQL» — первоначально язык назывался SEQUEL (Structured English Query Language), но из-за торговой марки IBM был переименован в SQL. Стандарт ANSI X3.135-1986 официально использует термин «Database Language SQL».
- Размер стандарта — документ ANSI X3.135-1986 занимал около 120 страниц, в то время как современный стандарт SQL:2023 насчитывает более 3000 страниц.
- Первая реализация — коммерческая версия SQL, предшествовавшая стандарту, была выпущена компанией Oracle (тогда Relational Software, Inc.) в 1979 году под названием Oracle V2.
- Влияние на другие стандарты — ANSI X3.135-1986 стал основой для стандарта ISO 9075, который впоследствии был принят во многих странах, включая СССР (в 1989 году на его основе был разработан ГОСТ 28388-89 «Системы обработки информации. Язык SQL»).
Источники
- American National Standard for Information Systems — Database Language SQL, ANSI X3.135-1986.
- ISO 9075:1987 — Information processing systems — Database language SQL.
- Date, C. J. (1987). A Guide to the SQL Standard. Addison-Wesley.
- Melton, J., & Simon, A. R. (1993). Understanding the New SQL: A Complete Guide. Morgan Kaufmann.
- Chamberlin, D. D. (1998). A Complete Guide to DB2 Universal Database. Morgan Kaufmann.
- ГОСТ 28388-89 «Системы обработки информации. Язык SQL».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →