Примеры запросов

Рассмотрим несколько примеров запросов к реальным данным из предметной области ПОСТАВКА_ДЕТАЛЕЙ, используя отношения, схемы которых таковы:

Post (PN, PIM, ST, GOR)

Det (DN, DIM, CENA)

PD (PN, DN, KOL)

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

Пример 7.Получить сведения о поставщиках, имеющих статус 100

(* ? ® ST = 100)

Процедура получения ответа на такой запрос запишется в виде:

REZ = sST = 100 (Post)

Пример 8. Удалить из отношения Post все сведения о поставщике “p1” можно так:

Post = Post \ {“p1”, *}

Пример 9. Получить номера поставщиков, поставляющих деталь “d2”

(PN ? ®DN = “d2”).

Процедура получения ответа на такой запрос запишется в виде:

REZ = pPN (sDN = “d2” (PD))

Пример 10. Получить номера поставщиков, поставляющих детали по цене, меньшей 150 денежных единиц (PN ?®CENA < 150):

REZ = pPN (sCENA < 150 (Det) wv PD)

DN

Пример 11. Получить имена и города поставщиков, поставляющих гайки в количестве > 100 (PIM, GOR ? ® DIM = “гайка” AND KOL > 100):

REZ = pPIM, GOR ((sDIM = “гайка (Det) wv sKOL > 100 (PD)) wv Post)

DN PN

Пример 12. Все поставщики переехали из Москвы в Санкт-Петербург. Выполнить соответствующую корректировку отношения Post (PN, PIM, GOR).

Создадим сначала вспомогательное отношение T1 = GOR

СПб

Теперь укажем процедуру получения ответа на запрос:

1. В промежуточное отношение T2 отберем из Post кортежи для поставщиков из Москвы:

T2= sGOR = “Москва (Post)

2. Выделим в отношение Т3 их номера и имена:

Т3 = pPN, PIM (T2)

3. Добавим к ним столбец с городом “СПб”, используя операцию декартова произведения:

T4 = T3 x T1

Теперь все поставщики из Москвы стали проживать в Санкт-Петербурге.

4. В промежуточное отношение T5 отберем из Post кортежи для поставщиков не из Москвы: T5 = Post \ T2.

5. Объединим данные о поставщиках не из Москвы с данными о поставщиках, переехавших в Санкт-Петербург:

REZ = T5 ÈT4

Указанную процедуру можно записать одним оператором:

REZ = (Post \ sGOR = “Москва (Post))È (pPN, PIM (sGOR = “Москва (Post)) x T1

Поставив в соответствие каждой операции реляционной алгебры оператор языка запросов, можно сконструировать простой язык запросов реляционной алгебры. Поскольку набор операций реляционной алгебры обладает функциональной полнотой, то этим же свойством будет обладать и сконструированный язык запросов. С помощью языка запросов реляционной алгебры можно написать процедуру получения ответа на любой сколь угодно сложный запрос. Например, для рассматриваемого примера процедура получения ответа на запрос может быть записана как последовательность операторов:

1. SELECT Post WHERE GOR = “Москва” GIVING T2

2. PROJECT T2 OVER PN, PIM GIVING T3

3. T3 TIMES T1 GIVING T4

4. Post MINUS T2 GIVING T5

5. T5 UNION T4 GIVING REZ

Используя идею вложенности операторов (подставляя вместо Т2, Т3, Т4 и Т5 полученные для них выражения), перечисленную выше цепочку операторов можно представить одним оператором в виде:

(Post MINUS (SELECT Post WHERE GOR = “Москва”))

UNION

((PROJECT (SELECT Post WHERE GOR = “Москва”) OVER PN, PIM) TIMES T1)

GIVING REZ

Язык запросов реляционной алгебры был исторически первым языком запросов, который использовали ранние СУБД. Однако у него есть один существенный недостаток, а именно, процедурность. Это означает, что нужно указывать последовательность выполнения операторов для получения ответа на запрос. Иногда более простое выражение может потребовать большего времени для выполнения процедуры, чем более сложное выражение. Это привело к необходимости создания достаточно сложных оптимизаторов запросов. В конце концов, разработчики СУБД от языков запросов реляционной алгебры отказались и начали использовать непроцедурные (или слабо процедурные) языки запросов, основанные на реляционном исчислении. Таким языком запросов является SQL (Structured Query Language) – структурированный язык запросов, который в настоящее время широко используется почти во всех реляционных СУБД и имеет несколько стандартов. На языке SQL не надо указывать процедуру получения ответа на запрос, а нужно определить, что нужно делать, откуда брать данные, при каком условии и что мы хотим получить в ответе. Так, например, для примера 7 запрос на JET SQL (стандарт для СУБД Microsoft Access) будет сформулирован так:

SELECT Post.*

FROM Post

WHERE ST = 100;

Для примера 8:Для примера 9:Для примера 10:

DELETE * SELECT PN SELECT DISTINCT PN

FROM Post FROM PD FROM Det, PD

WHERE PN = "p1"; WHERE DN = "d2"; WHERE (CENA<150) AND

(Det.DN = PD.DN);

Для примера 11:Для примера 12:

SELECT PIM, GOR UPDATE Post SET GOR = "СПб"

FROM Post, Det, PD WHERE GOR = "Москва";

WHERE (DIM="гайка") AND (KOL > 100) AND

(Det.DN = PD.DN) AND (Post.PN = PD.PN);