MySQL视图基础

视图

视图同基表一样,都是数据库对象

概述视图

MySQL视图是一种虚拟存在的表,视图也是由行和列构成,但是视图并不会实际存在于数据库中,行和列的数据来自于定义视图的查询中所使用的表,并在使用视图时动态生成。

视图和数据表的区别

  • 视图不是真实的表,是一个虚拟表,其结构和数据都建立对基表真实查询的基础上
  • 存储在数据库中的查询操作定义了视图的内容和结构,视图的行和列的数据来自于查询所引用的实际表,引用视图是动态生成
  • 视图没有实际的物理记录,数据集实际存储在基表中
  • 视图是数据的窗口,基表才是真实内容。视图是查看数据表的一种方式。从安全角度上来看,视图的数据安全性高,使用视图的开发人员不涉及数据表,深知可以不知道基表的真实结构

视图和基表

基表适用于存储真实数据

create table tb_dept(
	id bigint primary key auto_increment,
    name varchar(32)
);
insert into tb_dept(name) values('科研部'),('销售部'),('市场部');

create table tb_emp(
    id bigint primary key auto_increment,
    name varchar(32) not null,
    dept_id bigint not null,
    foreign key(dept_id) references tb_dept(id) on delete cascade
);
insert into tb_emp(name,dept_id) values('张三',1),('王五',2),('李四',3);

建立视图

基础语法:create view 视图名称 as 查询结果

create view v_emp as select e.id empno,e.name as ename,d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;

视图是一个虚表,其中并不直接存储数据,但是可以当作表的方式进行使用,具体数据来源于定义视图的查询结果集

select * from v_emp;

查看视图的结构desc 视图名称;

mysql> desc v_emp;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| empno | bigint(20)  | NO   |     | 0       |       |
| ename | varchar(32) | NO   |     | NULL    |       |
| dname | varchar(32) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

查看视图的定义,可以查看创建视图对应的SQL语句

show create view v_emp;

插入数据到视图

create view v_emp1 as select * from tb_emp where id>1;

insert into v_emp values(4,'熊大',1);

create view v_emp2 as select e.*,d.id did,d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;

因为向视图中插入数据实际上就是向基表中插入数据,也就是执行insert into v_emp values(4,'熊大',1);,就是向基本表tb_emp中插入数据,只有没有违法基本中的规则则插入成功。

select * fro tb_emp;

insert into v_emp values(4,'熊大',1);

视图的数据来自于两个表的查询结果

mysql> desc v_emp;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| empno | bigint(20)  | NO   |     | 0       |       |
| ename | varchar(32) | NO   |     | NULL    |       |
| dname | varchar(32) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

insert into v_emp values(5,'熊二','人才部');
ERROR 1394 (HY000): Can not insert into join view 'test.v_emp' without fields list

create view v_emp2 as select e.*,d.* from tb_emp e inner join tb_dept d on e.dept_id=d.id;
-- ERROR 1060 (42S21): Duplicate column name 'id'

create view v_emp2 as select e.*,d.id did, d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;

desc v_emp2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | bigint(20)  | NO   |     | 0       |       |
| name    | varchar(32) | NO   |     | NULL    |       |
| dept_id | bigint(20)  | NO   |     | NULL    |       |
| did     | bigint(20)  | NO   |     | 0       |       |
| dname   | varchar(32) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

insert into v_emp2(id,name,dept_id,did,dname) values(6,'小哥',1,null,'研发部');
-- ERROR 1393 (HY000): Can not modify more than one base table through a join view 'test.v_emp2'

insert into v_emp2(id,name,dept_id) values(6,'小哥',1);
  • 允许针对视图进行数据的修改操作,但是不允许同时修改多于一个基表
  • 如果数据是通过计算得到的,也不能修改
    • distinct、group by、having、union和union all
  • 视图的修改实际上是针对基表数据的修改,不允许违反基本的约束规则
  • 视图允许嵌套,就是create view v_emo3 as select * from v_emp1;

修改视图

当基表的结构发生变化时,可以修改视图定义。但是如果在视图定义中使用的列没有修改,则无需修改视图定义
语法:alter view 视图名称 as 新的查询;

删除视图

删除视图实际上就是删除视图的定义,不会删除数据
语法:drop view 视图名称;

视图的特点

  • 视图的特点如下:视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立新的关系。
  • 视图是由基本表产生的表。视图的建立和删除不影响基本表。
  • 对试图内容的更新(添加、删除和修改)直接影响基本表。
  • 当视图来自多个基本表时,有时可以修改数据,有时不允许修改数据。
  • 视图的操作包括创建视图,查看视图,删除视图和修改视图

视图的优点

  1. 可以从基本表中进行数据定制,简化数据操作,提高数据的安全性
  2. 共享所需数据、修改数据格式
  3. 重用SQL语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值