MySQL之视图操作

MySQL之视图操作

视图

什么是视图

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

视图的特性

  • 视图是对若干张基本表的引用,是一张虚表,查询语句执行的结果,不存储具体的数据(基本表发生了改变,视图也会跟着被改变)
  • 和基本表一样,也可以增删改查操作(但是增删改操作会有一定的条件限定)

视图的作用

  1. 方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性
  2. 更加安全,数据库授权命令不能限制到特定的行和特定的列,但是通过合理的创建视图,可以把权限限定到行级和列级

使用的场合

  1. 权限控制的时候,不希望用户访问表中的某些含敏感信息的列,比如salary...
  2. 关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息、简化操作。

视图操作--创建视图&查询数据

注意:在创建视图的时候要注意,mysql视图不支持创建子查询,所以再用子查询的时候,要将其拆开使用

-- 查到所有平均分数大于60分,并且为男性的学生的名字
-- SELECT student.sname as name,student.gender as sex, A.avg as avg FROM(
-- SELECT score.student_id as id, AVG(score.num) as avg FROM score GROUP BY score.student_id HAVING AVG(score.num) > 60
-- ) AS A
-- LEFT JOIN student on student.sid = A.id WHERE student.gender = ‘男‘;
-- 建立一个视图, 这个是失败的,因为mysql视图中不支持子查询的功能
-- CREATE VIEW v1 as(
-- SELECT student.sname as name,student.gender as sex, A.avg as avg FROM(
-- SELECT score.student_id as id, AVG(score.num) as avg FROM score GROUP BY score.student_id HAVING AVG(score.num) > 60
-- ) AS A
-- LEFT JOIN student on student.sid = A.id WHERE student.gender = ‘男‘
-- )

-- 分开分别建立视图一和视图二
-- CREATE VIEW v1 AS
-- SELECT score.student_id as id, AVG(score.num) as avg FROM score GROUP BY score.student_id HAVING AVG(score.num) > 60
-- CREATE view v2 AS
-- SELECT student.sname as name,student.gender as sex, v.avg as avg FROM
-- v1 v
-- LEFT JOIN student on student.sid = v.id WHERE student.gender = ‘男‘
SELECT * FROM v2 WHERE v2.name = ‘李三‘

创建视图的案例

创建视图

-- 创建视图的格式 create view 视图名称 as SQL语句
create view v1 as
select * from A;

注意:在这里create 和 view 之间也能加一些另外的参数:

algorithm = undefined : 定义视图的处理算法;

definer = ‘root‘ @ ‘localhost‘ : 指定视图的创建者;

sql security definer : 指定视图查询数据时的安全验证方式;

删除视图

-- 格式:drop view 视图名称
drop view v1

修改视图

-- 格式:alter view 视图名称 as sql语句
alter view v1 as
select * from A where A.id > 23;

使用视图

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

select * from v1;

准备数据

这里创建了三张表:用户(user)、课程表(course)、用户课程中间表(user_course):

-- ----------------------------
-- Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `description` varchar(500) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (‘1‘, ‘JAVA‘, ‘JAVA课程‘);
INSERT INTO `course` VALUES (‘2‘, ‘C++‘, ‘C++课程‘);
INSERT INTO `course` VALUES (‘3‘, ‘C语言‘, ‘C语言课程‘);

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `address` varchar(255) DEFAULT NULL,
  `others` varchar(200) DEFAULT NULL,
  `others2` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (‘1‘, ‘user1‘, ‘小陈‘, ‘美国‘, ‘1‘, ‘1‘);
INSERT INTO `user` VALUES (‘2‘, ‘user2‘, ‘小张‘, ‘日本‘, ‘2‘, ‘2‘);
INSERT INTO `user` VALUES (‘3‘, ‘user3‘, ‘小王‘, ‘中国‘, ‘3‘, ‘3‘);

-- ----------------------------
-- Table structure for `user_course`
-- ----------------------------
DROP TABLE IF EXISTS `user_course`;
CREATE TABLE `user_course` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `courseid` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_course
-- ----------------------------
INSERT INTO `user_course` VALUES (‘1‘, ‘1‘, ‘2‘);
INSERT INTO `user_course` VALUES (‘2‘, ‘1‘, ‘3‘);
INSERT INTO `user_course` VALUES (‘3‘, ‘2‘, ‘1‘);
INSERT INTO `user_course` VALUES (‘4‘, ‘2‘, ‘2‘);
INSERT INTO `user_course` VALUES (‘5‘, ‘2‘, ‘3‘);
INSERT INTO `user_course` VALUES (‘6‘, ‘3‘, ‘2‘);

数据准备

当要查询小张上的所有课程的相关的信息时,需要些下面的语句:

SELECT
    `uc`.`id` AS `id`,
    `u`.`name` AS `username`,
    `c`.`name` AS `coursename`
FROM
    `user` `u`
LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))
LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))
WHERE
    u.`name` = ‘小张‘

当我们创建一下的使徒的时候:

create view v1 as
(
    SELECT
        `uc`.`id` AS `id`,
        `u`.`name` AS `username`,
        `c`.`name` AS `coursename`
    FROM
        (
            (
                `user` `u`
                LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))
            )
            LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))
        )
);

之后我们就能通过调用视图来进行查询了

select
    v.username,
    v.coursename
from
    v1 v
where
    v.username = ‘小张‘;

视图操作--增删改操作

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

注意:在这里就算是修改了表中的数据,那也是对视图中的数据进行修改,而真实的表中的数据是不会被改变的。

我们可以尝试在视图view_user_course上做增删改数据操作,如下:

update view_user_course set username=‘test‘,coursename=‘JAVASCRIPT‘ where id=3 

遗憾的是操作失败,提示错误信息如下:

[SQL] update view_user_course set username=‘test‘,coursename=‘JAVASCRIPT‘ where id=3

[Err] 1393 - Can not modify more than one base table through a join view ‘demo.view_user_course‘

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

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

进行增删改操作如下,操作成功(注意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

-- ps : 只要将它当成一个普通的表操作即可,但是如果视图中的表结构不是一对一的,那么在进行操作的时候会出问题的

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

update view_user_course set coursename=‘JAVA‘ where id=1;
update view_user_course set username=‘test2‘ where id=3;
-- ps : 这里是一对多中两个不同的表,分别进行数据更改操作
delete from view_user_course where id=3;
insert into view_user_course(username, coursename) VALUES(‘2‘,‘3‘);
-- ps: 一对多的情况下是不能进行删除和增加的操作的

注:

  • 视图中的查询语句要调到最优
  • 修改操作的时候要注意,不经意间就会修改掉基本表中的多条数据

参考:

https://www.cnblogs.com/chenpi/p/5133648.html

http://www.cnblogs.com/wupeiqi/articles/5713323.html

原文地址:https://www.cnblogs.com/ouyang1124/p/10759374.html

时间: 2024-10-07 07:19:42

MySQL之视图操作的相关文章

hibernate mysql视图操作

hibernate对视图操作,首先建立数据库视图 视图v_invite: create view pintu.v_invite asselect cp.user_id as be_user_id,cai.activity_invite_id,cai.person_id,cai.person_name,cai.be_person_id,cai.activity_id,cai.invite_timefrom ptcom.com_person cp, ptcom.com_activity_invite

边记边学PHP-(十四)MySql数据库基础操作1

提到数据库,相信都不陌生.比较常见的是SQL Server . Oracle.Access.SQLite等等.当然还有PHP的黄金搭档,MySql数据库.当然我所写的都是MySql的一些基础,我还没有深入的学习这个数据库.深入学习还需要一段时间.但是现在学的基础基本满足我现在的学习需要. 一.MySQL简介 1.MySQL是什么 MySQL是一款安全.跨平台.高效的,并与PHP.Java等主流编程语言紧密结合的数据库系统.该数据库系统是由瑞典的MySQL AB公司开发.发布并支持,由MySQL初

第五章 MySQL事务,视图,索引,备份和恢复

第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行,要么都不执行. 事务是作为最小的控制单元来使用的,特别使用与多用户同时操作的数据库系统. 2.为什么需要事务 事务(transaction)是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事务执行成功,则在该事务中进行的所有数据均会提交,成为数据库中永久的组成部分.如果事务执行遇到错误且

MySQL/MariaDB视图

本文目录:1.创建.修改视图2.视图算法merge.temptable3.删除.查看视图信息4.检查无效视图 视图是表表达式的一种,所以它也是虚拟表.对视图操作的时候会通过语句动态的从表中临时获取数据. 1.创建.修改视图 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [IF NOT EXISTS] view_name [(column_list)] AS select_statement [WITH

MySQL之视图、触发器、事务、存储过程、函数 流程控制

阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部都做了,也就是说它想要完成一件事,以后想开发的人,例如想写python程序的人,你就专门的写你自己的python程序,以后凡是关于数据的增删改查,全部都在MySQL里面完成,也就是说它想实现一个数据处理与应用程序的一个完全的解耦和状态,比如说,如果我是个应用程序员,我想要查询数据,我不需要自己写sql语句,只需要调用mysql封装好的一些功能,直

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份 阅读目录 一:视图 二:触发器 三:存储过程 四:函数 五:事物 六:数据库锁 七:数据库备份 一:视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点; 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系. 2. 视图是由基本表(实表)产生的表(虚表). 3. 视图的建立和删除不影响基本表. 4. 对视图内容的更新(添加.删除和修改)直接影响基本表

mysql之视图,触发器,事务等。。。

mysql之视图,触发器,事务等... 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推

mysql数据库的操作复习

mysql数据库的操作可以分为四种:DDL,DML,DCL,TCL; DDL(data definition language):数据定义语言: CREATE:在数据库中创建新的数据对象 ALTER:修改数据库中对象的数据结构 DROP:删除数据库中的对象 DISABLE/ENABLE TRIGGER:修改触发器的状态 UPDATE STATISTIC:更新表/视图统计信息 TRUNCATE TABLE:清空表中数据 COMMENT:给数据对象添加注释 RENAME :更改数据对象名称 DML(

Mysql数据库常用操作

1.备份数据库 [[email protected] ~]# mysqldump -h 192.168.0.8 -uroot  -p'123456'  user >user.sql 2.查看mysql数据库字符集设置 mysql> show variables like 'character_set_%';+--------------------------+----------------------------+| Variable_name            | Value