Mysql中的视图操作

什么是视图

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

视图的特性

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

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

视图的作用

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

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

作用场合

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

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



-- 视图
-- 一般查询小张的所有课程相关信息
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,如下:

复制代码
-- ----------------------------
-- 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`;
复制代码

进行增删改操作如下,操作成功(注意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');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值