Реляционное исчисление на кортежах

advertisement
Реляционное исчисление на
кортежах
Язык Альфа
Реляционное исчисление на
кортежах
• В реляционном исчислении на кортежах областями
определения переменных являются таблицы базы данных, т.е.
допустимым значением каждой переменной является кортеж
– строка некоторой таблицы.
• Пример реляционной модели “Поставка деталей”
(подчеркнуты ключевые поля):
ДЕТАЛЬ
(ДИмя, ДНомер, ДМодель, ДЦена)
ПОСТАВЩИК
(ПИмя, ПНомер, Город)
КЛИЕНТ
(КИмя, КНомер, Город)
ПОСТАВКА
(ДНомер, ПНомер, КНомер, Дата, Колво)
Операция 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
Download