视图
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典(数据库)中仅存放了视图的定义,不存放视图对应的数据,当基本表的数据发生变化,从视图中查询出的数据也随之而变。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。
定义视图
定义视图语句格式:
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能对指定的时间进行增加或减少一个指定的时间间隔,语法如下:
DATE_ADD(date,INTERVAL expr type)
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 | 复合型,间隔单位:年、月 |
例:
select date_add('2013-01-18', interval '1 2' YEAR_MONTH),
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='大连联达科技股份有限公司';