Реляционная полнота языка запросов
Язык DQL состоит из единственного оператора SELECT. Он предназначен для выборки данных из таблиц, то есть реализует одно из основных назначение информационной системы - предоставлять информацию пользователю. Язык запросов DQL является реляционно полным, то есть средствами DQL можно выразить любую из операций реляционной алгебры. Рассмотрим сначала унарные операции, представляющие собой действия над одной таблицей. Проекция – выбориз таблицы подмножества полей с возможностью одновременного исключения повторяющихся записей. Сначала рассмотрим важный частный случай проекции – выбор всех полей из таблицы. На языке SQL эта операция выглядит так:
Здесь SELECT – оператор DQL, FROM – служебное слово, за которым идет имя таблицы, Таблица – имя таблицы, из которой выбираются поля, * означает выбор всех полей. В общем случае проекция реализуется следующим образом:
Здесь DISTINCT – служебное слово, означающее, что нужно исключить из результата повторяющиеся записи. Квадратные скобки здесь и ниже означают, что данное слово можно опустить. Поле 1, Поле 2, … ПолеМ – имена полей, выбираемых из таблицы. Селекция – выбориз таблицы подмножества записей, значения полей в которых удовлетворяет некоторому условию. Селекция на языке SQL реализуется с помощью служебного слова WHERE:
Здесь Условие – условие, накладываемое на значение определенного поля или полей. В качестве условия в разделе WHERE можно использовать логические выражения, использующие поля таблиц, константы, операции сравнения, логические операторы AND, OR, NOT, скобки. В табл. 4.1 представлены операции сравнения, которые можно использовать для построения условий.
Таблица 4.1
Переименование поля – на языке SQL реализуется с помощью служебного слова AS:
В данном примере переименовывается поле, имеющее имя Полеi, новое имя этого поля – NewПолеi. Результатом операции является таблица, состоящая из тех же записей, что и исходная, но с измененными именами одного или нескольких полей. Далее будут рассмотрены бинарные операции. Декартово произведение – бинарная операция, результатом которой является таблица, заголовок которой является сцеплением заголовков двух исходных таблиц и состоящая из записей, составленных из сцепленных записей исходных таблиц. Пусть таблица с именем Т1 содержит N полей, а таблица с именем Т2 – М полей. На языке SQL декартово произведение реализуется следующим образом:
Т1. Поле1, Т1. Поле2, …, T1. ПолеN – имена полей таблицы Т1, Т2. Поле1, Т2. Поле2, …, Т2. ПолеМ – имена полей таблицы Т2. Конструкция ИмяТаблицы. ИмяПоля является полным именем поля и позволяет отличить его от поля с тем же именем, но расположенного в другой таблице. Объединение – бинарная операция, которую можно производить над таблицами, имеющими одинаковые заголовки, результатом которой является таблица, включающая все записи обеих таблиц без повторов. Объединение на языке SQL реализуется с помощью служебного слова UNION:
Разность – бинарная операция, которую можно производить над таблицами Т1 и Т2, имеющими одинаковые заголовки, результатом которой является таблица Т1–Т2, включающая подмножество тех записей Т1, которых нет в таблице Т2. На языке SQL эта операция реализуется с помощью служебного слова EXCEPT:
Служебное слово EXCEPT имеется не во всех версиях языка SQL. В MS Access его нет. Без служебного слова EXCEPT операция разности реализуется более сложной конструкцией. Запишем ее для таблиц Т1 и Т2, содержащих только по 2 поля:
Выражение содержит служебное слово EXISTS (существует) с логическим отрицанием NOT. Условие NOT EXISTS (SELECT … FROM … WHERE) вернет значение ИСТИНА только, если результат выполнения выражения в скобках не содержит ни одной записи. Рассмотренные операции являются простыми, то есть ни одна из них не может быть представлена комбинацией других. Остальные операции реляционной алгебры зависимы, то есть выражаются через простые. Однако для некоторых из этих операций в языке SQL предусмотрены специальные служебные слова, использование которых вместо эквивалентного выражения через простые операции повышает скорость выполнения запроса. Соединение – операция, аргументами которой в общем случае являются таблицы Т1 и Т2 и условие У, а результатом – таблица, заголовок которой является сцеплением заголовков двух исходных таблиц и состоящая из записей, удовлетворяющих условию У и составленных из сцепленных записей исходных таблиц. В общем случае на языке SQL операция записывается следующим образом:
Т1. Поле1, Т1. Поле2, …, T1. ПолеN – имена полей таблицы Т1, Т2. Поле1, Т2. Поле2, …, Т2. ПолеМ – имена полей таблицы Т2. Для важнейшего случая – эквисоединения (равенства значений полей в двух таблицах) в SQL предусмотрен особый синтаксис – конструкция INNER JOIN…ON. Его использование не повлияет на результат, но увеличит скорость выполнения операции:
Выполнение выражения
приведет к тому же результату, но выполняться такой запрос будет дольше. Пересечение – бинарная операция, которую можно производить над таблицами Т1 и Т2, имеющими одинаковые заголовки, результатом которой является таблица, включающая все записи, имеющиеся и в таблице Т1 и в таблице Т2. Для реализации операции пересечения в языке SQL имеется служебное слово INTERSECT:
Служебное слово INTERSECT имеется не во всех версиях языка SQL. В MS Access его нет. Без служебного слова INTERSECT операция пересечения реализуется более сложной конструкцией. Запишем ее для таблиц Т1 и Т2, содержащих только по 2 поля:
Наиболее громоздкое выражение получится при реализации на SQL операции реляционного деления. Поэтому запишем его для случая, когда таблица-делимое Т1 содержит 2 поля с именами Поле 1 и Поле 2, а таблица-делитель Т2 – одно поле с именем Поле 2. Таблица-результат будет содержать одно поле с именем Поле 1.
Выражение содержит служебное слово EXISTS (существует) с логическим отрицанием NOT. Условие NOT EXISTS (SELECT … FROM … WHERE) вернет значение ИСТИНА только, если результат выполнения выражения в скобках не содержит ни одной записи. Конструкция Т1 AS Т11 означает, что во внутреннем выражении для таблицы Т1 используется псевдоним Т11 для сохранения ее отличия от экземпляра той же таблицы во внешнем выражении. Поскольку реляционное деление – операция сложная для понимания, подчеркну еще раз ее смысл на примере. Пусть Поле 1 – Наименования производителей бытовой техники (Indesit, Zanussi, Miele…), а Поле 2 – категории поставляемого оборудования (холодильники, стиральные машины, посудомоечные машины…). Тогда результатом выполнения деления будет ответ на вопрос, какие производители производят ВСЕ категории оборудования из таблицы Т2.
Дословно представленное выражение SQL для этого случая на русский язык можно перевести так: Отобрать производителей из таблицы Т1, для которых не существует таких записей о категориях оборудования в таблице Т2, для которых не существует записей в таблице Т1 для этого производителя и этой категории. Данный способ реализации реляционного деления на языке SQL не единственный.
Читайте также: A- выдвижение кончика языка к верхней губе Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|