视图
引进:
通常我们在数据库中查询数据时用的是SELECT语句,我们可以用SELECT语句查询任何数据库中的信息,只要数据库有,只要你要。利用SELECT语句,你可以将一个个表通过一些特定的关键字、函数等连接起来,最后生成你想要的结果。但是,我们往往都知道,如果是利用SELECT语句查询到的数据只能作为临时的,不能将它存储起来,下一次再查询相同的信息时只能再次重新进行编写,大大降低了效率。那么,有没有一种方法能够让我将常用到的数据组成一张表并且存储起来,下次想要使用时就可以直接利用某个语句查询就可以呢?
没错就是视图!!!
为了方便演示这里我们直接创建一个基本表:
create table student(
sno char(10) primary key not null,
sname varchar(20) unique,
ssex char(4) check(ssex in("男","女")),
sage smallint,
sdept varchar(20) default "计算机");
--插入数据
insert into student(sno,sname,ssex,sage,sdept) values("1001","张军","男",18,"电气"),("1002","李力","男",17,"计算机"),("1003","张佳","女",19,"机械"),("1004","宋丽佳","女",18,"电气");
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L74KTfm4-1638448590567)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20211202203132551.png)]
创建视图
create view student_2(id,name,age,sex)
-- ①
as
select sno,sname,sage,ssex
from student
注意①上面这个括号可以不写,表示默认列名用原表。
查询视图
DBMS执行视图查询时,先进行有效性检查,检查表、视图是否存在。如果存在则取出该视图的定义,转换成对原表的查询。
SELECT *
From student_2
更新视图
i n s e r t , d e l e t e , u p d a t e insert,delete,update insert,delete,update
都是通过对视图的消解转换为对基本表的操作。
update student_2
set name = "荒天帝"
where id = "1001"
删除视图
drop view student_2 [cascade]
//如果使用cascade,将book视图的儿子全部都删除了
//不加,仅仅只删除本身
扩展:
视图是一种虚拟的表,它允许用户看到或者(有时)更新特定部分的数据。
通过视图为用户提供数据,并限制对用户不应当看到或更新的数据的访问。视图可以是从一个表中提取的记录行或者列的集合,或者可以包含多个表中的数据,这些表在其他的视图中被联合,视图可以包含经过计算的字段、分组过的字段和汇总字段。
好处:
加强了安全性
用户只能看到视图所显示的数据
简化数据访问操作
可以访问远程数据源
视图++
哈哈,大家是不是觉得,视图很简单了,跟大家来个猛的!
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ] }
ENCRYPTION:视图是加密的,如果选上这个选项,则无法修改.创建视图的时候需要将脚本保存,否则再也不能修改了
SCHEMABINDING:和底层引用到的表进行定义绑定。这个选项选上的话,则视图所引用到的表不能随便更改构架(比如列的数据类型),如果需要更改底层表构架,则先drop或者alter在底层表之上绑定的视图.
VIEW_METADATA:这个是个很有意思的选项.正如这个选项的名称所指示,如果不选择,返回给客户端的metadata是View所引用表的metadata,如果选择了这个选项,则返回View的metadata.再通俗点解释,VIEW_METADATA可以让视图看起来貌似表一样。View的每一个列的定义等直接告诉客户端,而不是所引用底层表列的定义。
知识杂烩
SQL是一个非过程化的语言
SQL具有数据控制,数据定义,数据操纵。
SQL具有两种使用方式,交互式和嵌入式
视图不存放数据,只存放定义
课后习题:
注意请选中分步执行,不保证完全正确性
-- 创建数据库
create database scxt;
-- 创建student表
create table student(
sno char(10) primary key not null,
sname varchar(20) unique,
ssex char(4) check(ssex in("男","女")),
sage smallint,
sdept varchar(20) default "计算机");
-- 创建course表
create table course(
cno char(10) primary key,
cname varchar(20),
ccredit smallint,
chour smallint)
-- 创建sc表
create table sc(
sno char(10),
cno char(10),
grade float check(grade<100 and grade>0),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno),
primary key(sno,cno)
);
-- 添加student数据
insert into student(sno,sname,ssex,sage,sdept) values("1001","张军","男",18,"电气"),("1002","李力","男",17,"计算机"),("1003","张佳","女",19,"机械"),("1004","宋丽佳","女",18,"电气");
-- 添加course数据
insert into course(cno,cname,ccredit,chour) values("c01","数据库",4,64),("c02","数学",2,32),("c03","信息系统",4,64),("c04","操作系统",3,48);
-- 添加sc数据
insert into sc(sno,cno,grade)values("1001","c01",92),("1001","c02",null),("1001","c03",88),("1001","c04",87),("1002","c03",90),("1003","c01",56),("1003","c03",45);
-- 进行测试,查看表
select * from student;
select * from sc;
select * from course;
-- 1.
update student
set sdept = "电气系"
where sname = "张佳";
-- 2.
update course
set ccredit = 4,chour=64
where cname="操作系统";
-- 3.
delete from sc
where cno = (select cno
from course
where cname = "操作系统");
delete from course
where cname = "操作系统";
-- 4.
update sc
set grade=86
where sno in (select sno from student where sname="李力");
-- 5.
alter table student add column jiguan varchar(20);
-- 6.
insert into student(sno,sname,jiguan)values("1005","李红","北京");