Реляционное исчисление на кортежах Язык Альфа Реляционное исчисление на кортежах • В реляционном исчислении на кортежах областями определения переменных являются таблицы базы данных, т.е. допустимым значением каждой переменной является кортеж – строка некоторой таблицы. • Пример реляционной модели “Поставка деталей” (подчеркнуты ключевые поля): ДЕТАЛЬ (ДИмя, ДНомер, ДМодель, ДЦена) ПОСТАВЩИК (ПИмя, ПНомер, Город) КЛИЕНТ (КИмя, КНомер, Город) ПОСТАВКА (ДНомер, ПНомер, КНомер, Дата, Колво) Операция GET • Строки выбираются во временную таблицу, назовем ее W. • Найти все названия поставщиков и города, в которых они находятся. GET W(ПОСТАВЩИК.ПНомер, ПОСТАВЩИК.Город) proj Формирование условий • В условиях используются операции сравнения =,!=, >,<,>=,<=. • Для формирования сложных условий используются логические связки AND, OR, NOT. • Строки-константы задаются в кавычках. • Найти все детали модели МС550 GET W(Деталь) : ДМодель=”МС550” sel Выборка из нескольких таблиц • Напечатать, какие детали и когда поставлялись – названия деталей и даты поставок. GET W(Деталь.ДИмя, Поставка.Дата): Деталь.ДНомер=Поставка.ДНомер join Переменные и квантор • Если таблица используется только в условиях запроса, следует объявить переменную на основе этой таблицы. • Напечатать, какие детали и куда поставлялись – названия деталей и города покупателей. RANGE Поставка X GET W(Деталь.ДИмя, Клиент.Город): X (Деталь.ДНомер=Х.ДНомер AND Клиент.КНомер=X.КНомер) join Переменные и квантор • Напечатать имена поставщиков, которые не поставляют детали клиенту с номером 123 RANGE Поставка X GET W(Поставщик.ПИмя): X (Поставщик.ПНомер!=Х.ПНомер OR X.КНомер!=123) или GET W(Поставщик.ПИмя): ! X (Поставщик.Пномер=Х.ПНомер AND X.КНомер=123) difference Переменные и кванторы и • Напечатать имена поставщиков, которые поставляют детали всем клиентам. RANGE Поставка X RANGE Клиент Y GET W(Поставщик.ПИмя): Y X (Поставщик.ПНомер=Х.ПНомер AND Y.КНомер=X.КНомер) division Запрос из нескольких шагов • Напечатать имена поставщиков, которые поставляют детали всем клиентам из Москвы. GET W(Клиент.КНомер): Клиент.Город=«Москва» RANGE Поставка X RANGE W Y GET W2(Поставщик.ПИмя): Y X (Поставщик.ПНомер=Х.ПНомер AND Y.КНомер=X.КНомер) division Еще примеры • Напечатать имена поставщиков, которые поставляют детали клиентам из Москвы и из Казани. RANGE Поставка X1 RANGE Клиент Y1 RANGE Поставка X2 RANGE Клиент Y2 GET W(Поставщик.ПИмя): X1 X2 Y1 Y2 (Поставщик.ПНомер=Х1.ПНомер AND Y1.КНомер=X1.КНомер AND Поставщик.ПНомер=Х2.ПНомер AND Y2.КНомер=X2.КНомер AND Y1.Город=«Москва» AND Y2.Город=«Казань») intersection Еще примеры • Напечатать имена поставщиков, которые поставляют детали клиентам из Москвы или из Казани. RANGE Поставка X1 RANGE Клиент Y1 GET W(Поставщик.ПИмя): X1 Y1 (Поставщик.ПНомер=Х1.ПНомер AND Y1.КНомер=X1.КНомер AND (Y1.Город=«Москва» OR Y1.Город=«Казань») ) Еще примеры • Напечатать имена поставщиков, которые сами находятся в Москве или поставляют детали клиентам из Москвы. RANGE Поставка X1 RANGE Клиент Y1 GET W(Поставщик.ПИмя): Поставщик.Город= «Москва» OR X1 Y1 (Поставщик.ПНомер=Х1.ПНомер AND Y1.КНомер=X1.КНомер AND Y1.Город=«Москва» ) union Агрегатные функции • COUNT, MIN, MAX, TOTAL, AVERAGE • Подсчитать количество поставщиков из Москвы GET W( COUNT(Поставщик.ПНомер)) : Поставщик.Город=«Москва» Сортировка и задание количества строк • Сортировка: UP или DOWN • Напечатать названия 5 самых дорогих деталей: GET W(5)(Деталь.ДИмя) : DOWN Деталь.Цена Изменение данных • Заменить город на Москву у поставщика с номером 456 HOLD W(Поставщик): Поставщик.ПНомер=456 W.Город = «Москва» UPDATE W Добавление данных • Добавить поставщика с номером 987, названием «Альфа» и городом «Москва» W.ПНомер=987 W.ПИмя= «Альфа» W.Город = «Москва» PUT W(Поставщик) Удаление данных • Удалить поставщика с номером 135 HOLD W (Поставщик): Поставщик.ПНомер=135 DELETE W