Реляционные исчисления. В реляционной модели реляционное исчисление альтернативно подходу основанному на алгебре. Можно сказать,что формулировка запроса в терминах исчисления носит описательный характер, а алгебраическая формулировка предписывающий. Иначе говоря алгебра имеет процедурный характер, а исчисления не процедурный. Но на самом деле упомянутые отличия существуют только внешне, алгебра и исчисления эквивалентны. Приведем грамматику для исчисления кортежей в форме Б.Н.Ф.. квадратные скобки здесь указывают на компоненты, которые по умолчанию могут быть опущены. Range-variable-definition ::=RANGE OF VARIABLE is range item-commalist range-item ::= relation | expression expression ::= (target-item-commalist)[WHERE wff] target-item ::= variable | variable-attribute [AS attribute] wff ::= condition | NOT wff |condition AND wff |condition OR wff |IF condition THEN wff |EXISTS variable (wff) |FORALL variable (wff) |(wff) Комментарии к БН. 1 Категории терминов relation (отношение), variable (переменная), attribute (атрибут), определяются как идентификаторы. 2 Категория wff представляет правильно построенную формулу. 3 Категория condition (условие) представляет или формулу wff заключенную в скобки, или простое скалярное сравнение типа comporant comporant. 1 Здесь обозначает любой используемый скалярный оператор сравнения и каждый comporant это либо скалярная константа, либо значение атрибута представленного с ссылкой на атрибут в форме переменная. атрибут. 2 Переменные и кортежи. Переменные кортежи (или области значений) определяются следующим образом: RANGE OF T IS X1,X2,….,Xn. Здесь Т определяемая переменная кортежа, а Xi – (i=1…n) либо имя отношения, либо выражение исчисления кортежей. Пусть Xi является отношением Ri (i=1…n). Отношения R1,R2,…Rn должны быть совместимы по типу, т.е. они должны иметь идентичные заголовки. Тогда переменная кортежа Т изменяется на объединении этих отношений, т.е. её значение в любое заданное время будет некоторым текущим кортежем, по крайней мере, одного из этих отношений. Пр-р. RANGE OF SX IS S; RANGE OF SPX IS SP; RANGE OF SY IS (SX) WHERE SX.CITY = ‘London’, (SX) WHERE SPX(SPX.S# = SX.S# AND SPX.P# = ‘P1’) Переменная кортежа SY может принимать значения из мн-ва кортежей S для поставщиков, которые или размещаются в Лондоне, или поставляют деталь P1,или и то и другое. 3 Кванторы Существуют 2 квантора EXISTS (существует) и FORALL (для всех), если f – формула wff, которая используется переменной X, то EXISTS X(f) и FORALL X(f) являются допустимыми формулами wff. Первая формула означает, что существует по крайней мере одно такое значение переменной Х, что вычисление формулы wff дает значение истины. Вторая формула означает, что для всех значений переменной Х вычисление формулы wff дает значение истины. Пример квантора существования: EXISTS SPX(SPX.S# = SXS# AND SPX.P# = ‘P2’) Пример для квантора общностью: FORALL PX(PX.COLOR = ‘Red’) 4 Выражение В рассмотренной грамматике БНФ выражение исчисления картежей (target-item-commalist)[WHERE f] остановимся подробнее на первом элементе приведенной конструкции. В списке целевых элементов (target-item-commalist) каждый элемент списка является или именем простой переменной, такой как Т, или выражением вида Т.А[AS X]. Здесь Тэто переменная картежа, Аэто атрибут сопоставляемого отношения. Чать AS X может быть опущена и тогда атрибут результата будет наследовать имя соответствующего сопоставляемого соотношения: SX.S# ; SX.S# AS SND ; SX.S#, SX.CITY AS SCITY ; PX.P#, PX.CITY AS PCITY. Рассмотрим в общих чертах, что случится при вычислении следующего отношения: Пусть переменные картежей определенные в указанном списке целевых элементов будут T, U, . . , V. Пусть отношения, на которые изменяются переменные картежа будут TR, UR, .. , VR. Пусть результирующие атрибуты имеют имена (явно определенные или наследуемые) Х1, Х2, . . , Хr, тогда: 1. Строится расширенное декартовое произведение TR TIMES UR TIMES . . . VR 2. Картежи, которые не удовлетворяют формуле wff в фразе WHERE (если она есть) исключается из результата шага 1. 3. Результат шага 2 проецируется по атрибутам Х1, Х2, . . , Хr Примеры формулировки запросов Рассмотрим несколько примеров использования реляционного исчисления при формулировке запросов. 1. Получить все такие пары номеров поставщиков, что два поставщика размещены в одном городе (SX.S# AS FIRSTS#, SY.S# AS SECONDS#) WHERE SX.CITY=SY.CITY AND SX.S#<SY.S# Спецификация AS FIRSTS# и AS SECONDS# дают имена атрибутам результатов. Следовательно такие имена недоступны в фразе WHERE и поэтому второе сравнение в фразе WHERE выглядит как SX.S#<SY.S# а не FIRSTS#<SECONDS# 2. Получить имена поставщиков, которые поставляют деталь P2. SX.SNAME WHERE EXISTS SPX (SPX.S#=SX.S# AND SPX.P#=’P2’) 3. Получить имена поставщиков, которые поставляют по крайней мере одну красную деталь. SX.SNAME WHERE EXISTS SPX (SX.S#=SPX.S# AND EXISTS PX (PX.P# = SPX.P# AND PX.COLOR=’Red’)) 4. Получить имена поставщиков, которые не поставляют деталь P2 SX.NAME WHERE NOT EXISTS SPX (SPX.S#=SX.S# AND SPX.P#=’P2’) 5. Получить номера поставщиков, которые поставляют по крайней мере все детали, поставляемые поставщиком S2. SX.S# WHERE FORALL SPY(IF SPY S#=’S2’ THEN EXISTS SPZ (SPZ.S#=SX.S# AND SPZ.P#=SPY.P#)) Получить номера поставщиков, скажем SX, таких, что для всех поставок SPY в случае поставки от поставщика S2 существует поставка SPZ деталей SPY от поставщика SX. 6 Вычислительные возможности. Так же как и в реляционной алгебре, в реляционное исчисление можно добавить вычислительные возможности. Приведем синтаксис для ссылок на итоговую функцию. aggregate-function (expression [, attribute]) Здесь итоговыми функциями могут быть COUNT, SUM, AVG, MIN, MAX Expression – это выражение исчисления картежей, а attribute – это такой атрибут результирующего отношения, по которому проводится итог. Пример: Для каждой детали получить ее номер и общее поставляемое количество. PX.P#, SUM (SPX WHERE PSX.P#=PX.P#, QTY AS TOTQTY) 7 Реляционное счисление и реляционная алгебра Кодом было доказано, что реляционная алгебра и реляционное исчисление эквивалентны. Т. о. Алгебраические операторы (8 операторов Кода) обеспечивают соглашение целевого языка, как средства возможности реализации исчисления. Это соответственно дает возможность оценки языка: 1. Язык называется реляционно полным, если он по своим возможностям по крайней мере не уступает реляционному исчислению. 2. Поскольку алгебра реляционно полная, то чтобы доказать, что некоторый язык L обладает реляционной полнотой, достаточно показать, что в языке L есть аналогии всех 8 алгебраических операций (точнее пяти примитивных) и что операциями могут быть любые выражения этого языка. Язык SQL – это пример языка, реляционная замкнутость которого можно показать таким способом. 8 Язык SQL (язык структурированных запросов) Язык SQL предназначен для формирования запросов к базам данных. Современный SQL весьма далёк от полноценной реализации реляционной модели и тем не менее он является стандартным реляционным языком и в настоящее время поддерживается практически всеми продуктами представленными на рынке. Поэтому каждый специалист по БД д.б. с ним знаком. SQL – это очень объёмный язык. Документ по его стандарту содержит более 600 страниц, поэтому рассмотрим главные аспекты этого языка. Ни один из существующих коммерческих продуктов не поддерживает в полной мере стандарт SQL 92. Их можно назвать надмножествами подмножества языка SQL 92. В SQL используются такие термины как таблицы, строки и столбцы, вместо реляционных – отношение, кортеж и атрибут. 9 Определение данных (Data Definition Language) Мы будем рассматривать основные объекты данных и соответствующие операторы языка определения данных в SQL. Основные операторы DDL: CREATE DOMAIN CREATE TABLE ALTER DOMAIN ALTER TABLE DROP DOMAIN DROP TABLE 5 Домены Домены в SQL далеки от настоящих реляционных доменов. Единственная цель доменов в SQL – это обеспечить возможность один раз определить элементарную спецификацию типа данных, а затем использовать её для нескольких столбцов нескольких базовых столбцов. Приведём синтаксис для создания домена SQL: (1) CREATE DOMAIN data-type (2) [default-definition] (3) [domain-constraint-definition-list]; (1) в языке SQL поддерживаются следующие типы доменов: CHARACTER INTEGER DATE BIT SMALLINT TIME NUMERIC FLOAT INTERNAL DECIMAL (2) необязательный элемент – определение по умолчанию применяется к каждому столбцу определённому на домене. Default – это литеральное значение или ссылка к встроенной niladic функции (без аргументов). Например: CURRENT-DATE или NULL (3) необязательный список определений ограничений доменов представляет набор ограничений целостности, применяемых к каждому столбцу, основанному на этом домене. Это или перечисление значений составляющих домен или логическое выражение произвольной сложности. Пример определения домена: CREATE DOMAIN COLOR CHAR(6) DEFAULT ‘???’ CONSTRAINT (VALUE IN (‘RED’,’YELLOW’,’BLUE’,’GREEN’,’???’)); Тогда оператор CREATE TABLE для базовой таблицы Р (деталей) может выглядеть следующим образом: CREATE TABLE P(…,COLOR COLOR,…); Существующий домен можно изменить в любое время с помощью оператора ALTER DOMAIN. Существующий домен можно уничтожить с помощью оператора DROP DOMAIN имеющего следующий синтаксис DROP DOMAIN domain option Здесь опция option может принимать значения RESTRICT или CASCADE. 11 Базовые таблицы. 1. В таблицах SQL в отличие от настоящих отношений не допустимы идентичные строки (поэтому им не требуется каких-либо потенциальных ключей). 2. В таблицах SQL в отличие от настоящих отношений – столбцы рассматриваются в порядке слева направо. Приведем синтаксис выражения определения базовой таблицы: CREATE TABLE base-table (base-table-element _commalist); Здесь каждый элемент базовой таблицы basetable-element является либо определением столбца, либо определением ограничения базовой таблицы. Каждое определение столбца выглядит следующим образом: Column-representation [default_definition] Здесь column означает название столбца, representation указывает необходимый тип данных или doman, а необязательное определение по умолчанию default-definition указывает назначение столбца по умолчанию, использующее значение по умолчанию на уровне домена (если оно имеется). Если таковое значение отсутствует как для столбца, так и для домена, то предполагается, что значение по умолчанию NULL. Рассмотрим определение ограничений базовой таблицы, их 3. 1) Потенциальные ключи. Определение потенциального ключа имеет вид: UNIQUE (column_commalist) или PRIMARY KEY (column_commalist) Для данной таблицы должно быть не более одной специализации PRIMARY KEY и любое количество UNIQUE. В случае первичного ключа для каждого из указанных столбцов дополнительно подразделяется специализации NOT NULL. 2) Внешние ключи: FOREIGN KEY (column_commalist); REFERENCES base-table [column_commalist] [ON DELETE option] [ON UPDATE option]; Здесь option принимает значение: NOACTION, CASCADE, SETDEFAULT, SETNULL. 3) Проверочные условия. CHECK (conditional-expression) Попытка создания строки в базовой таблице В рассматривается как нарушение условия таблицы В. Если в таблице в результате вычисления условия, указанного в этом ограничении и получено значение ЛОЖЬ. Пример создания таблицы с помощью оператора CREATE TABLE: CREATE TABLE SP (S# S# NOT NULL, P# P# NOT NULL, QTY QTY NOT NULL, PRIMARY KEY (S#, P#), FOREIGN KEY (S#) REFERENCES S ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (P#) REFERENCES P ON DELETE CASCADE ON UPDATE CASCADE, CHECK (QTY>0 AND QTY<5001)); Здесь подразумевается, что домены S#, P# и QTY уже определены, а S#, P# явно определены как первичные ключи для таблиц S и P соответственно. Существующая базовая таблица может быть изменена в любое время с помощью оператора ALTER TABLE. Поддерживаются следующие изменения: 1. добавление новых столбцов. 2. определение для существующего столбца нового значения по умолчанию. 3. удаление для существующего столбца значения по умолчанию. 4. удаление существующего столбца. 5. указание нового ограничения целостности для базовой таблицы. 6. удаление существующего ограничения целостности для базовой таблицы. Приведем пример для 1-го случая: добавление нового столбца. ALTER TABLE S ADD COLUMN DISCONNT INTEGER DEFAULT –1; Существующая базовая таблица может быть уничтожена с помощью DROP TABLE. DROP TABLE base-table option Здесь option принимает значение CASCADE, RESTRICT. 10 Информационная схема. В SQL существуют понятия каталога и схемы. Не строго говоря, каталог в SQL состоит из дескрипторов для отдельной базы данных, а схема состоит из дескрипторов той части этой базы данных, которая относится к некоторому отдельному пользователю. Другими словами, может быть любое число каталогов, каждый из которых делится на произвольное число схем. Но требуется, чтобы каждый каталог содержал ровно одну схему, называемую INFORMATION>SCEMA, которая с точки зрения пользователя является схемой, выполняющей функции обычного каталога. Приведем некоторые из наиболее важных представителей информационных схем: SHEMATA USAGE-PRIVILEGES DOMAINS DOMAIN-CONSTRAINTS TABLES CHECK_CONSTRAINTS VIEWS KEY_COLUMN-USAGE COLUMNS ASSECTIONS TABLE-PRIVILEGES COLUMN-PRIVILEGES 12 Обработка данных операцией выборки. Рассмотрим кратко операторы SQL языка обработки данных (DML). Основные операторы DML – это SELECT, INSERT, UPDATE, DELETE. Примеры: 1) Получить цвета и города для деталей не из Парижа с весом больше 10. SELECT P.COLOR, P.CITY FROM P WHERE P.CITY<>’PARIS’ AND P.WEIGHT>10; Здесь возвращается 4 строки, так как язык SQL не удаляет лишних дублирующих строк, пока пользователь явно не потребует этого с помощью ключевого слова DISTINCT (различать, распознавать). SELECT DISTINCT P.COLOR, P.CITY FROM P WHERE P.CITY<>’PARIS’ AND P.WEIGHT>10; Этот запрос будет возвращать только 2 строки. Последовательность сток в полученной таблице в общем не предсказуема, пока пользователь не задаст некоторую определенную последовательность как в следующем примере: SELECT DISTINCT P.COLOR, P.CITY FROM P WHERE P.CITY<>’PARIS’ AND P.WEIGHT>10. ORDER BY CITY DESC; 2) Получить информацию обо всех парах поставщиков и деталей, совмещенных в одном городе. А) SELECT S.S#, S.SNSME, S.STATUS, S.CITY, P.P#, P.PNAME, P.COLOR, P. WEIGHT FROM S, P WHERE S.CITY=P.CITY; Б) S JOIN P USING CITY; В) S NATURAL JOIN P; Рассмотрим подробнее первую формулировку. Исторически она была единственной допустимой в SQL, операция JOIN была добавлена в SQL-92. Во-первых, после выполнения инструкции FROM мы получаем декартово произведение: S TIMES P. Во-вторых, после выполнения WHERE мы получаем выборку из этого произведения, в котором два значения CITY в каждой строке равны. В-третьих, после выполнения оператора SELECT мы получаем проекцию выборки по страницам, указанным в инструкции SELECT. Конечным результатом будет естественное соединение. Следовательно, нестрого говоря, инструкция FROM в SQL соответствует декартовому произведению, инструкция WHERE выборке, а совместная инструкция SELECT-FROM-WHERE представляет проекцию выборки произведения. 3. Получить все пары номеров поставщиков, таких что оба поставщика в каждой паре размещаются в одном и том же городе: SELECT FIRST.S# AS SA, SECOND.S# AS SB FROM S AS FIRST.S AS SECOND WHERE FIRST.CITY = SECOND.CITY AND FIRST.S# < SECOND.S#; 4. Получить максимальное и минимальное количество для детали P2: SELECT MAX(SP.QTY) AS MAXQ, MIN(SP.QTY) AS MINQ FROM SP WHERE SP.P#=’P2’; 5. Получить номера для всех деталей поставляемых более чем одним поставщиком: SELECT SP.P# FROM SP GROUP BY SP.P# HAVING COUNT(SP.P#) >1; Инструкция HAVING для групп, это то же самое, что и инструкция WHERE для строк, т.е. инструкция HAVING используется для исключения групп точно также как инструкция WHERE –для исключения строк. 6. Получить имена поставщиков поставляющих деталь P2: SELECT DISTINCT S.NAME FROM S WHERE S.S# IN (SELECT SP.S# FROM SP WHERE SP.P#=’P2’); В этом примере используется так называемый подзапрос. Подзапрос- это выражение SELECT-FROM-GROOP BY-HAVING, которое вложено в другое такое же выражение. Подзапрос обычно используется для представления множества значений, поиск которых осуществляется с помощью инструкции IN condition. Система полностью осуществляет запрос вычислив сначала подзапрос. Этот подзапрос возвращает множество номеров поставщиков поставляющих деталь Р2, а именно { S1, S2, S3, S4 }. Т.о. первоначальное выражение эквивалентно следующему, более простому: SELECT DISTINCT S.SNAME FROM S WHERE S.S# IN( ‘S1’, ’S2’, ‘S3’, ‘S4’ ); Отметим, что поставленную задачу можно равносильно выразить с помощью операции «соединение». Например: SELECT DISTINCT S.SNAME FROM S, SP WHERE S.S# = SP.S# AND SP.P# = ’P2’; 7. Получить имена поставщиков, поставляющих по крайней мере одну красную деталь: SELECT DISTINCT S.SNAME FROM S WHERE S.S# IN (SELECT SP.S# FROM SP WHERE SP.P# IN (SELECT P.P# FROM P WHERE P.COLOR=’RED’)); 8. Получить имена поставщиков, которые поставляют деталь P2 (другой способ): SELECT DISTINCT S.SNAME FROM S WHERE EXISTS (SELECT * -все столбцы слева-направо FROM SP WHERE SP.S# = S.S# AND SP.S# = ‘P2’); Здесь функция EXISTS соответствует квантору существования в реляционном исчислении. 9. Получить имена поставщиков, которые не поставляют деталь Р2: SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.S# = S.S# AND SP.S# = ‘P2’); 10. Получить имена поставщиков поставляющих все детали: SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM P WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.S# = S.S# AND SP.P# = P.P#)); Язык SQL не включает какой-либо непосредственной поддержки квантора FORALL, следовательно запросы типа FORALL обычно выражаются через отрицание (как в разобранном примере). Существуют обходные приемы позволяющие избежать использование негативных кванторов. Например: SELECT DISTINCT S.SNAME FROM S WHERE (SELECT COUNT(SP.S#) FROM SP WHERE SP.S#C = S.S#) = ( SELECT COUNT(P.P#) FROM P ); -здесь получим имена поставщиков для которых кол-во поставляемых деталей равно кол-ву всех деталей. 13 Обработка данных : операции обновления. Язык обработки данных включает три операции обновления : - INSERT - UPDATE - DELETE 1) Пример (вставки нескольких строк) INSERT INTO TEMP (S#, CITY) SELECT S.S#, S.CITY FROM S WHERE S.STATUS >15; 2) Обновление нескольких строк UPDATE P SET CITY = (SELECT S.CITY FROM S WHERE S.S#=’S5’) WHERE P.COLOR=’RED’; 3) Удаление нескольких строк DELETE FROM SP WHERE ‘London’= (SELECT S.CITY FROM S WHRE S.S# =SP.S#); Список табличных выражений : NATURAL JOIN, SELECT, CROSS JOIN, EXEPT, CORRESPONDING BY, INTERSECT 15 Условные выражения: 1)Условие MATCH row – constructor MATCH UNIQUE (table – expression) Пусть r1- это строка, полученная в результате вычисления row-costructor и пусть Т-таблица, полученная в результате вычисления table-expression, тогда вычисление условия MATCH будет давать истину тогда и только тогда, когда таблица Т будет содержать ровно одну строку, скажем r2 , такую что сравнение r1=r2 будет давать истину. Пример : SELECT SP.# FROM SP WHERE NOT (SP.S# MATCH UNIUE (SELECT S.S# FROM S)); Получить поставки, которые не имеют ровно одного соответствующего поставщика в таблице поставщиков. Такой запрос может быть полезен при проверке целостности базы данных, поскольку если база данных корректна, то не должно быть ни одной такой поставки. 2)Условие ANY, ALL row-constructor comparison-operator qualifier (table-expression) Здесь оператор сравнения (comparison-operator) , берется из обычного набора (=,<>,…), а квантор qualifier- это ключевое слово ( ALL OR ANY). В общем условие ALL OR ANY дает значение истина для всех или соответственно для какой ни будь строк таблицы, представляемой выражением tableexpression. Пример: Получить названия таких деталей, вес которых больше веса любой голубой детали. SELECT DISTINCT PX.PNAME FROM P AS PX WHERE PX.WEIGHT>ALL (SELECT PY.WEIGHT FROM P AS PY WHERE PY.COLOR=’Blue’); Пояснение: Вложенное табличное выражение возвращает множество весов всех голубых деталей, а именно множество {17,12}. Тогда внешнее выражение SELECT возвращает название только одно детали, а именно детали Р6, вес которой больше каждого значения в этом множестве. 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Оглавление. Реляционные исчисления. Переменные и кортежи. Кванторы Выражение Примеры формулировки запросов Вычислительные возможности. Реляционное счисление и реляционная алгебра Язык SQL Определение данных (Data Definition Language) Домены Базовые таблицы. Информационная схема. Обработка данных операцией выборки. Обработка данных : операции обновления. Условные выражения: