first commit
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
# Робота з підзапитами
|
||||
Передумови
|
||||
Для роботи використайте навчальну базу даних OrdersDB_2.
|
||||
OrdersDB_2 складається з 3-х таблиць:
|
||||
1. Salespeople - продавці
|
||||
містить поля:
|
||||
SNUM - ID продавця
|
||||
SNAME - ім’я продавця
|
||||
CITY - місто продавця
|
||||
COMM - комісійні продавця
|
||||
|
||||
2. Cusstomer - покупці
|
||||
містить поля:
|
||||
CNUM - ID покупця
|
||||
CNAME - ім’я покупця,
|
||||
CITY - місто покупця,
|
||||
RATING - рейтинг покупця,
|
||||
SNUM - ID продавця, що обслуговує покупця,
|
||||
|
||||
3. Orders - покупці
|
||||
містить поля:
|
||||
ONUM - ID угоди
|
||||
amt - сума угоди
|
||||
ODATE - дата угоди
|
||||
CNUM - ID покупця,
|
||||
SNUM - ID продавця,
|
||||
-------------------------------------------------------
|
||||
-------------------------------------------------------
|
||||
1. Створіть, якщо не має базу даних OrdersDB_2.
|
||||
|
||||
CREATE DATABASE OrdersDB_2;
|
||||
-------------------------------------------------------
|
||||
2. Виберіть базу даних OrdersDB_2
|
||||
|
||||
USE OrdersDB_2;
|
||||
-------------------------------------------------------
|
||||
3. Створіть необхідні таблиці 3.1 Таблицю продавцівв
|
||||
|
||||
CREATE TABLE Salespeople (
|
||||
SNUM int NOT NULL,
|
||||
SNAME char(20) NOT NULL,
|
||||
CITY char(20),
|
||||
COMM decimal(8, 2),
|
||||
PRIMARY KEY (SNUM)
|
||||
);
|
||||
-------------------------------------------------------
|
||||
3.2 Таблицю покупців
|
||||
|
||||
CREATE TABLE Customers (
|
||||
CNUM int NOT NULL,
|
||||
CNAME char(20) NOT NULL,
|
||||
CITY char(20),
|
||||
RATING int,
|
||||
SNUM int,
|
||||
PRIMARY KEY (CNUM),
|
||||
CONSTRAINT sales_snum FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM)
|
||||
);
|
||||
-------------------------------------------------------
|
||||
3.3 Таблицю Замовлень
|
||||
|
||||
CREATE TABLE Orders (
|
||||
ONUM int NOT NULL,
|
||||
amt decimal(9, 2),
|
||||
ODATE date,
|
||||
CNUM int,
|
||||
SNUM int,
|
||||
PRIMARY KEY (ONUM),
|
||||
CONSTRAINT o_sales_snum FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM),
|
||||
CONSTRAINT custom_cnum FOREIGN KEY (CNUM) REFERENCES Customers (CNUM)
|
||||
);
|
||||
-------------------------------------------------------
|
||||
4. Заповніть таблиці даними 4.1 Таблицю Satespeople
|
||||
|
||||
INSERT INTO Salespeople (SNUM, SNAME, CITY, COMM)
|
||||
VALUES
|
||||
(1001,"Peel","London",.12),
|
||||
(1002,"Serres","San Jose",.13),
|
||||
(1004,"Motika","London",.11),
|
||||
(1007,"Rifkin","Barcelona",.15),
|
||||
(1003,"Axelrod","New York",.10)
|
||||
;
|
||||
-------------------------------------------------------
|
||||
4.2 Таблицю Customers
|
||||
|
||||
INSERT INTO
|
||||
Customers
|
||||
VALUES (
|
||||
2001,
|
||||
"Hoffman",
|
||||
"London",
|
||||
100,
|
||||
1001
|
||||
),
|
||||
(
|
||||
2002,
|
||||
"Giovanni",
|
||||
"Rome",
|
||||
200,
|
||||
1003
|
||||
),
|
||||
(
|
||||
2003,
|
||||
"Liu",
|
||||
"San Jose",
|
||||
200,
|
||||
1002
|
||||
),
|
||||
(
|
||||
2004,
|
||||
"Grass",
|
||||
"Berlin",
|
||||
300,
|
||||
1002
|
||||
),
|
||||
(
|
||||
2006,
|
||||
"Clemens",
|
||||
"London",
|
||||
100,
|
||||
1001
|
||||
),
|
||||
(
|
||||
2008,
|
||||
"Cisneros",
|
||||
"San Jose",
|
||||
300,
|
||||
1007
|
||||
),
|
||||
(
|
||||
2007,
|
||||
"Pereira",
|
||||
"Rome",
|
||||
100,
|
||||
1004
|
||||
);
|
||||
-------------------------------------------------------
|
||||
4.2 Таблицю Orders
|
||||
|
||||
INSERT INTO
|
||||
Orders
|
||||
VALUES (
|
||||
3003,
|
||||
767.19,
|
||||
"1990-10-03",
|
||||
2001,
|
||||
1001
|
||||
),
|
||||
(
|
||||
3002,
|
||||
1900.10,
|
||||
"1990-10-03",
|
||||
2007,
|
||||
1004
|
||||
),
|
||||
(
|
||||
3005,
|
||||
5160.45,
|
||||
"1990-10-03",
|
||||
2003,
|
||||
1002
|
||||
),
|
||||
(
|
||||
3006,
|
||||
1098.16,
|
||||
"1990-10-03",
|
||||
2008,
|
||||
1007
|
||||
),
|
||||
(
|
||||
3009,
|
||||
1713.23,
|
||||
"1990-10-04",
|
||||
2002,
|
||||
1003
|
||||
),
|
||||
(
|
||||
3007,
|
||||
75.75,
|
||||
"1990-10-04",
|
||||
2004,
|
||||
1002
|
||||
),
|
||||
(
|
||||
3008,
|
||||
4723.00,
|
||||
"1990-10-05",
|
||||
2006,
|
||||
1001
|
||||
),
|
||||
(
|
||||
3010,
|
||||
1309.95,
|
||||
"1990-10-06",
|
||||
2004,
|
||||
1002
|
||||
),
|
||||
(
|
||||
3011,
|
||||
9891.88,
|
||||
"1990-10-06",
|
||||
2006,
|
||||
1001
|
||||
);
|
||||
@@ -0,0 +1,107 @@
|
||||
use OrdersDB_2;
|
||||
|
||||
##################### Завдання #######################
|
||||
##########################################################
|
||||
################### Завдання 1.1 #####################
|
||||
Знайдіть максимальну і мінімальну середню суму угоди на основі середньої суми угод кожного продавця.
|
||||
Підказка: використайте підзапит у пропозиції FROM.
|
||||
|
||||
select max(avg_amt), min(avg_amt)
|
||||
from (
|
||||
select avg(amt) as avg_amt
|
||||
from Orders
|
||||
group by
|
||||
SNUM
|
||||
) as avg_amt;
|
||||
|
||||
######################################################
|
||||
################# Завдання 1.2 ###################
|
||||
|
||||
Напишіть запит, що виведе кожне замовлення покупців, якщо їх вартість більша за кожне замовлення
|
||||
покупця Grass. Вивід здійснити у формі onum, amt, odate, cname.
|
||||
Підказка: використайте оператор ALL
|
||||
|
||||
select onum, amt, odate, cname
|
||||
from Orders o
|
||||
join Customers c on o.cnum = c.cnum
|
||||
where
|
||||
amt > all (
|
||||
select amt
|
||||
from Orders
|
||||
where
|
||||
cnum = (
|
||||
select cnum
|
||||
from Customers
|
||||
where
|
||||
cname = 'Grass'
|
||||
)
|
||||
);
|
||||
|
||||
######################################################
|
||||
################# Завдання 1.3 ###################
|
||||
Виведіть усі замовлення для яких сума угоди перевершує хоча б якесь замолення,
|
||||
що обслуговувалося продавцем Peel
|
||||
Вивід здійсніть у формі amt, odate, cname, sname
|
||||
|
||||
select amt, odate, cname, sname
|
||||
from
|
||||
Orders o
|
||||
join Customers c on o.cnum = c.cnum
|
||||
join Salespeople s on o.snum = s.snum
|
||||
where
|
||||
amt > any (
|
||||
select amt
|
||||
from Orders
|
||||
where
|
||||
snum = (
|
||||
select snum
|
||||
from Salespeople
|
||||
where
|
||||
sname = 'Peel'
|
||||
)
|
||||
);
|
||||
|
||||
#####################################################
|
||||
################ Завдання 1.4 ###################
|
||||
Виведіть продавців серердня сума угод яких перевищує середню суму усіх угод.
|
||||
У вивід включіть ім’я продавця та його середню суму угод
|
||||
Підказка:
|
||||
|
||||
select sname, avg_amt
|
||||
from Salespeople s
|
||||
join (
|
||||
select snum, avg(amt) as avg_amt
|
||||
from Orders
|
||||
group by
|
||||
snum
|
||||
) as avg_amt on s.snum = avg_amt.snum
|
||||
where
|
||||
avg_amt > (
|
||||
select avg(amt)
|
||||
from Orders
|
||||
);
|
||||
|
||||
#####################################################
|
||||
################ Завдання 1.5 ###################
|
||||
Виведіть покупців, серердня сума угод яких перевищує середню суму усіх угод.
|
||||
У вивід включіть ім’я покупця та його середню суму угод а також загальну середню суму угод.
|
||||
Підказка:
|
||||
|
||||
select cname, avg_amt, round(
|
||||
(
|
||||
select avg(amt)
|
||||
from Orders
|
||||
), 2
|
||||
) as avg_amt_all
|
||||
from Customers c
|
||||
join (
|
||||
select cnum, avg(amt) as avg_amt
|
||||
from Orders
|
||||
group by
|
||||
cnum
|
||||
) as avg_cus on c.cnum = avg_cus.cnum
|
||||
where
|
||||
avg_amt > (
|
||||
select avg(amt)
|
||||
from Orders
|
||||
);
|
||||
@@ -0,0 +1,86 @@
|
||||
#####################################################
|
||||
################ Завдання 2.1 ###################
|
||||
1. На остнові таблиці Orders створіть представлення V_Orders з алгоритмом обробки TEMPTABLE,
|
||||
яке б вивело увесь вміст таблиці.
|
||||
|
||||
CREATE ALGORITHM = TEMPTABLE VIEW V_Orders AS SELECT * FROM Orders;
|
||||
|
||||
SELECT * FROM V_Orders;
|
||||
|
||||
2. Переіменуйте представлення на VOrders
|
||||
|
||||
RENAME TABLE V_Orders TO VOrders;
|
||||
|
||||
SELECT * FROM VOrders;
|
||||
|
||||
3. Спробуйте використати переіменоване представлення для видалення запису з onum = 3001.
|
||||
Поясніть результат.
|
||||
|
||||
DELETE FROM VOrders WHERE onum = 3001;
|
||||
# Error: The target table VOrders of the DELETE is not updatable
|
||||
# Видалення не відбулося, оскільки представлення було створено з алгоритмом TEMPTABLE.
|
||||
|
||||
#####################################################
|
||||
################ Завдання 2.2 ###################
|
||||
1. Створіть точну копію таблиці Salespeople, назвавши її Salespeople_1.
|
||||
|
||||
create table Salespeople_1 as select * from Salespeople;
|
||||
|
||||
2. На остнові таблиці Salespeople_1 створіть представлення V_Salespeople_1, яке б вивело увесь вміст
|
||||
таблиці.
|
||||
|
||||
drop view if exists V_Salespeople_1;
|
||||
|
||||
CREATE VIEW V_Salespeople_1 AS SELECT * FROM Salespeople_1;
|
||||
|
||||
SELECT * FROM V_Salespeople_1;
|
||||
|
||||
3. Спробуйте використати представлення V_Salespeople_1 для додавання в якості продавця себе.
|
||||
Перевірте наявність змін.
|
||||
|
||||
insert into
|
||||
V_Salespeople_1 (SNUM, SNAME, CITY, COMM)
|
||||
values (
|
||||
1008,
|
||||
'Vitalii',
|
||||
'Zdolbuniv',
|
||||
0.1
|
||||
);
|
||||
|
||||
#####################################################
|
||||
################ Завдання 2.3 ###################
|
||||
1. На остнові таблиці Salespeople_1 створіть представлення V_Salespeople_2,
|
||||
яке б вивело лише записи продавців, які проживають у місті London.
|
||||
|
||||
drop view if exists V_Salespeople_2;
|
||||
|
||||
create view V_Salespeople_2 as
|
||||
select *
|
||||
from Salespeople_1
|
||||
where
|
||||
CITY = 'London';
|
||||
|
||||
SELECT * FROM V_Salespeople_2;
|
||||
|
||||
2. Спробуйте використати представлення V_Salespeople_2 для зміни свого міста проживання на Texas.
|
||||
Перевірте наявність змін.
|
||||
|
||||
update V_Salespeople_2 set CITY = 'Texas' where SNUM = 1008;
|
||||
|
||||
SELECT * FROM V_Salespeople_2;
|
||||
|
||||
3. Спробуйте самостійно знайти спосіб, який заборонить вносити зміни у записи,
|
||||
які представленням не відображаються. Переконайтеся у працездатності такого обмеження
|
||||
спробувавши видалити свій запис.
|
||||
|
||||
create view V_Salespeople_3 as
|
||||
select *
|
||||
from Salespeople_1
|
||||
where
|
||||
CITY = 'London'
|
||||
with
|
||||
check option;
|
||||
|
||||
update V_Salespeople_3 set CITY = 'Texas' where SNUM = 1001;
|
||||
|
||||
SELECT * FROM V_Salespeople_3;
|
||||
Reference in New Issue
Block a user