
- •Введение в реляционные субд и программирование на sql
- •Казань 2002
- •Базы данных как аппарат моделирования.
- •Классификация бинарных отношений.
- •Реляционные бд.
- •Проектирование бд как сжатие информации.
- •Представления.
- •Диаграмма 2. Навигационный и реляционный подход к субд.
- •Создание и модификация структуры бд
- •Модификация содержимого таблиц
- •Запросы к бд - команда select.
- •Примерные типы заданий.
- •Определите атрибуты продавцов, продавших хотя бы одно наименование из товаров, проданных данным продавцем.
- •Тема 3. Задачи-многоходовки. Представления и транзакции.
- •Тема 4. Проектирование "реальной" бд.
- •Izdel k_izdel (код изделия)
- •Izdel (наименование)
- •1. Определение типов сущностей
- •2. Определение типов связей
- •Izdel отпускаются по zakaz
- •Связь zakazpokup.
- •Тип сущности Атрибут
- •Izdel k_izdel (код изделия )
- •Izdel (наименование)
- •Izdel участвует oper
- •Izdel изготавливается в oper
- •Izdel изготавливается в zech
- •Izdel изготавливается rabot
- •Vidacha (к выдаче)
Определите атрибуты продавцов, продавших хотя бы одно наименование из товаров, проданных данным продавцем.
Кванторные предикаты. Определите атрибуты объектов, для которых категория связанных с ними объектов (не)пуста.
Определите атрибуты продавцов, (не) обслуживающих хотя бы одного казанского покупателя.
Определите атрибуты продавцов, (не) продавших за последний месяц дорогие товары.
(Связанные запросы).
(Внешние) объединения. Определите совпадающие атрибуты объектов из разных таблиц.
Вариант задания. Определите фамилии и возраст покупателей и продавцов, проживающих в данном городе (например, Казани).
МОДИФИКАЦИЯ ТАБЛИЦ
Удалите из таблиц заданные категории объектов.
Вариант задания.
Удалите все сведения о товарах, не пользовавшихся спросом в последнее время (скажем, год).
Удалите сведения о продавцах, не осуществляших никаких продаж за последнее время.
Удалите сведения о покупателях, не делавших покупок за последнее время.
Измените значения атрибутов объектов заданной категории.
Тема 3. Задачи-многоходовки. Представления и транзакции.
В контексте заданной предметной области, любой человек характеризуется следующими данными.
NAMe ФАМИЛИЯ (30 символов)
ID ПАСПОРТ - № паспорта, 10 символов (очевидно, уникальный для каждого человека)
MUM МАТЬ - № паспорта матери (NULL, если нет сведений)
DAD ОТЕЦ - № паспорта отца (NULL, если нет сведений)
СУПРУГ - № паспорта жены/мужа (NULL, если нет сведений)
BIRTDAY ДАТА - дата рождения (тип дата)
INCOME ДОХОД - ежемесячный доход (зарплата, стипендия и т.п.), вещественное 99.999.999,99
CITY ГОРОД - город проживания (30 символов)
TAX НАЛОГ - сумма подоходного налога, в % (целое)
Кроме того, в информацию о студентах дополнительно включаются сведения
INSTITUTE ВУЗ - сокращенное название ВУЗа, 10 символов - например, ‘КГУ’, ‘КГМУ’ и т.п.
SEX ПОЛ - один из символов ‘М’,’Ж’
БД включает таблицы СТУДЕНТЫ, ОТЦЫ и МАТЕРИ, включающую информацию о студентах и их родителях, соответственно.
ПРИМЕЧАНИЕ. Как всегда, считаем, что допустимо применение имен на кириллице.
Выдать список студентов, с указанием фамилий и дохода родителей, упорядоченный по возрасту студентов. Студентов, чьи доходы ниже 100 руб., в список не включать.
Выдать упорядоченный по фамилиям список живущих в Казани, Москве и Самаре родителей, с указанием - мать это или отец, чей доход не превышает 300 руб.
Выдать все пары студентов-однофамильцев из КГУ, с указанием фамилии и, для обоих, паспортных данных. Дублирующиеся пары не включать.
Выбрать всю информацию об отцах, чьи доходы выше среднего по городу, в котором они живут.
Выдать список живущих вне Казани матерей, имеющих не менее - двух сыновей-студентов, учащихся в Казани.
Выбрать всю информацию об студентах, чьи доходы выше среднего для казанских студентов.
"Многоходовки" – т.е. задачи, решение которых не реализуется легко единственной командой SQL проще решать, используя представления или курсоры, например:
Удалить информацию о студентах ВУЗА 'АГУ' а также их родителях - в случае, если у тех нет других детей-студентов (вариант посложнее - включить в число родителей студентов их бабушек и дедушек)
Вариант решения:
запомнить студентов нужного ВУЗа и ссылки на их отцов,
запомнить отцов, у которых все дети (если вообще есть таковые) учатся в нужном ВУЗе
удалить информацию об отцах, входящих в первый и второй список
… сделать то же с мамами
удалить информацию о студентах нужного ВУЗа
Create View Dad1 as Select Distinct Dad from Students where Institute=’АГУ’
Create View as Dad2 as Select Id from Dad where NOT Exists (Select Id from Students where Dad=Dad.Id and Institute<>’АГУ’)
Delete from Dad where Id in (Select Id from Dad1) and Id in (Select Id from Dad2)
…
Delete from Students where Institute=’АГУ’
Замечание. Стандарт ANSI SQL запрещает в командах модификации подзапрос – в том числе, неявный (через представление) - к модифицируемым таблицам. Если реализация следует в этом стандарту – прибегнуть к курсорам - Select Distinct Dad from Students where Institute=’АГУ’ into cursor Dad1 etc.
- Снизить на 5% налог родителям, имеющим более 3 детей-студентов, обучающихся в Казани
Вариант решения:
Разбив казанских студентов на группы детей одних родителей, отобрать и запомнить ссылки на тех отца и мать, для которых количество их детей больше 3
Изменить записи о матерях, ссылки на которые были запомнены на первом шаге,
Изменить записи об отцах, ссылки на которые были запомнены на первом шаге.
CreateView Parents as Select Mum, Dad,Count(*) from Students Group BY Mum, Dad Having Count(*)>3
Update Mum set Tax= Tax-5 where Id in (Select Mum from Parents)
Update Dad set Tax= Tax-5 where Id in (Select Dad from Parents)
- Повысить на 50 руб. стипендию (т.е. доход) студентов, у которых нет хотя бы одного из родителей либо совокупный доход родителей не превышает 1000 руб.
Вариант решения:
Подсчитать и запомнить совокупный доход всех родителей (вместе со ссылками на отца и мать), если он не более заданной суммы,
Изменить соответственно информацию о студентах, для которых ссылки на родителей либо пусты, либо попали в запомненный список
Create View LowIncome as Student.Id as Id, Dad, Mum, Dad.Income+Mum.Income from Mums,Dads,Students where Student.Mum=Mum.Id and Student.Dad=Dad.Id and Dad.Income+Mum.Income<=1000
Update Students set Income=Income+50 where IsNull(Mum) or IsNull(Dad) or
Id in (Select Id from LowIncome)
- Повысить на 5% налог отцам, у которых доход жены не ниже среднего для матерей, а совокупный доход детей превышает 1000 руб.
Вариант решения:
Сгруппировав по отцам, подсчитать совокупный доход студентов по группе, запомнить ссылки на отцов, если подсчитанный доход больше заданной суммы.
Запомнить ссылки на матерей, чей доход больше среднего по матерям
Изменить соответственно информацию об отцах, попавших в первый список, у которых жена попала во второй список
Create View HignIncomeDads as Select Sum(Income),Dad from Students GroupBy Dad Having Sum(Income) >1000
Create View HignIncomeMum as Select Id from Mum where Income>(Select AVG(Income) from Mum)
Create View HignIncomeParents as Select Distinct Dad,Mum from Students where Dad in (Select Dad from HighIncomeDad) and Mum in (Select Id from HighIncomeMum)
Update Dads set Tax=Tax+5 where Id in (Select Distinct Dad from HignIncomeParents)