现有一个商店的数据库,记录顾客及其购物情况,根据要求解答问题

题目: 现有一个商店的数据库,记录顾客及其购物情况,由下面三个表组成:

商品product(商品号productid,商品名productname,单价unitprice,商品类别category,供应商provider);

顾客customer(顾客号customerid,姓名name,住址location);

购买purcase(顾客号customerid,商品号productid,购买数量quantity);

每个顾客可以购买多件商品,每件商品可以被多个顾客购买,属于多对多的关系。

试用SQL语言完成下列功能:

1 建表,在定义中要求声明如下约束:

(1)每个表的主外键;

(2)顾客的姓名和商品名不能为空值;

(3)单价必须大于0,购买数量必须再0到20之间;

2 往表中插入数据:

商品(M01,佳洁士,8.00,牙膏,宝洁;

M02,高露洁,6.50,牙膏,高露洁;

M03,洁诺,5.00,牙膏,联合利华;

M04,舒肤佳,3.00,香皂,宝洁;

M05,夏士莲,5.00,香皂,联合利华;

M06,雕牌,2.50,洗衣粉,纳爱斯

M07,中华,3.50,牙膏,联合利华;

M08,汰渍,3.00,洗衣粉,宝洁;

M09,碧浪,4.00,洗衣粉,宝洁;)

顾客(C01,Dennis,海淀;

C02,John,朝阳;

C03,Tom,东城;

C04,Jenny,东城;

C05,Rick,西城;)

购买(C01,M01,3;

C01,M05,2;

C01,M08,2;

C02,M02,5;

C02,M06,4;

C03,M01,1;

C03,M05,1;

C03,M06,3;

C03,M08,1;

C04,M03,7;

C04,M04,3;

C05,M06,2;

C05,M07,8;)

商品有9 条,顾客有5条,购买有13条

3 用PL/SQL块编程完成下列查询要求:

(1)求购买了供应商"宝洁"产品的所有顾客;

(2)求购买的商品包含了顾客"Dennis"所购买的所有商品的顾客(姓名);

(3)求牙膏卖出数量最多的供应商。

4 将所有的牙膏商品单价增加10%。(SQL语句)

5 删除从未被购买的商品记录。(SQL语句)

解题思路分析:

第一步:创建表,确定数据类型,建立约束

--删除数据表

drop table purcase;

drop table product;

drop table customer;

---创建数据表

---解题思路分析:

---第一步:创建表,确定数据类型,建立约束

----创建商品表product

create table product (

productid  varchar2(10) ,

productname varchar2(20) NOT NULL,

unitprice number,

category varchar2(20),

provider varchar2(20),

CONSTRAINT pk_productid primary key (productid),

CONSTRAINT CK_unitprice CHECK (unitprice>0)

);

--创建顾客表customer:

create table customer(

customerid varchar2(10),

name varchar2(20) NOT NULL,

location varchar2(20),

CONSTRAINT pk_customerid primary key(customerid)

);

--创建购买记录表 purcase:

create table purcase(

customerid varchar2(10),

productid varchar2(10),

quantity number,

CONSTRAINT FK_customerid FOREIGN KEY(customerid) REFERENCES customer(customerid) on delete cascade,

CONSTRAINT FK_productid FOREIGN KEY(productid) REFERENCES product(productid) on delete cascade,

CONSTRAINT CK_quantity CHECK(quantity BETWEEN 0 AND 20)

);

---测试数据的编写:

insert into product (productid,productname,unitprice,category,provider)

values(‘M01‘,‘佳洁士‘,8.00,‘牙膏‘,‘宝洁‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M02‘,‘高露洁‘,6.50,‘牙膏‘,‘高露洁‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M03‘,‘洁诺‘,5.00,‘牙膏‘,‘联合利华‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M04‘,‘舒肤佳‘,3.00,‘香皂‘,‘宝洁‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M05‘,‘夏士莲‘,5.00,‘香皂‘,‘联合利华‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M06‘,‘雕牌‘,8.00,‘洗衣粉‘,‘纳爱斯‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M07‘,‘中华‘,3.50,‘牙膏‘,‘联合利华‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M08‘,‘汰渍‘,3.00,‘洗衣粉‘,‘宝洁‘);

insert into product (productid,productname,unitprice,category,provider)

values(‘M09‘,‘碧浪‘,4.00,‘洗衣粉‘,‘宝洁‘);

insert into customer (customerid, name ,location)

values(‘C01‘,‘Dennis‘,‘海淀‘);

insert into customer (customerid, name ,location)

values(‘C02‘,‘John‘,‘朝阳‘);

insert into customer (customerid, name ,location)

values(‘C03‘,‘Tom‘,‘东城‘);

insert into customer (customerid, name ,location)

values(‘C04‘,‘Jenny‘,‘东城‘);

insert into customer (customerid, name ,location)

values(‘C05‘,‘Rick‘,‘西城‘);

insert into purcase(customerid,productid,quantity)

values(‘C01‘,‘M01‘,3);

insert into purcase(customerid,productid,quantity)

values(‘C01‘,‘M05‘,2);

insert into purcase(customerid,productid,quantity)

values(‘C01‘,‘M08‘,2);

insert into purcase(customerid,productid,quantity)

values(‘C02‘,‘M02‘,5);

insert into purcase(customerid,productid,quantity)

values(‘C02‘,‘M06‘,4);

insert into purcase(customerid,productid,quantity)

values(‘C03‘,‘M01‘,1);

insert into purcase(customerid,productid,quantity)

values(‘C03‘,‘M05‘,1);

insert into purcase(customerid,productid,quantity)

values(‘C03‘,‘M06‘,3);

insert into purcase(customerid,productid,quantity)

values(‘C03‘,‘M08‘,1);

insert into purcase(customerid,productid,quantity)

values(‘C04‘,‘M03‘,7);

insert into purcase(customerid,productid,quantity)

values(‘C04‘,‘M04‘,3);

insert into purcase(customerid,productid,quantity)

values(‘C05‘,‘M06‘,2);

insert into purcase(customerid,productid,quantity)

values(‘C05‘,‘M07‘,8);

---提交事务

commit;

---问题分析

--(1)求购买了供应商"宝洁"产品的所有顾客;

1、确定要使用的表

product 表:供应商信息

customer表:顾客信息

purcase表:顾客的购买记录

2、确定关联关系

purcase.customerid=customer.customerid;

purcase.productid=customer.productid;

第一步:先确定供应商为‘宝洁’的所有产品的产品id

select productid from product where provider=‘宝洁‘;

第二步:在购买记录表中找出购买了‘宝洁’商品的客户id

select customerid from purcase where productid in(select productid from product where provider=‘宝洁‘);

第三步:在顾客表中,找出对应的顾客信息

select * from customer where customerid in (select customerid from purcase where productid in(select productid from product where provider=‘宝洁‘));

---(2)求购买的商品包含了顾客"Dennis"所购买的所有商品的顾客(姓名);

买了Dennis所购买的商品的所有的顾客信息

1、确定需要使用的表

customer表:顾客id,顾客name

purcase表:顾客的购买记录,查找所购买的物品id

2、确定关联的关系

purcase.customerid=customer.customerid;

purcase.productid=product.productid;

1、确定Dennis所购买的商品id

select customerid from customer where name=‘Dennis‘;

select productid from purcase where customerid =(

select customerid from customer where name=‘Dennis‘

);

2、找出购买了Dennis的商品的顾客信息,这样的做法只能找到与Dennis买的东西有一样的就可以了

select distinct customerid from purcase where productid in (‘M01‘,‘M05‘,‘M08‘);

select name from customer where customerid in (select distinct customerid from purcase where productid in (select productid from purcase where customerid =(

select customerid from customer where name=‘Dennis‘

)));

update purcase set productid=‘M06‘ where customerid=‘C05‘ and quantity=2;

2、题目的意思是说,找出买了Dennis所有买的东西的客户,采用数学的求差的运算,求差且不再这里面的数据

select * from customer ca

where not exists(

select productid from purcase where customerid=(

select customerid from customer where name=‘Dennis‘

)

MINUS

SELECT PRODUCTID FROM PURCASE WHERE CUSTOMERID=CA.CUSTOMERID

AND CA.NAME<>‘Dennis‘

);

---(3)求牙膏卖出数量最多的供应商。

1、确定需要使用的表

purcase表:顾客的购买记录,根据产品id查找卖出数量最多的产品

product 表:找到牙膏的产品id,供应商

2、确定关联的关系

purcase.productid=product.productid;

1、先找出牙膏的id

select productid,provider from product where category=‘牙膏‘;

2、然后关联两张表,根据供应商分组后求出数量最大的值

select  temp.provider ,sum(quantity) he

from purcase p,(

select productid,provider from product where category=‘牙膏‘

) temp

where p.productid in (select productid from product where category=‘牙膏‘)

and  p.productid=temp.productid

group by temp.provider;

update purcase set productid=‘M07‘ where customerid=‘C05‘ and quantity=8;

select max(he)

from (

select  temp.provider pro  ,sum(quantity) he

from purcase p,(

select productid,provider from product where category=‘牙膏‘

) temp

where p.productid in (select productid from product where category=‘牙膏‘)

and  p.productid=temp.productid

group by temp.provider

) ;

select provider

from product

where productid=(

select productid

from purcase

where productid in (

select productid from product where category=‘牙膏‘

)

group by productid

having sum(quantity)=(

select max(sum(quantity))

from purcase

where productid in (

select productid from product where category=‘牙膏‘

)

group by productid

)

);

原文地址:https://www.cnblogs.com/Etude/p/9279795.html

时间: 2024-11-08 15:39:22

现有一个商店的数据库,记录顾客及其购物情况,根据要求解答问题的相关文章

vm 安装 vcenter 本主要记录选择l现有的受支持数据库

1.将先决条件安装完毕. 安装 .NET3.5 全部下一步记录设置的密码.备忘. 2.在 server 2008 r2 里面搜索到:  sqlncli.msi  安装 3.打开  ODBC设置页面---系统DSN--添加--选择SQL Server Native client 4. 添加好后开始安装 Vcenter 选择使用现有受支持的数据库----选择刚才添加的数据源名称. 5.到此已设置完毕剩下默认即可, 记录好密码以及相应端口.

现有的一些人脸数据库

现有的一些人脸数据库 在国际上已有的一些人脸数据库: Yale人脸库(美国): 耶鲁大学,15人,每人11张照片,主要包括光照条件的变化,表情的变化等. ORL人脸库(英国): 剑桥大学,40人,每人10张照片,包括表情变化,微小姿态变化,20%以内的尺度变化. FERET人脸库(美国): 为 了促进人脸识别算法的研究和实用化,美国国防部的Counterdrug Technology Transfer Program(CTTP)发起了一个人脸识别技术(Face Recognition Techn

如何设计一个优秀的数据库

如何设计一个优秀的数据库 (2014-04-02 12:43:21) 标   一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键.如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分. 有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述.不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲.所以我归纳历年来所走的弯路及体会,并在网

数据库记录安全解决方案

数据库记录安全解决方案 http://netkiller.github.io/journal/mysql.security.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 29812080 <[email protected]> 版权 © 2014 http://netkiller.github.io 版权声明 转载请与作者联系,转载时请务必标明文章原始

如何设计一个优秀的数据库(转)

一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键.如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分. 有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述.不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲.所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验.精

转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常保存到数据库中,所以就到网上搜了下专门的日志记录工具,一搜果然很多,比如:log4net,NLog,EntLib Logging等等,但是还是log4net名气最大,所以就下载下来试用了一番,果然很方便,其涵盖了所有常用的日志记录方式具体的可以看下表: AdoNetAppender 将日志记录到数据

使用数字签名实现数据库记录防篡改(Java实现)

本文大纲 一.提出问题 二.数字签名 三.实现步骤 四.参考代码 五.后记 六.参考资料 一.提出问题 最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能.为此,需要对该产品对数据库有什么操作进行研究(至于怎么监控一个产品的操作会引发什么数据库操作,以后会详细解说).本来已经对数据库的操作了如指掌的,无意中发现数据库表里的每条记录都会有这样一个字段: 这感觉不妙了,字段名叫signature,顾名思义,就是签名的意思呀.难道数据库表中的每条记录都会有签名?也就是说如果我不能正

三、MyBatis系列:Mapper 映射 之 通过mapper映射文件来读取数据库记录

在使用Mybatis从数据库中获取记录时,仅编写一个映射xml文件即可.这便是mybatis的强大之处,据说可以比普通jdbc要节省95%的代码.先来看看如何获取记录,工程配置请参考<一.MyBatis系列:第一个MyBatis工程>: 1.Mapper配置文件内容 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.o

Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现

Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 1. 应用场景 1 2. 随机抽取数据原理 1 3. 常用的实现方法:::数据库随机函数 1 4. Mssql 的实现 NEWID() 跟rand()  1 5. newid()与rand()的区别 2 6. NEWID() 2 7. 参考 2 1. 应用场景 并发测试 2. 随机抽取数据原理 原理是 循环所有的ID/记录,附加随机函数字段,然后排序as 这个字段.. 3. 常用的实现方法:::数据库随机