Лекции / Л-4 - Структурир язык запросов SQL
.pdfНесоответствие реляционной модели данных
Сторонники РМД указывают на то, что 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).
Элементы списка разделяются запятыми. Пробелы после каждой запятой необязательны – можно либо не использовать их, либо использовать, сколько угодно.