数据库-视图

视图

视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典(数据库)中仅存放了视图的定义,不存放视图对应的数据,当基本表的数据发生变化,从视图中查询出的数据也随之而变。

视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。

视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。

视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。

定义视图

定义视图语句格式:

create view <视图名> [(<列名> [,<列名>].........)]//列名可省略,属性列名由子查询的结果决定

as <子查询>//不允许 order by 和distinct 短语

[with check option]//更新操作时系统自动加上视图定义的谓词条件

删除视图

drop view <视图名>

查询视图

视图定义后,可像基本表一样对视图 select 操作

更新视图

视图时虚表,对视图更新应转化为对基本表的更新(插入,修改,删除)

例题


任务描述

本关任务:在贷款数据库的基础上,创建一个视图let_v1,包含每个法人的法人代码(eno)、贷款总金额(tlamount)。

涉及的表和字段

法人表(let): 法人代码(eno) 法人名称(ename) 经济性质(enature) 注册资金(ecapital)

贷款表(loant): 银行代码(bno) 法人代码(eno) 贷款日期(lsdate) 贷款金额(lamount) 贷款期限(lterm) 还款日期(ledate)

关于部分字段的说明

  • 法人表中的“贷款总额(eamount)”字段,目前没有值,因此如果从该字段取数据,将无法通过后续检查
  • 贷款表中的“还款日期(ledate)”字段不为空,则说明该笔贷款已完成还款
use BANKDB;
#请在此处添加实现代码
########## Begin ##########
1.
create view let_v1
as
select let.eno,sum(lamount) tlamount
from let,loant
where let.eno=loant.eno
group by let.eno;
########## End ##########
2.
Create view let_v1 
as
select eno, sum(lamount) tlamount
from loant 
group by eno;

任务描述

本关任务:在贷款数据库的基础上,创建一个视图let_v2,包含每个法人的法人代码(eno)、未还款的贷款总金额(plamount)、最近一次待还款日期(lpdate)

涉及的表和字段

法人表(let): 法人代码(eno) 法人名称(ename) 经济性质(enature) 注册资金(ecapital)

贷款表(loant): 银行代码(bno) 法人代码(eno) 贷款日期(lsdate) 贷款金额(lamount) 贷款期限(lterm) 还款日期(ledate)

关于部分字段的说明

  • 法人表中的“贷款总额(eamount)”字段,目前没有值,因此如果从该字段取数据,将无法通过后续检查
  • 贷款表中的“还款日期(ledate)”字段不为空,则说明该笔贷款已完成还款

补充知识

DATE_ADD、DATE_SUB函数

mysql中内置函数date_add和date_sub能对指定的时间进行增加或减少一个指定的时间间隔,语法如下:

 
  1. DATE_ADD(date,INTERVAL expr type)
  2. DATE_SUB(date,INTERVAL expr type)

其中date是指定的日期,INTERVAL为关键词,expr是具体的时间间隔,type是时间单位。注意:type可以复合型的,比如YEAR_MONTH。如果type不是复合型的,DATE_ADD和DATE_SUB其实可以通用,因为expr可以为一个负数。可用的type如下表:

type说明
MICROSECOND间隔单位:毫秒
SECOND间隔单位:秒
MINUTE间隔单位:分钟
HOUR间隔单位:小时
DAY间隔单位:天
WEEK间隔单位:星期
MONTH间隔单位:月
QUARTER间隔单位:季度
YEAR间隔单位:年
SECOND_MICROSECOND复合型,间隔单位:秒、毫秒,expr可以用两个值来分别指定秒和毫秒
MINUTE_MICROSECOND复合型,间隔单位:分、毫秒
MINUTE_SECOND复合型,间隔单位:分、秒
HOUR_MICROSECOND复合型,间隔单位:小时、毫秒
HOUR_SECOND复合型,间隔单位:小时、秒
HOUR_MINUTE复合型,间隔单位:小时分
DAY_MICROSECOND复合型,间隔单位:天、毫秒
DAY_SECOND复合型,间隔单位:天、秒
DAY_MINUTE复合型,间隔单位:天、分
DAY_HOUR复合型,间隔单位:天、小时
YEAR_MONTH复合型,间隔单位:年、月

例:

 
  1. select date_add('2013-01-18', interval '1 2' YEAR_MONTH),
  2. date_sub(now(),interval 2 YEAR);
use BANKDB;
#请在此处添加实现代码
########## Begin ##########
1.
create view let_v2
as
select let.eno,sum(lamount) plamount,min(date_add(lsdate,interval lterm year)) lpdate
from let,loant
where let.eno=loant.eno and ledate is null
group by let.eno;
########## End ##########
2.
create view let_v2 
as
select eno, sum(lamount) plamount, min(DATE_ADD(lsdate, INTERVAL lterm YEAR)) lpdate
from loant 
where ledate is null 
group by eno;

任务描述

本关任务: 针对视图let_v1、let_v2完成查询: 每位法人的贷款总额、未还款贷款总额、最近待还款日期和最近待还款金额,并按照还款日期的先后顺序排序。 列别名设置为:法人名称、贷款总额、未还款贷款总额、最近待还款日期和最近待还款金额。

视图let_v1:包含每个法人的法人代码(eno)、贷款总金额(tlamount)。 视图let_v2:包含每个法人的法人代码(eno)、未还款的贷款总金额(plamount)、最近一次待还款日期(lpdate)。

use BANKDB;
#请在此处添加实现代码
########## Begin ##########
1.
select ename 法人名称,
tlamount 贷款总额,
plamount 未还款贷款总额,
lpdate 最近待还款日期,
(select lamount from let,loant where let.eno=loant.eno and loant.ledate is null and let_v1.eno=let.eno order by date_add(lsdate,interval lterm YEAR) limit 1) 最近待还款金额
from let,let_v1,let_v2
where let.eno = let_v1.eno and let.eno=let_v2.eno
order by lpdate;

########## End ##########
2.
select ename "法人名称", tlamount "贷款总额", plamount "未还款贷款总额", 
lpdate "最近待还款日期",
(select lamount from loant where loant.eno=let_v2.eno and 
DATE_ADD(lsdate, INTERVAL lterm YEAR)=lpdate) "最近待还款日金额"
from let_v1, let_v2, let e 
where let_v1.eno=let_v2.eno and e.eno=let_v2.eno
order by 4;

任务描述

本关任务: 针对视图let_v1、let_v2查询“大连联达科技股份有限公司”的已还款总额和未还款总额。 列别名为:已还款总额、未还款总额

视图let_v1:包含每个法人的法人代码(eno)、贷款总金额(tlamount)。 视图let_v2:包含每个法人的法人代码(eno)、未还款的贷款总金额(plamount)、最近一次待还款日期(lpdate)。

use BANKDB;
#请在此处添加实现代码
########## Begin ##########
1.
select
(tlamount-plamount) 已还款总额,
plamount 未还款总额
from let_v1,let_v2
where let_v1.eno=let_v2.eno
and let_v1.eno=(select eno from let where ename="大连联达科技股份有限公司");
########## End ##########
2.
select tlamount-plamount "已还款总额", plamount "未还款总额"
from let_v1,let_v2, let e 
where let_v2.eno=let_v1.eno and e.eno=let_v2.eno
and ename='大连联达科技股份有限公司';

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值