Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Л-4 - Структурир язык запросов SQL

.pdf
Скачиваний:
12
Добавлен:
28.06.2021
Размер:
310.16 Кб
Скачать

Несоответствие реляционной модели данных

Сторонники РМД указывают на то, что SQL не является истинно реляционным языком, т.к. SQL с точки зрения реляционной теории имеет следующие дефекты:

SQL разрешает в таблицах строки-дубликаты, что в рамках РМД невозможно и недопустимо;

SQL поддерживает неопределенные значения NULL и многозначную логику;

SQL использует порядок столбцов и ссылки на столбцы по номерам;

SQL разрешает столбцы без имени и повторяющиеся имена столбцов.

Сложность

Хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.

Отступления от стандартов

Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта.

Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.

Сложность работы с иерархическими структурами

Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами.

Некоторые поставщики СУБД предлагали свои решения (например, в Oracle Database используется выражение CONNECT BY).

В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2.

В MS SQL Server рекурсивные запросы (Recursive Common Table Expressions) появились лишь в версии 2005.

Стандарты SQL (1)

1986 год – в Американском национальном институте стандартов ANSI сформирован Комитет для разработки стандарта SQL.

1987 год – в Международной организации по стандартизации ISO также сформирован Комитет для разработки стандарта SQL. Обе организации стали работать совместно для выработки общепринятого мирового стандарта SQL.

1989 год – опубликована первая спецификация стандарта

SQL-89.

Стандарты SQL (2)

1992 год – стандарт расширен в версии SQL-92 (или SQL2), причем описание занимало около 600 страниц.

1999 год – третье поколение языка SQL-99 (или SQL3). Включил множество объектных функций для работы с объектно-реляционными БД, а также расширения, делающие SQL пригодным для вычислений (циклы, переходы, конструкции с условиями).

2003 год – стандарт SQL: 2003. Включил функции для работы с XML. Лишь некоторые поставщики реализовали наиболее важные компоненты стандартов SQL3 и SQL:

2003.

Стандарты SQL (3)

2008 год – полный стандарт SQL: 2008. Описывал язык SQL, который определяется стандартом SQL: 2003, включая расширения SQL: 2005.

Последней версией стандарта SQL является SQL: 2011

(ИСО/МЭК 9075-Х: 2011).

Конкретные реализации SQL отличаются от стандарта. Стандарт SQL: 2011 слишком всеобъемлющ и современ-

ные реализации не полностью соответствуют ему. Но поставщики СУБД работают над тем, чтобы их системы соответствовали основной части стандартного SQL.

Пример использования соглашений синтаксиса SQL

USE master; GO

SELECT name , database_id , create_date , collation_name FROM sys.databases

WHERE name = 'tempdb'; GO

Основные соглашения синтаксиса SQL (1)

Каждый запрос начинается с команды, обычно из одного слова, почти всегда глагола (в примере запрос начинается с команды SELECT).

Каждый запрос завершается разделителем (обычно точкой с запятой). Некоторые реализации позволяют менять разделитель. Одни реализации не выполняют запрос без разделителя, другие считают его необязательным.

Запросы пишутся как обычные предложения, элементы языка разделяются одним или несколькими пробелами (элемент языка – любое ключевое слово, имя объекта базы данных, оператор или константа).

Основные соглашения синтаксиса SQL (2)

Запросы – в свободной форме (нет строгих правил относительно положения элементов языка в строке или положения разделителя строк). Но разбивать элемент языка между строками – не лучшая идея.

Запросы состоят из частей, которые идут в строго определенном порядке (некоторые необязательны) (в примере – три части, начинающиеся ключевыми словами

(SELECT, FROM, WHERE).

Элементы списка разделяются запятыми. Пробелы после каждой запятой необязательны – можно либо не использовать их, либо использовать, сколько угодно.