Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Реляционная полнота языка запросов




Язык DQL состоит из единственного оператора SELECT. Он предназначен для выборки данных из таблиц, то есть реализует одно из основных назначение информационной системы - предоставлять информацию пользователю.

Язык запросов DQL является реляционно полным, то есть средствами DQL можно выразить любую из операций реляционной алгебры.

Рассмотрим сначала унарные операции, представляющие собой действия над одной таблицей.

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

Сначала рассмотрим важный частный случай проекции – выбор всех полей из таблицы. На языке SQL эта операция выглядит так:

SELECT * FROM Таблица

Здесь SELECT – оператор DQL, FROM – служебное слово, за которым идет имя таблицы, Таблица – имя таблицы, из которой выбираются поля, * означает выбор всех полей.

В общем случае проекция реализуется следующим образом:

SELECT [DISTINCT] Поле 1, Поле 2, … ПолеМ FROM Таблица

Здесь DISTINCT – служебное слово, означающее, что нужно исключить из результата повторяющиеся записи. Квадратные скобки здесь и ниже означают, что данное слово можно опустить. Поле 1, Поле 2, … ПолеМ – имена полей, выбираемых из таблицы.

Селекция – выбориз таблицы подмножества записей, значения полей в которых удовлетворяет некоторому условию. Селекция на языке SQL реализуется с помощью служебного слова WHERE:

SELECT * FROM Таблица WHERE Условие

Здесь Условие – условие, накладываемое на значение определенного поля или полей.

В качестве условия в разделе WHERE можно использовать логические выражения, использующие поля таблиц, константы, операции сравнения, логические операторы AND, OR, NOT, скобки.

В табл. 4.1 представлены операции сравнения, которые можно использовать для построения условий.

Таблица 4.1

Обозначение Описание Примеры использования Типы данных
= Равно Автор = “Иванов А.Б.” [Год издания]=2003 Текстовый Числовой Дата/время Денежный
> Больше [Число страниц]>600
>= Больше или равно [Год издания]>=2003
< Меньше [Число страниц]<600
<= Меньше или равно [Год издания]<=2003
<> Не равно [Год издания]<>2003
Like Подобно Название Like “*оптика*” Название Like “Измерения*” Текстовый

 

Переименование поля – на языке SQL реализуется с помощью служебного слова AS:

SELECT Поле 1, Поле 2, …, Полеi AS NewПолеi, …, ПолеN FROM Таблица

В данном примере переименовывается поле, имеющее имя Полеi, новое имя этого поля – NewПолеi.

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

Далее будут рассмотрены бинарные операции.

Декартово произведение – бинарная операция, результатом которой является таблица, заголовок которой является сцеплением заголовков двух исходных таблиц и состоящая из записей, составленных из сцепленных записей исходных таблиц. Пусть таблица с именем Т1 содержит N полей, а таблица с именем Т2М полей. На языке SQL декартово произведение реализуется следующим образом:

SELECT Т1. Поле1, Т1. Поле2, …, T1. ПолеN, Т2. Поле1, Т2. Поле2, …, Т2. ПолеМ FROM Т1, Т2

Т1. Поле1, Т1. Поле2, …, T1. ПолеN – имена полей таблицы Т1, Т2. Поле1, Т2. Поле2, …, Т2. ПолеМ – имена полей таблицы Т2.

Конструкция ИмяТаблицы. ИмяПоля является полным именем поля и позволяет отличить его от поля с тем же именем, но расположенного в другой таблице.

Объединение – бинарная операция, которую можно производить над таблицами, имеющими одинаковые заголовки, результатом которой является таблица, включающая все записи обеих таблиц без повторов. Объединение на языке SQL реализуется с помощью служебного слова UNION:

SELECT * FROM Т1 UNION SELECT* FROM Т2

Разность – бинарная операция, которую можно производить над таблицами Т1 и Т2, имеющими одинаковые заголовки, результатом которой является таблица Т1–Т2, включающая подмножество тех записей Т1, которых нет в таблице Т2. На языке SQL эта операция реализуется с помощью служебного слова EXCEPT:

SELECT * FROM Т1 EXCEPT SELECT* FROM Т2

Служебное слово EXCEPT имеется не во всех версиях языка SQL. В MS Access его нет. Без служебного слова EXCEPT операция разности реализуется более сложной конструкцией. Запишем ее для таблиц Т1 и Т2, содержащих только по 2 поля:

SELECT Т1.Поле1, Т1.Поле2 FROM Т1 WHERE NOT EXISTS (SELECT Т2.Поле1, Т2.Поле2 FROM Т2 WHERE Т2.Поле1=Т1.Поле1 AND Т2.Поле2=Т1.Поле2)

Выражение содержит служебное слово EXISTS (существует) с логическим отрицанием NOT. Условие NOT EXISTS (SELECT … FROM … WHERE) вернет значение ИСТИНА только, если результат выполнения выражения в скобках не содержит ни одной записи.

Рассмотренные операции являются простыми, то есть ни одна из них не может быть представлена комбинацией других. Остальные операции реляционной алгебры зависимы, то есть выражаются через простые. Однако для некоторых из этих операций в языке SQL предусмотрены специальные служебные слова, использование которых вместо эквивалентного выражения через простые операции повышает скорость выполнения запроса.

Соединение – операция, аргументами которой в общем случае являются таблицы Т1 и Т2 и условие У, а результатом – таблица, заголовок которой является сцеплением заголовков двух исходных таблиц и состоящая из записей, удовлетворяющих условию У и составленных из сцепленных записей исходных таблиц. В общем случае на языке SQL операция записывается следующим образом:

SELECT Т1. Поле 1, Т1. Поле 2, …, T1. ПолеN, Т2. Поле 1, Т2. Поле 2, …, Т2. ПолеМ FROM Т1, Т2 WHERE У

Т1. Поле1, Т1. Поле2, …, T1. ПолеN – имена полей таблицы Т1, Т2. Поле1, Т2. Поле2, …, Т2. ПолеМ – имена полей таблицы Т2.

Для важнейшего случая – эквисоединения (равенства значений полей в двух таблицах) в SQL предусмотрен особый синтаксис – конструкция INNER JOIN…ON. Его использование не повлияет на результат, но увеличит скорость выполнения операции:

SELECT Т1. Поле 1, Т1. Поле 2, …, T1. ПолеN, Т2. Поле 1, Т2. Поле 2, …, Т2. ПолеМ FROM Т1 INNER JOIN Т2 ON Т1. Полеi = Т2. Полеi

Выполнение выражения

SELECT Т1. Поле 1, Т1. Поле 2, …, T1. ПолеN, Т2. Поле 1, Т2. Поле 2, …, Т2. ПолеМ FROM Т1, Т2 WHERE Т1. Полеi = Т2. Полеi

приведет к тому же результату, но выполняться такой запрос будет дольше.

Пересечение – бинарная операция, которую можно производить над таблицами Т1 и Т2, имеющими одинаковые заголовки, результатом которой является таблица, включающая все записи, имеющиеся и в таблице Т1 и в таблице Т2.

Для реализации операции пересечения в языке SQL имеется служебное слово INTERSECT:

SELECT * FROM Т1 INTERSECT SELECT* FROM Т2

Служебное слово INTERSECT имеется не во всех версиях языка SQL. В MS Access его нет. Без служебного слова INTERSECT операция пересечения реализуется более сложной конструкцией. Запишем ее для таблиц Т1 и Т2, содержащих только по 2 поля:

SELECT Т1.Поле1, Т1.Поле2 FROM Т1 WHERE Т1.Поле1 IN (SELECT Т2.Поле1а FROM Т2 WHERE Т2.Поле1а=Т1.Поле1) AND Т1.Поле2 IN (SELECT Т2.Поле2а FROM Т2 WHERE Т2.Поле1а=Т1.Поле2а)

Наиболее громоздкое выражение получится при реализации на SQL операции реляционного деления. Поэтому запишем его для случая, когда таблица-делимое Т1 содержит 2 поля с именами Поле 1 и Поле 2, а таблица-делитель Т2 – одно поле с именем Поле 2. Таблица-результат будет содержать одно поле с именем Поле 1.

SELECT DISTINCT Т1. Поле 1 FROM Т1 WHERE NOT EXISTS (SELECT Т2.Поле 2 FROM Т2 WHERE NOT EXISTS (SELECT Т1.Поле 1 FROM Т1 AS Т11 WHERE Т11.Поле 1 = Т1.Поле 1 AND Т11.Поле 2 = Т2.Поле 2))

Выражение содержит служебное слово EXISTS (существует) с логическим отрицанием NOT. Условие NOT EXISTS (SELECT … FROM … WHERE) вернет значение ИСТИНА только, если результат выполнения выражения в скобках не содержит ни одной записи.

Конструкция Т1 AS Т11 означает, что во внутреннем выражении для таблицы Т1 используется псевдоним Т11 для сохранения ее отличия от экземпляра той же таблицы во внешнем выражении.

Поскольку реляционное деление – операция сложная для понимания, подчеркну еще раз ее смысл на примере. Пусть Поле 1 – Наименования производителей бытовой техники (Indesit, Zanussi, Miele…), а Поле 2 – категории поставляемого оборудования (холодильники, стиральные машины, посудомоечные машины…). Тогда результатом выполнения деления будет ответ на вопрос, какие производители производят ВСЕ категории оборудования из таблицы Т2.

Дословно представленное выражение SQL для этого случая на русский язык можно перевести так: Отобрать производителей из таблицы Т1, для которых не существует таких записей о категориях оборудования в таблице Т2, для которых не существует записей в таблице Т1 для этого производителя и этой категории.

Данный способ реализации реляционного деления на языке SQL не единственный.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...