
- •«Базы данных»
- •(Для студентов очной и заочной формы обучения)
- •1. Организационно-методическая часть (Программа дисциплины)
- •1.1. Цели и задачи дисциплины
- •1.2. Требования к уровню освоения содержания дисциплины
- •1.3. Объем дисциплины и виды учебной работы (в часах)
- •1.4. Содержание дисциплины
- •1.4.1. Разделы дисциплин и виды занятий
- •1.4.2. Содержание разделов дисциплины
- •Тема 1. Введение.
- •Тема 2. Основные понятия. Модели данных.
- •Тема 3. Язык sql. Формирование запросов к бд.
- •Тема 4. Основы проектирования баз данных.
- •1.5. Перечень практических занятий
- •1.6. График выполнения самостоятельных работ студентами
- •1.7. Рекомендуемая литература
- •2. Конспект лекций (семестр 5)
- •2.1. Введение в базы данных
- •2.2. Классификация моделей данных
- •2.3. Язык sql
- •2.4. Проектирование баз данных
- •2.5.Физические модели баз данных
- •2.6. Распределённая обработка данных
- •2.7. Обеспечение безопасности в бд
- •2.8. Современные направления исследований и разработок
- •3. Конспект лекций (семестр 6)
- •3.1. Представления
- •3.2. Компоненты языка Transact-sql
- •3.3. Курсоры
- •3.4. Хранимые процедуры
- •3.5. Триггеры
- •4. Задания для проведения семинарских занятий
- •Create table Salespeople - - продавцы
- •Create table Customers - - покупатели
- •Create table Orders - - заказы
- •2. Ввод данных
- •3. Компиляция table Offices без ограничения внешнего ключа
- •4. Ввод данных
- •5. Компиляция table Salesreps без ограничения внешнего ключа
- •11. Компиляция table Orders
- •12. Ввод данных
- •5. Контрольные и самостоятельные работы
- •I. Создать и описать 3 таблицы базы данных «Студенты»
- •II. Внести данные в каждую из таблиц, например:
- •III. Выполнить запросы:
- •Задание на «Курсоры»
- •Задание на «Хранимые процедуры»
- •Задание на «Триггеры»
- •6. Вопросы к экзамену (семестр 5)
- •Классификация моделей данных.
- •Распределённая обработка данных.
- •Практическое задание к билету № 1
- •7. Вопросы к зачёту(семестр 6)
- •8. Форма итогового контроля
Create table Orders - - заказы
(
onum INTEGER NOT NULL PRIMARY KEY,
amt REAL,
odate DATETIME NOT NULL,
cnum INTEGER NOT NULL,
snum INTEGER NOT NULL,
FOREIGN KEY (snum) REFERENCES Salespeople (snum),
FOREIGN KEY (cnum) REFERENCES Customers (cnum)
);
Столбцы Таблицы Orders
1 |
onum |
Уникальный номер, присваиваемый каждой покупке (номер покупки). Это первичный ключ таблицы. |
2 |
amt |
Сумма покупки. |
3 |
odate |
Дата покупки. |
4 |
cnum |
Номер покупателя, делающего покупку. Это внешний ключ, ссылающийся на Customers (cnum). |
5 |
snum |
Номер продавца, совершившего продажу. Это внешний ключ, ссылающийся на Salespeople (snum) |
Orders (Заказы)
onum |
amt |
odate |
cnum |
snum |
3001 |
18.69 |
10/03/2000 |
2008 |
1007 |
3003 |
767.19 |
10/03/2000 |
2001 |
1001 |
3002 |
1900.10 |
10/03/2000 |
2007 |
1004 |
3005 |
5160.45 |
10/03/2000 |
2003 |
1002 |
3006 |
1098.16 |
10/03/2000 |
2008 |
1007 |
3009 |
1713.23 |
10/04/2000 |
2002 |
1003 |
3007 |
75.75 |
10/04/2000 |
2004 |
1002 |
3008 |
4723.00 |
10/05/2000 |
2006 |
1001 |
3010 |
1309.95 |
10/06/2000 |
2004 |
1002 |
3011 |
9891.88 |
10/06/2000 |
2006 |
1001 |
Вставка данных
INSERT INTO Salespeople
VALUES (1001,’Peel’, ‘London’, 0.12);
или
INSERT INTO Salespeople (snum, sname, city, comm)
VALUES (1001,’Peel’, ‘London’, 0.12);
Дату вводить как текст, т.е. в апострофах, например: ‘10/03/2000’
Удаление строк из таблицы DELETE FROM Salespeople
WHERE snum = 1007 - Удаляется строка с номером 1007
Удаление таблицы из базы данных
DROP TABLE Salespeople
Изменение значений полей
UPDATE Salespeople
SET city = ‘London’
WHERE snum = 1003
Тема. Использование SQL для выборки информации из таблиц.
Оператор SELECT
Напишите оператор SELECT, который выводит номер заказа, сумму покупки и дату покупки для всех строк в таблице Orders (Заказы).
Составьте запрос, который выводит все строки таблицы Customers (Покупатели) с номером продавца 1001.
Напишите запрос, который выводит таблицу Salespeople (Продавцы) в следующем порядке: city, sname, snum, comm.
Составьте запрос, который выводит без повторов значения snum для всех продавцов, обслуживающих заказы из таблицы Orders (Заказы).
Напишите запрос, который выдает имена всех продавцов в Лондоне с комиссионными более 0.10.
Напишите запрос к таблице Customers (Покупатели), из результата которого будут исключены все покупатели с рейтингом <=100, если только они не находятся в Риме.
Каким будет результат следующего запроса? SELECT * FROM Orders WHERE (amt < 1000 OR NOT (odate = ‘1/03/2000’ AND cnum > 2000) );
Каким будет результат следующего запроса? SELECT * FROM Orders WHERE NOT ((odate = ‘1/03/2000’ OR snum > 1006 ) AND amt>=1500);
Каким образом можно упростить следующий запрос? Считайте, что столбец coom не содержит NULL-значений. SELECT snum, sname, city, comm. FROM Salespeople WHERE (comm. >= 0.12 OR comm. < 0.14);
Тема. Операторы IN, BETWEEN, LIKE, IS NULL. Вычисление итоговых значений с помощью агрегатных функций.
Составьте два запроса, которые выводят все заказы, полученные 3 или 4 октября 2000 г.
Напишите запрос, который выводит всех покупателей, чьи имена начинаются на буквы с A по G.
Напишите запрос, который выбирает всех покупателей, чьи имена начинаются на букву C (как заглавную, так и строчную).
Составьте запрос, который выбирает все заказы с нулями или NULL в столбце amt (amount).
Напишите запрос, который подсчитывает число заказов, сделанных 3 октября.
Напишите запрос, который подсчитывает количество различных непустых значений столбца city в таблице Customers.
Составьте запрос, который выбирает наименьший заказ каждого покупателя.
Напишите запрос, который выбирает первого покупателя (в алфавитном порядке), чье имя начинается на букву G.
Напишите запрос, который выбирает наибольший рейтинг в каждом городе.
Составьте запрос, который подсчитывает, сколько продавцов ежедневно получает заказы. (Продавец, получающий в день более одного заказа, должен учитываться только один раз.)
Тема: Работа с выражениями
Использование выражений в предложении SELECT
Более сложные применения выражений
Упорядочение результатов по значениям столбцов
Предположим, что каждый продавец имеет 12% комиссионных. Напишите запрос к таблице Orders, который выводит номер заказа, номер продавца и размер комиссионных для данного заказа.
Напишите запрос к таблице Customers, который ищет максимальный рейтинг в каждом городе. Выведите данные в формате:For the city (city), the highest rating is: (rating).
Cоставьте запрос, который перечисляет покупателей в порядке убывания рейтинга. Выведите сначала столбец rating, а затем имя и номер покупателя.
Напишите запрос, который подсчитывает общую сумму заказов за каждый день и располагает результаты в порядке убывания.
Cоставьте запрос, который для всех покупателей из Парижа заменяет город на Брюссель, а для остальных покупателей оставляет в списке их настоящие города.
Напишите оператор UPDATE, который увеличивает рейтинг всех покупателей на 100. Предполагается, что покупатели могут иметь рейтинг NULL, в этом случае он должен стать 100.
Тема: Запросы к нескольким таблицам
Соединение таблиц
Соединение таблицы с собой
Более сложные применения соединений
Напишите запрос, который выводит номер каждого заказа вместе с именем покупателя, сделавшего этот заказ.
Cоставьте запрос, который показывает всех покупателей, обслуживаемых продавцом с комиссионными более 12%. Выведите имя покупателя, имя продавца и комиссионные продавца.
Напишите запрос, который рассчитывает комиссионные продавца от каждого заказа покупателей, имеющих рейтинг выше 100.
Напишите запрос, который выводит все пары продавцов, живущих в одном городе. Исключите комбинации продавца с самим собой, а также строки, в которых значения повторяются в обратном порядке.
Cоставьте запрос, который выводит имена и города всех покупателей, имеющих тот же рейтинг, что и покупатель Hoffman. Используйте в запросе номер покупателя Hoffman, а не его рейтинг, чтобы запрос можно было применять и при изменении рейтинга.
С какой целью в запрос включен последний предикат (a.cnum < b.cnum)? SELECT sname, Salespeople.snum, a.cname, b.cname FROM Customers a, Customers b, Salespeople WHERE a.snum = b.snum AND Salespeople.snum = a.snum AND a.cnum < b.cnum;
Тема: Вложенные запросы
Работа подзапросов
Подзапросы и соединения
Коррелированные подзапросы
Напишите запрос, в котором для получения всех заказов покупателя Cisneros используется подзапрос. Предполагается, что номер этого покупателя (cnum) неизвестен.
Cоставьте запрос для вывода имен и рейтингов всех покупателей, сделавших заказы на сумму выше средней по всем заказам.
Напишите запрос, который выводит общую стоимость заказов для тех продавцов, у которых эта сумма превышает стоимость самого крупного заказа в таблице.
Запишите оператор SELECT с коррелированным подзапросом, который выбирает имена и номера всех покупателей с рейтингами, равными максимальному рейтингу для данного города.
Cоставьте два запроса для вывода имен и номеров всех продавцов, в чьих городах есть покупатели, которых они не обслуживают. В одном запросе должно использоваться соединение, а в другом - коррелированный подзапрос. Какое решение более элегантно? (Указание: один из способов решения этой задачи заключается в том, чтобы найти всех покупателей, которые не обслуживаются данным продавцом, а затем проверить, находится ли кто-то из них в его городе).
Тема: Объединение запросов
Объединение множества запросов в один
Использование UNION с ORDER BY
Другие способы объединения запросов
Создайте объединение двух запросов, которое показывает имена, города и рейтинги всех покупателей. Сведения о тех из них, кто имеет рейтинг 200 и выше, должны сопровождаться словами «High Rating», а об остальных - словами «Low Rating». NULL-рейтинги считаются низкими (Low».
Напишите оператор, который выводит имена и номера всех продавцов и покупателей с более чем одним текущим заказом. Расположите результаты в алфавитном порядке.
Сформируйте объединение трех запросов. Первый должен выбирать snum всех продавцов в Сан-Хосе, второй - cnum всех покупателей в Сан-Хосе и третий – onum всех заказов от октября. Сохраните повторяющиеся значения в двух последних запросах, но исключите их дублирование с данными первого запроса. (Замечание: в приведенных таблицах-примерах такая избыточность отсутствует, поскольку snum, cnum и onum лежат в разных диапазонах (кстати, это полезный прием). Тем не менее данное упражнение послужит задачей на сообразительность_.
Напишите объединенный запрос, который находит всех продавцов из Лондона, имеющих в Лондоне как минимум одного покупателя. Выведите номера и имена продавцов.
Составьте объединенный запрос, который находит всех продавцов с хотя бы одним заказом свыше $1000, сделанным покупателем из другого города. Выведите snum и cnum. Продавцы, имеющие такие заказы от нескольких покупателей, должны отображаться более одного раза.
Учебная база данных содержит информацию по обработке заказов в торговой компании.
Она состоит из пяти таблиц: Таблица Customers (Клиенты = Покупатели).
Содержит по одной строке для каждого из клиентов компании. Клиенты покупают товары компании.
CUST_NUM |
COMPANY |
CUST_REP |
CREDIT_LIMIT |
2111 |
JCP Inc. |
103 |
$50, 000. 00 |
2102 |
First Corp. |
101 |
$65, 000. 00 |
2103 |
Acme Mfg. |
105 |
$50, 000. 00 |
2123 |
Carter & Sons |
102 |
$40, 000. 00 |
2107 |
Ace International |
110 |
$35, 000. 00 |
2115 |
Smithson Corp. |
101 |
$20, 000. 00 |
2101 |
Jones Mfg. |
106 |
$65, 000. 00 |
2112 |
Zetacorp. |
108 |
$50, 000. 00 |
2121 |
QMA Assoc. |
103 |
$45, 000. 00 |
2114 |
Orion Corp. |
102 |
$20, 000. 00 |
2124 |
Peter Brothers |
107 |
$40, 000. 00 |
2108 |
Holm & Landis |
109 |
$55, 000. 00 |
2117 |
J. P. Sinclair |
106 |
$35, 000. 00 |
2122 |
Three-Way Lines |
105 |
$30, 000. 00 |
2120 |
Rico Enterprises |
102 |
$50, 000. 00 |
2106 |
Fred Lewis Corp. |
102 |
$65, 000. 00 |
2119 |
Solomon Inc. |
109 |
$25, 000. 00 |
2118 |
Midwest Systems |
108 |
$60, 000. 00 |
2113 |
Lan & Schmidt |
104 |
$20, 000. 00 |
2109 |
Chen Associates |
103 |
$25, 000. 00 |
2105 |
AAA Investments |
101 |
$45, 000. 00 |
CUST_NUM – идентификатор компании (клиента)
COMPANY – название компании
CUST_REP – идентификатор служащего, отвечающего за связь с компанией
CREDIT_LIMIT – лимит кредита для клиента
Таблица OFFICES (Офисы). Содержит по одной строке для каждого из 5 офисов компании.
OFFICE |
CITY |
REGION |
MGR |
TARGET |
SALES |
22 |
Denver |
Western |
108 |
$300, 000. 00 |
$186, 042. 00 |
11 |
New York |
Eastern |
106 |
$575, 000. 00 |
$692, 637. 00 |
12 |
Chicago |
Eastern |
104 |
$800, 000. 00 |
$735, 042. 00 |
13 |
Atlanta |
Eastern |
105 |
$350, 000. 00 |
$367, 911. 00 |
21 |
Los Angeles |
Western |
108 |
$725, 000. 00 |
$835, 915. 00 |
OFFICE – идентификатор офиса
CITY – город, где размещается офис компании
REGION – регион продаж, к которому принадлежит офис
MGR – идентификатор служащего, управляющего офисом (менеджер офиса)
TARGET – плановый объем продаж офиса
SALES – объем продаж офиса с начала года по текущую дату
Таблица PRODUCTS (Товары). Содержит по одной строке для каждого наименования товара, продаваемого компанией.
MFR_ID |
PRODUCT_ID |
DESCRIPTION_P |
PRICE |
QTY_ON_HAND |
REI |
2A45C |
Ratchet Link |
$79. 00 |
210 |
ACI |
4100Y |
Widget Remover |
$2, 750. 00 |
25 |
QSA |
XK47 |
Reducer |
$355. 00 |
38 |
BIC |
41672 |
Plate |
$180. 00 |
0 |
INN |
779C |
900-1b Brace |
$1, 875. 00 |
9 |
ACI |
41003 |
Size 3 Widget |
$107. 00 |
207 |
ACI |
41004 |
Size 4 Widget |
$117. 00 |
139 |
BIC |
41003 |
Handle |
$652. 00 |
3 |
INN |
887P |
Brace Pin |
$250. 00 |
24 |
QSA |
XK48 |
Reducer |
$134. 00 |
203 |
RET |
2A44L |
Left Hinge |
$4, 500. 00 |
12 |
FEA |
112 |
Housing |
$148. 00 |
115 |
INN |
887H |
Brace Holder |
$54. 00 |
223 |
BIC |
41089 |
Retainer |
$225. 00 |
78 |
ACI |
41001 |
Size 1 Widget |
$55. 00 |
277 |
INN |
775C |
500-1b Brace |
$1, 425. 00 |
5 |
ACI |
4100Z |
Widget Installer |
$2, 500. 00 |
28 |
QSA |
XK48A |
Reducer |
$177. 00 |
27 |
ACI |
41002 |
Size 2 Widget |
$76. 00 |
167 |
REI |
2A44R |
Right Hinge |
$4, 500. 00 |
12 |
INN |
773C |
300-1b Brace |
$975. 00 |
28 |
ACI |
4100X |
Widget Adjuster |
$25. 00 |
37 |
FEA |
114 |
Motor Mount |
$243. 00 |
15 |
INN |
887X |
Brace Retainer |
$475. 00 |
32 |
REI |
2A44G |
Hinge Pin |
$350. 00 |
14 |
MFR_ID – идентификатор производителя (manufactured ID)
PRODUCT_ID – идентификатор товара (номера, присвоенные товарам производителями)
DESCRIPTION_P – описание товара
PRICE – цена товара
QTY_ON_HAND – количество товара, имеющегося в наличии (quantity on hand)
Таблица SALESREPS (Служащие = Продавцы). Содержит по одной строке для каждого из 10 служащих компании. Служащие продают товары клиентам компании.
EMPL_NUM |
NAMES |
AGE |
REP_OFFICE |
TITLE |
HIRE_DATE |
MANAGER |
QUOTA |
SALES |
105 |
Bill Adams |
37 |
13 |
Sales Rep |
12-FEB-88 |
104 |
$350, 000. 00 |
$367, 911. 00 |
109 |
Mary Jones |
31 |
11 |
Sales Rep |
12-OCT-89 |
106 |
$300, 000. 00 |
$350, 725. 00 |
102 |
Sue Smith |
48 |
21 |
Sales Rep |
10-DEC-88 |
108 |
$350, 000. 00 |
$474, 050. 00 |
106 |
Sam Clark |
52 |
11 |
VP Sales |
14-JUN-88 |
NULL |
$275, 000. 00 |
$299, 912. 00 |
104 |
Bob Smith |
33 |
12 |
Sales Mgr |
19-MAY-87 |
106 |
$200, 000. 00 |
$142, 594. 00 |
101 |
Dan Roberts |
45 |
12 |
Sales Rep |
20-OCT-88 |
104 |
$300, 000. 00 |
$305, 673. 00 |
110 |
Tom Snyder |
41 |
NULL |
Sales Rep |
13-JAN-90 |
101 |
NULL |
$75, 985. 00 |
108 |
Larry Fitch |
62 |
21 |
Sales Mgr |
12-OCT-89 |
106 |
$350, 000. 00 |
$361, 865. 00 |
103 |
Paul Cruz |
29 |
12 |
Sales Rep |
01-MAR-87 |
104 |
$275, 000. 00 |
$286, 775. 00 |
107 |
Nancy Angelli |
49 |
22 |
Sales Rep |
14-NOV-88 |
108 |
$300, 000. 00 |
$186, 042. 00 |
EMPL_NUM – идентификатор служащего
NAMES – имена служащего
AGE – возраст служащего
REP_OFFICE – номер офиса, где работает служащего
TITLE – должность служащего
HIRE_DATE – дата приема на работу служащего
MANAGER – идентификатор менеджера (из служащих)
QUOTA – планируемый объем продаж для данного служащего.
SALES – текущий (фактический) объем продаж
Таблица ORDERS (Заказы). Содержит по одной строке для каждого из заказов, сделанных клиентом. Для простоты считается, что один заказ может содержать только один товар.
ORDER_NUM |
ORDER_DATE |
CUST |
REP |
MFR |
PRODUCT |
QTY |
AMOUNT |
112961 |
17-DEC-89 |
2117 |
106 |
REI |
2A44R |
7 |
$31, 500. 00 |
113012 |
11-JAN-90 |
2111 |
105 |
ACI |
41003 |
35 |
$3, 745. 00 |
112089 |
03-JAN-90 |
2101 |
106 |
FEA |
114 |
6 |
$1, 458. 00 |
113051 |
10-FEB-90 |
2118 |
108 |
QSA |
XK47 |
4 |
$1, 420. 00 |
112968 |
12-OCT-89 |
2102 |
101 |
ACI |
41004 |
34 |
$3, 978. 00 |
113036 |
30-JAN-90 |
2107 |
110 |
ACI |
4100Z |
9 |
$22, 500. 00 |
113045 |
02-FEB-90 |
2112 |
108 |
REI |
2A44R |
10 |
$45, 000. 00 |
112963 |
17-DEC-89 |
2103 |
105 |
ACI |
41004 |
28 |
$3, 276. 00 |
113013 |
14-JAN-90 |
2118 |
108 |
BIC |
41003 |
1 |
$652. 00 |
113058 |
23-FEB-90 |
2108 |
109 |
FEA |
112 |
10 |
$1, 480. 00 |
112997 |
08-JAN-90 |
2124 |
107 |
BIC |
41003 |
1 |
$652. 00 |
112983 |
27-DEC-89 |
2103 |
105 |
ACI |
41004 |
6 |
$702. 00 |
113024 |
20-JAN-90 |
2114 |
108 |
QSA |
XK47 |
20 |
$7, 100. 00 |
113062 |
24-FEB-90 |
2124 |
107 |
FEA |
114 |
10 |
$2, 430. 00 |
112979 |
12-OCT-89 |
2114 |
102 |
ACI |
4100Z |
6 |
$15, 000. 00 |
113027 |
22-JAN-90 |
2103 |
105 |
ACI |
41002 |
54 |
$4, 104. 00 |
113007 |
08-JAN-90 |
2112 |
108 |
INN |
773C |
3 |
$2, 925. 00 |
113069 |
02-MAR-90 |
2109 |
107 |
INN |
775C |
22 |
$31, 350. 00 |
113034 |
29-JAN-90 |
2107 |
110 |
REI |
2A45C |
8 |
$632. 00 |
112992 |
04-NOV-89 |
2118 |
108 |
ACI |
41002 |
10 |
$760. 00 |
112975 |
12-OCT-89 |
2111 |
103 |
REI |
2A44G |
6 |
$2, 100. 00 |
113055 |
15-FEB-90 |
2108 |
101 |
ACI |
4100X |
6 |
$150. 00 |
113048 |
10-FEB-90 |
2120 |
102 |
INN |
779C |
2 |
$3, 750. 00 |
112993 |
04-JAN-89 |
2106 |
102 |
REI |
2A45C |
24 |
$1, 896. 00 |
113065 |
27-FEB-90 |
2106 |
102 |
QSA |
XK47 |
6 |
$2, 130. 00 |
113003 |
25-JAN-90 |
2108 |
109 |
INN |
779C |
3 |
$5, 625. 00 |
113049 |
10-FEB-90 |
2118 |
108 |
QSA |
XK47 |
2 |
$710. 00 |
112987 |
31-DEC-89 |
2103 |
105 |
ACI |
4100Y |
11 |
$27, 500. 00 |
113057 |
18-FEB-90 |
2111 |
103 |
ACI |
4100X |
24 |
$600. 00 |
113042 |
02-FEB-90 |
2113 |
101 |
REI |
2A44R |
5 |
$22, 500. 00 |
ORDER_NUM – номер заказа
ORDER_DATE – дата заказа
CUST – идентификатор компании
REP – идентификатор служащего, принявшего заказ
MFR – идентификатор производителя товара
PRODUCT – идентификатор заказанного товара
QTY – количество заказанного товара
AMOUNT – стоимость заказанного товара
Описание учебной БД
1. table Products компилируется первой
Create table Products
(Mfr_Id char(3) not null,
Product_Id char(5) not null,
Description_P varchar(20) not null,
Price money not null,
Qty_On_Hand integer not null,
primary key (Mfr_Id,Product_Id));