什么是视图

视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图的特性


视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);

视图的作用


方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

作用场合


权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary...

关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;


demo mysql视图 mysql视图操作_SQL



-- 视图 

-- 一般查询小张的所有课程相关信息 

SELECT uc.id AS id,u.name AS username, 

c.name AS coursename  

FROM user AS u  

LEFT JOIN user_course AS uc on  

((u.id=uc.userid))  

LEFT JOIN course AS c ON ((uc.courseid=c.id)) 

WHERE u.name='小张' 

-- 创建视图来查 

DROP VIEW IF EXISTS view_user_course; 

CREATE VIEW view_user_course AS( 

SELECT 

uc.id AS id,u.name AS username, 

c.name AS coursename 

  
FROM user AS u  

LEFT JOIN user_course AS uc on  

((u.id=uc.userid))  

LEFT JOIN course AS c ON ((uc.courseid=c.id)) 

); 

-- 创建好视图之后,我们可以直接用以下SQL语句在视图上查询小张上的所以课程相关信息 



SELECT 

    vuc.username, 

    vuc.coursename 

FROM 

    view_user_course AS vuc 

WHERE 

     vuc.username = '小张' 



-- 不能在一张由多张关联表连接而成的视图上做同时修改两张表的操作; 

UPDATE view_user_course SET username='test', 

coursename='javascript' WHERE id=3



视图与表是一对一关系情况:如果没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行增删改数据操作;

如我们创建用户关键信息视图view_user_keyinfo,如下:


demo mysql视图 mysql视图操作_demo mysql视图_02



-- ----------------------------
-- View structure for `view_user_keyinfo`
-- ----------------------------
DROP VIEW
IF EXISTS `view_user_keyinfo`;

CREATE VIEW `view_user_keyinfo` AS SELECT
    `u`.`id` AS `id`,
    `u`.`account` AS `account`,
    `u`.`name` AS `username`
FROM
    `user` `u`;



demo mysql视图 mysql视图操作_demo mysql视图_02


进行增删改操作如下,操作成功(注意user表中的其它字段要允许为空,否则操作失败):


INSERT INTO view_user_keyinfo (account, username)
VALUES
    ('test1', 'test1');


DELETE
FROM
    view_user_keyinfo
WHERE
    username = 'test1';


UPDATE view_user_keyinfo
SET username = 'updateuser'
WHERE
    id = 1


视图与表是一对多关系情况:如果只修改一张表的数据,且没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行改数据操作,如以下语句,操作成功;


update view_user_course set coursename='JAVA' where id=1;


update view_user_course set username='test2' where id=3;


以下操作失败:


delete from view_user_course where id=3;


insert into view_user_course(username, coursename) VALUES('2','3');