东北大学数据库实验报告(2)

2019-08-02 01:32

d R-S

A a c B b b a f C c d S-R

D b E g F a

2.描述下面查询的结果,如果将UNION用EXCEPT替代,又会有什么样的查询结果?

( SELECT A FROM r, s WHERE r.a = s.d ) UNION ( SELECT A FROM r, s WHERE r.c = s.d );

UNION 这条语句是查询数据库中r表的a字段的值和s表中的d字段的值,r表中c字段的值和s表中d字段的值相等的部分,取出相等的部分后,相同的结果只保留一个。将union换位EXPECT后 得到的结果是只存在表a中和d相等的部分,并且去掉重复行。

5

2.SQL

请写出针对以下问题的SQL语句(每一问必需用一条SQL语句实现,但该SQL语句可以包含子查询)。

1.

查询姓张的所有客户信息

Select * from clinet where clientname like ?张%?; 2.

查询客户号1001的客户拥有的计费设备个数。

Select count(*) from device where clientno=1001; 3.

计算客户号1001在2016年1月产生的附加费用1和附加费用2; Select

addfee1,addfee2

from

monthlyneedpay

where

to_char(logdate,?yyyy?)=2016 and to_char(logdate,?mm?)=1; 4.

查询客户号1001在2016年的历史缴费记录;

Select * from paylog where clientno=1001 and to_char(payday,?yyyyy?)=2016; 5.

更新客户号1001在2016年1月份的收费标识为1;

Update monthlyneedpay set paystatus=?1? where to_char(payday,?yyyy?)=2016 and

to_char(payday,?mm?)=1; 6.

Select * from monthlyneedpay order by clientno asc,payday desc; 查询应收费用表,先按照客户号升序排序,再按照年份排序降序排序。

3.Advanced SQL

在该练习中,我们根据银行代收费系统的需求,完成以下高级SQL语句的编写:

1. 查询前一年所有客户的欠费记录,按照客户编号升序排列。

Select clientno,needpay,payday from monthlyneedpay where paystatus=0 and to_char(payday,?yyyy?)=2015 order by clientno asc; 2. 查询当前年份欠费记录超过5条以上的用户。

select * from (select sum(case PAYSTATUS when '0' then 1 else 0 end) as QUANTITY from monthlyneedpay where to_char(LOGDATE,'yyyy')='2016' group by CLIENTNO)where QUANTITY>=5;

3计算客户号1001的客户,其名下所有设备的应收基本费用之和,附加费用1之和,附加费用

2之和。

Select count(needpay),count(addfee1),count(addfee2) from monthlyneedpay

6

where clientno=1001;

4.计算客户号1001在2016年1月份,计费设备号100的应收违约金。

Select latefee from monthlyneedpay where clientno=1001 and deviceno=100 and to_char(payday,?yyyy?)=2016 and to_char(payday,?mm?)=1;

5.计算银行代号为19的银行在20160130产生的缴费总次数和总金额,冲账的记录不记录总次数和总金额中。

select

banktotalcount,banktotalmoney

from

checktotal

where

bank_id=19

and and

to_char(checkdate,,?yyyy?)=2016 to_char(checkdate,?dd?)=30;

and to_char(checkdate,?mm?)=1

4.Programming with Transactions and Procedure Process

编写存储过程完成以下问题(如果不熟悉存储过程的编写,也可以顺序执行多条SQL语句来实现功能需求): 第一部分【查询】: 交易描述:

判断客户号是否存在,然后根据客户号取得客户姓名,地址,应收费用。

其中应收费用的计算:该用户下所有计费设备,计算所有计费设备未交费的所有月份应收费用的和。计费设备应收费用的计算:根据计费设备号取得基本费用,附加费用1,附加费用2,应收违约金,实收违约金 ,减免违约金后,应收费用=基本费用+附加费用1+附加费用2+应收违约金-减免违约金,依次获取该计费设备收费标志为0的所有月份应收费用的和。修改应收费用表中的应收违约金,附加费用1,附加费用2几个字段,避免执行缴费操作后的重复计算。获取的客户姓名、地址、应收费用等数据返回。 createorreplaceprocedure checkclient(client_no innumber,error outvarchar2, outclientnanme outvarchar2,outaddress outvarchar2,outneedpay outnumber)is

Tclientnanme varchar2(20); Taddress varchar2(20); Tneedpay number(7,2); clientnum number(4); Taddfee1 number(7,2); Taddfee2 number(7,2); Terror varchar2(20); Tlatefee number(7,2); begin

7

selectcount(*)into clientnum from client where clientno=client_no; if

clientnum=0then

Terror:='没有此客户'; error:=Terror; else

select clientname,address into Tclientnanme,Taddress from client where clientno=client_no; selectsum(needpay),sum(addfee1),sum(addfee2),sum(latefee)into

Tneedpay ,Taddfee1,Taddfee2,Tlatefee from monthlyneedpay where clientno=client_no and paystatus=0;

outclientnanme:=Tclientnanme; outaddress:=Taddress;

outneedpay:=Tneedpay+Taddfee1+Taddfee2+Tlatefee; endif;

end checkclient;

第二部分【缴费】 交易描述:

判断交费金额是否正确,交费金额应该为基本费用,附加费用1,附加费用2,应收违约金的和再减去减免违约金之后的值。如果交费金额不正确,返回交费金额错误的提示信息。缴费金额正确,在应收费用表表中修改收费标志,实收违约金,其中实收违约金应该为应收违约金减去减免违约金。同时用户交费表中增加一条记录,其中操作类型为“存款”。如果客户存在违约金,应计算违约金(这部分可以在其他模块完成的情况下做,具体计算方法见附录)

返回包括姓名,金额,地址,明细费用等详细信息的发票数据。

createorreplaceprocedure checkcharge(client_no innumber,LName outvarchar2, balance outnumber,address outvarchar2,error outvarchar2)is

TName varchar2(20); Taddress varchar2(20);

8

Tpay number(7,2); Tclientnum number(4); Terror varchar2(20); Tneedpay number(7,2); Taddfee1 number(7,2); Taddfee2 number(7,2); Tlatefee number(7,2); Tcharge number(7,2); len number; TID number(4);

Tbasicfee number(7,2);

Cursor myCur isselect*from monthlyneedpay where clientno=client_no;

Tend Date; begin

selectcount(clientno)into Tclientnum from client where clientno=client_no; if

Tclientnum=0then Terror:='不存在此用户'; error:=Terror; endif;

for cur_result in myCur loop begin

Tend:=cur_result.logdate; TID:=cur_result.id;

len:=trunc(sysdate)-trunc(Tend)-10;

update monthlyneedpay set latefee=len*0.001where id=TID and clientno=client_no; end; endloop;

selectsum(paymoney)into Tpay from paylog where clientno=client_no;

selectsum(needpay),sum(basicfee),sum(addfee1),sum(addfee2),sum(latefee)intoTneedpay,Tbasicfee,Taddfee1,Taddfee2,Tlatefee from monthlyneedpay where clientno=client_no;

9


东北大学数据库实验报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: