关于#数据库#的问题,如何解决?

学校布置的一道数据库思考题,麻烦给出详细的参考答案,题目如下:

现有销售数据库 Sales,包含三个关系模式,分别为:
Customer(CusNo,Cusname,Cussex,Address,Tel);
Product(ProNo,ProName,Price,Stocks);
Prosale(CusNo, ProNo,Quantity)。
其中,客户表 Customer 由客户编号(CusNo),姓名(Cusname),性别(Cussex),地址(Address),电话(Tel)组成,其中 CusNo 为主码。产品表 Product 由产品编号(ProNo),品名(ProName),单价(Price)和库存数量(Stocks)组成,其中主码为产品编号(ProNo)。销售表 Prosale 由客户编号(CusNo),产品编号(ProNo)和销售数量(Quantity)组成,其中主码为(CusNo, ProNo)。一个客户可以购买多种产品,一种产品可以被多个客户购买,产品被客户购买有销售数量。
1.使用关系代数完成下列查询:
(1)检索购买了所有产品的客户的编号和姓名。
(2)检索没有购买品名为‘空调’的产品的客户编号。
(3)检索至少购买了两种产品的客户编号。
(4)检索所有女性客户姓名、电话、购买的产品品名和数量。
2、用 SQL 语言完成以下操作:
(1)建立三个表,并定义好完整性约束,其中要求客户的姓名不能为空,年龄在 20 岁以上。
(2)检索姓“刘”的客户所购买的产品的产品编号和单价,结果按单价降序排列。
(3)检索每种产品购买客户的数量大于 20 人的产品的编号和购买客户人数,显示名为(产品编号,客户人数)。
(4)检索至少购买了编号为‘C001’的客户所购买的全部产品的客户编号。
(5)检索库存数量最高的产品编号和名称。
(6)检索客户‘王飞’没有购买的产品编号和品名。
(7)检索客户的客户编号、所购买的产品编号和产品总价。
(8)将产品编号为‘P001’的产品的单价增加 200 元。
(9) 请将(‘C102’,‘李明’,‘男’, ‘威海’, ‘0631-234231’)插入 Customer关系。其中‘C102’为客户编号,‘李明’为客户姓名,‘男’为性别,‘威海’为地址,‘0631-234231’为电话。
(10) 删除所有产品的销售记录。
(11) 建 立 一 个 有 关 男 性 客 户 信 息 的 视 图 CUSTOMER_MAN ,属性包括 (CusNo,CusName,Address,Tel)。
(12) 假如你是 DBA,请给用户李明授权使得他拥有对男性客户信息操作的全部权限。如果李明在操纵男性客户信息的同时将男性客户的信息备份,获得自身权限内的副本,并传播该副本给无权限的用户。请问,这种情况下应采用什么访问控制机制解决,并给出该访问控制机制的规则。
(13) 收回用户李明对男性客户信息操作的全部权限。
(14) 定义一个角色,使得该角色具有查询 Product 表、修改 Price 字段的权限。现要求王五、李四两个用户拥有查询 Product 表、修改 Price 字段的权限,请授予他们权限。

-- 1)编写SQL语句,根据范例,建立销售数据库Sales的以上三个表。要求要满足基本的实体完整性。
-- 客户表(Customer)
create table Customer(
cusno varchar(20) primary key,
cusname varchar(100) not null,
cussex varchar(10),
address varchar(200),
tel varchar(50) unique
);
-- 产品表(Product)
create table Product(
prono varchar(20) primary key,
proname varchar(200) not null,
price double(10,2),
stocks int
);
-- 销售表(Prosale)
create table Prosale(
cusno varchar2(20),
prono varchar2(20),
quantity int,
foreign key (cusno) references Customer(cusno),
foreign key (prono) references Product(prono)
);

2)检索姓“刘”的客户所购买的产品的产品编号和单价,结果按单价降序排列。
select prono,price from product where prono in (select prono from prosale where cusno in (select cusno from Customer where cusname like '李%') group by prono) order by price desc;

3)检索每种产品购买客户的数量大于 20 人的产品的编号和购买客户人数,显示名为(产品编号,客户人数)。
select prono as '产品编号',count(distinct(cusno)) as '客户人数' from prosale group by prono having count(distinct(cusno)) > 20;

4)检索至少购买了编号为‘C001’的客户所购买的全部产品的客户编号
select cusno from (select cusno,p.prono as prono from prosale p, (select distinct(prono) from prosale where cusno = 'C001') b where p.prono = b.prono)c group by cusno having count(distinct(prono)) = (select count(*) from prosale where cusno = 'C001');

5)检索库存数量最高的产品编号和名称
select prono,proname from product where stocks = (select max(stocks) from product);

6)检索客户‘王飞’没有购买的产品编号和品名
select prono,proname from product where prono not in (select prono from customer c, prosale s where c.cusno = s.cusno and c.cusname = '王飞');

7)检索客户的客户编号、所购买的产品编号和产品总价
select a.cusno,a.prono,a.cnt * b.price as amount from (select cusno,prono,sum(quantity) cnt from prosale group by cusno,prono)a,product b where a.prono = b.prono;

8)将产品编号为‘P001’的产品的单价增加 200 元
update product set price = price+200 where prono= 'P001';

  1. 请将(‘C102’,‘李明’,‘男’, ‘威海’, ‘0631-234231’)插入 Customer关系。其中‘C102’为客户编号,‘李明’为客户姓名,‘男’为性别,‘威海’为地址,‘0631-234231’为电话。
    insert into Customer values('C102','李明','男','威海','0631-234231');

  2. 删除所有产品的销售记录
    drop table prosale;

  3. 建 立 一 个 有 关 男 性 客 户 信 息 的 视 图 CUSTOMER_MAN ,属性包括 (CusNo,CusName,Address,Tel)
    create view CUSTOMER_MAN as select cusno,cusname,address,tel from Customer where cussex = '男';

  4. 给用户李明授权使得他拥有对男性客户信息操作的全部权限
    grant all privileges on CUSTOMER_MAN to '李明'@'%'

  5. 收回用户李明对男性客户信息操作的全部权限
    revoke all privileges on CUSTOMER_MAN from '李明'@'%';

你这个虽然简单,量有点大