Открыть сервис

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. Наиболее известными были:

Отсутствие единого стандарта приводило к несовместимости приложений, сложности переноса данных между системами и затрудняло обучение специалистов. В 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 →