ANSI SQL — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:10, 26 июня 2020.
 
Строка 31: Строка 31:
 
| influenced =  
 
| influenced =  
 
}}
 
}}
'''ANSI SQL''' – первый стандарт языка [https://en.wikipedia.org/wiki/SQL SQL], принятый [https://en.wikipedia.org/wiki/American_National_Standards_Institute Американским национальным институтом стандартов] (англ. American national standards institute, ANSI) в 1986 году и определяется с помощью кода ANSI. Когда говорят о SQL в целом, обычно ссылаются на ANSI стандарт SQL.  
+
'''ANSI SQL''' – первый стандарт языка [[SQL]], принятый Американским национальным институтом стандартов (англ. American national standards institute, ANSI) в 1986 году и определяется с помощью кода ANSI. Когда говорят о SQL в целом, обычно ссылаются на ANSI стандарт SQL.  
 
== История релизов==
 
== История релизов==
 
{| class="wikitable"
 
{| class="wikitable"
Строка 52: Строка 52:
 
|1999
 
|1999
 
|SQL:1999(SQL3)
 
|SQL:1999(SQL3)
|В этой версии представлено много новых функций, таких как сопоставление регулярных выражений, триггеры, некоторые объектно-ориентированные функции и возможности [[OLAP]]. SQL:1999 также добавляет BOOLEAN тип данных, но многие коммерческие серверы баз данных не поддерживают его как тип столбца. Между тем SQL:1999 считается устаревшим.
+
|В этой версии представлено много новых функций, таких как сопоставление регулярных выражений, триггеры, некоторые объектно-ориентированные функции и возможности OLAP. SQL:1999 также добавляет BOOLEAN тип данных, но многие коммерческие серверы баз данных не поддерживают его как тип столбца. Между тем SQL:1999 считается устаревшим.
 
|-
 
|-
 
|2003
 
|2003
Строка 62: Строка 62:
 
|2006
 
|2006
 
|SQL:2006
 
|SQL:2006
|Эта версия определяет способы импорта, хранения и управления данными [[XML]]. Кроме того, он позволяет приложениям использовать [[XQuery]] для запроса данных в формате XML.
+
|Эта версия определяет способы импорта, хранения и управления данными XML. Кроме того, он позволяет приложениям использовать XQuery для запроса данных в формате XML.
 
|-
 
|-
 
|2008
 
|2008
Строка 81: Строка 81:
 
|}
 
|}
 
== Несогласованности ==
 
== Несогласованности ==
SQL не изобретался ANSI. Это по существу изобретение [https://ru.wikipedia.org/wiki/IBM IBM]. После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт, к которому они должны быть приведены. (Определение таких стандартов и является функцией ANSI). Однако после этого появились некоторые проблемы. Возникли они, в результате стандартизации ANSI, в виде некоторых ограничений. Так как не всегда ANSI определяет то, что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно придают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения.
+
SQL не изобретался ANSI. Это по существу изобретение IBM. После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт, к которому они должны быть приведены. (Определение таких стандартов и является функцией ANSI). Однако после этого появились некоторые проблемы. Возникли они, в результате стандартизации ANSI, в виде некоторых ограничений. Так как не всегда ANSI определяет то, что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно придают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения.
 
== SQL ==
 
== SQL ==
 
Поскольку стандарт языка SQL меняется со временем, и многие поставщики RDB предлагают разные версии SQL, это означает, что используемая нами реализация SQL может отличаться от стандарта ANSI.
 
Поскольку стандарт языка SQL меняется со временем, и многие поставщики RDB предлагают разные версии SQL, это означает, что используемая нами реализация SQL может отличаться от стандарта ANSI.

Текущая версия на 23:10, 26 июня 2020

ANSI SQL
Unnamed.gif
Парадигма

Мульти-парадигма:

декларативная
Семейство Язык программирования
Разработчики Американский национальный институт стандартов
Первый   появившийся 1986 (34 years ago) (1986)
Печать дисциплины Статический, строгий
OS

Кросс-

платформенная
Расширение файла .sql

ANSI SQL – первый стандарт языка SQL, принятый Американским национальным институтом стандартов (англ. American national standards institute, ANSI) в 1986 году и определяется с помощью кода ANSI. Когда говорят о SQL в целом, обычно ссылаются на ANSI стандарт SQL.

История релизов

Дата Версия Описание (комментарии)
1986 SQL-86(SQL-87) Первая версия, стандартизованная ANSI.
1989 SQL-89 Эта версия включает незначительные изменения, которые добавляют ограничения целостности.
1992 SQL-92(SQL2) Эта версия включает в себя основные изменения в языке SQL. Многие системы баз данных используют этот стандарт для своего языка спецификации.
1999 SQL:1999(SQL3) В этой версии представлено много новых функций, таких как сопоставление регулярных выражений, триггеры, некоторые объектно-ориентированные функции и возможности OLAP. SQL:1999 также добавляет BOOLEAN тип данных, но многие коммерческие серверы баз данных не поддерживают его как тип столбца. Между тем SQL:1999 считается устаревшим.
2003 SQL:2003 Эта версия включает незначительные изменения ко всем частям SQL:1999. Эта версия также добавляет новые функции, такие как:
  • Оконные функции, которые очень полезные для анализа данных.
  • Столбцы с автоматической генерацией значений и идентификацией.
2006 SQL:2006 Эта версия определяет способы импорта, хранения и управления данными XML. Кроме того, он позволяет приложениям использовать XQuery для запроса данных в формате XML.
2008 SQL:2008 Эта версия добавляет такие функции, как оператор TRUNCATE TABLE, предложение FETCH и триггеры INSTEAD OF.
2011 SQL:2011 Эта версия добавляет улучшения для оконных функций и предложения FETCH.
2016 SQL:2016 Эта версия добавляет различные функции для работы с данными JSON.
2019 SQL:2019 Эта версия указывает тип данных многомерных массивов (MDarray).[Источник 1]

Несогласованности

SQL не изобретался ANSI. Это по существу изобретение IBM. После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт, к которому они должны быть приведены. (Определение таких стандартов и является функцией ANSI). Однако после этого появились некоторые проблемы. Возникли они, в результате стандартизации ANSI, в виде некоторых ограничений. Так как не всегда ANSI определяет то, что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно придают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения.

SQL

Поскольку стандарт языка SQL меняется со временем, и многие поставщики RDB предлагают разные версии SQL, это означает, что используемая нами реализация SQL может отличаться от стандарта ANSI.

Для обеспечения совместимости между базами данных большинство пользователей предпочитают писать команды SQL с использованием стандартного синтаксиса ANSI. Базовые команды SQL DML (INSERT, UPDATE и DELETE) и большинство команд DDL (CREATE DATABASE, CREATE TABLE) будут одинаковыми во всех реализациях. Однако каждая система реляционной базы данных может поддерживать разные типы данных и функции.[Источник 2]

Пример

В следующем примере поясняется стандарт ANSI для синтаксиса соединения SQL. ANSI вводит стандарты для синтаксиса соединения в 1992 году (известный как синтаксис соединения ANSI-92). Объединение определяется явно в синтаксисе с использованием соответствующего ключевого слова для каждого типа объединений. Эти ключевые слова:

  • CROSS JOIN
  • [INNER] JOIN
  • LEFT [OUTER] JOIN
  • RIGHT [OUTER] JOIN
  • FULL [OUTER] JOIN

Явный синтаксис внутреннего соединения (ANSI)

SELECT ProductName, CategoryName
FROM Product 
INNER JOIN Category ON Product.CategoryID = Category.ID

Синтаксис неявного соединения (старый стиль)

В неявном внутреннем синтаксисе все объединяемые таблицы перечислены в предложении FROM, а условие объединения указано в предложении WHERE.

SELECT ProductName, CategoryName
FROM Product, Category
WHERE Product.CategoryID = Category.ID

Краткое сравнение Oracle SQL и ANSI SQL

NULL значения

Согласно ANSI все типы данных должны поддерживать неопределенные или NULL значения. Oracle в полной мере поддерживает это правило для всех типов, за исключением символьных. Для любых символьных данных пустая строка интерпретируется как NULL, например два оператора Oracle SQL:

INSERT INTO TEST(COL1) VALUES(NULL)
INSERT INTO TEST(COL1) VALUES('')

полностью идентичны и вставят в таблицу значения NULL, а не пустые строки. В Oracle вообще нельзя вставить пустую строку, так как она будет рассматриваться как NULL. Это отклонение особенно актуально при сравнении строк.

Оператор UPDATE

Оператор UPDATE в Oracle полностью соответствует требованиям начального уровня ANSI SQL. Однако имеются некоторые дополнительные возможности. Если отбросить возможности предназначенные для работы с объектными таблицами вот они:

  1. использование табличных алиасов для ссылок на обновляемую таблицу в подзапросах
  2. подзапросы в правой части предложения SET в отличие от только выражений в ANSI SQL
  3. список обновляемых колонок в левой части предложения SET, в отличии от одной колонки в ANSI SQL
  4. подзапросы в предложении SET или WHERE могут ссылаться на обновляемую таблицу
  5. оператор UPDATE поддерживает обновление подзапросов

Оператор DELETE

Оператор DELETE в Oracle полностью соответствует требованиям начального уровня ANSI SQL. Однако имеются некоторые дополнительные возможности:

  1. ключевое слово FROM не обязательно
  2. использование табличных алиасов для ссылок на обновляемую таблицу в подзапросах
  3. подзапросы в предложении WHERE могут ссылаться на обновляемую таблицу
  4. оператор DELETE поддерживает удаление из подзапросов

Оператор INSERT

В Oracle имеет следующую дополнительную возможность по сравнению с ANSI SQL: Оператор INSERT поддерживает подзапросы в предложении INTO Оператор:

INSERT INTO dept VALUES (50,'продукция','Москва')

аналогичен оператору:

INSERT INTO (SELECT deptno, ndept, loc FROM dept)
VALUES (50,'продукция','Москва')

Оператор SELECT

  1. NULL в списке выборки
  2. Запрос из запроса (SELECT FROM (SELECT….))
  3. Левая часть оператора IN может быть списком выражений в отличии от одиночного выражения в ANSI SQL
  4. Не только столбец, а любое выражение может быть использовано с оператором LIKE
  5. Любое выражение, а не только отдельный столбец может быть использован в операторах сравнения IS NULL и IS NOT NULL
  6. В предложении ORDER BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов, номеров позиций столбцов списка выборки
  7. В предложении GROUP BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов столбцов списка выборки
  8. Вложенные агрегатные функции MIN(MAX(col1)) (уровень вложенности не более 2)
  9. Оператор внешнего соединения (+)
  10. Древовидные запросы
SELECT ename, job, sal, deptno, NULL -- в списке выборки присутствует NULL-значение
FROM
(SELECT * FROM emp WHERE deptno=30) -- в предложении FROM указан подзапрос
WHERE  (ename,job) IN (SELECT ename,job FROM . ); -- слева от оператора IN указан список из двух столбцов, а справа - запрос, возвращающий два столбца
SELECT ename,ename2,sal,sal2
FROM emp
WHERE ename LIKE '%'//ename2//'%' AND -- с оператором LIKE использовано выражение '%'//ename2//'%', содержащее ссылку на столбец
sal+sal2IS NOT NULL -- С оператором сравнения IS NOT NULL используется выражение sal+sal2
ORDER BY sal+sal2 -- Сортировка осуществляется по значению выражения sal+sal2

Внешние соединения

В ANSI SQL внешние объединения реализованы посредством расширенной формы предложения FROM:

SELECT * FROM tab1 FULL JOIN tab2 ON col1=col2 -- полное внешнее объединение
SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2 -- полное левое объединение
SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2 -- полное правое объединение

В Oracle не реализовано расширенное предложение FROM для реализации внешних соединений (начальный уровень ANSI SQL этого не требует) как это сделано в ANSI. Однако реализован свой собственный синтаксис для получения левых и правых внешних объединений. Полные внешние объединения в Oracle не реализованы.

Древовидные запросы

В Oracle также реализованы так называемые древовидные запросы, предназначенные для работы с данными, организованными в виде дерева. Для реализации дерева в виде таблицы в ней должно быть дополнительных два поля: id узла и id родительского узла. Также должен быть корень (корни). Для реализации древовидных запросов имеются два дополнительных предложения:

START WITH -- для идентификации коренных строк
CONNECT BY -- для связи строк-потомков и строк-предков

В предложении CONNECT BY реализован также оператор PRIOR который используется для обозначения выражения-родителя.

Оператор SELECT, осуществляющий древовидный запрос, может использовать псевдостолбец LEVEL, содержащий уровень вложенности для каждой строки. Для коренных записей LEVEL=1, для потомков коренных записей LEVEL=2 и т.д.[Источник 3]

Источники

  1. What is the ANSI SQL? – Querychat. URL: https://www.got-it.ai/solutions/sqlquerychat/sql-help/general-sql/what-is-the-ansi-sql-querychat/ (дата обращения: 07.06.2020).
  2. SQL : ОБЗОР. URL: https://www.sql.ru/docs/sql/u_sql/ch2.shtml (дата обращения: 08.06.2020).
  3. Краткое сравнение Oracle SQL и ANSI SQL. URL: http://www.interface.ru/home.asp?artId=16495 (дата обращения: 08.06.2020).