MySQL中视图的那点东西

本人新手一枚,将自己学习时的经验总结一下,其中若有错误,还望各位多多指教。

1,什么是视图

  视图(view)是一种虚拟的表,并不在数据库中实际存在。通俗的来说,视图就是执行select语句后返回的结果。

2,为什么要使用视图

  1,简单

  对于数据库的用户来说,很多时候,需要的关键信息是来自多张复杂关联表的。这时用户就不得不使用十分复杂的SQL语句进行查询,给用户造成极差的体验感。使用视图之后,可以极大的简化操作,使用视图的用户不需要关心相应表的结构、关联条件等。对于用户来说,视图就是他们想要查询的结果集。

  2,安全

  使用视图的用户只能访问被允许查询的结果,使用视图可以限制用户访问一些敏感信息列。

3,使用视图的小案例

  1,在案例中学习代码永远都是最快的

创建如下三个表格:

#users表的创建
CREATE TABLE `users` (
  `u_id` int(4) NOT NULL auto_increment,
  `username` varchar(20) default NULL,
  `age` int(4) default NULL,
  `country` varchar(20) default NULL,
  PRIMARY KEY  (`u_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

#course表的创建
CREATE TABLE `course` (
  `c_id` int(4) NOT NULL auto_increment,
  `coursename` varchar(20) default NULL,
  `description` varchar(255) default NULL,
  PRIMARY KEY  (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

#user_course表的创建
CREATE TABLE `user_course` (
  `u_c_id` int(4) NOT NULL auto_increment,
  `userid` int(4) NOT NULL,
  `courseid` int(4) NOT NULL,
  PRIMARY KEY  (`u_c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

向表中插入如下数据:

接下来我们的任务是:查询tom所修的课程,显示tom的名字和课程名

#方法一:子查询的方式
select username,coursename from users u,course c where u.username = ‘tom‘ and c.c_id in (
        select courseid from user_course where userid = (
                select u_id from users where username = ‘tom‘))
#方法二:外链接的方式
select username,coursename from
        user_course
        left join course on user_course.courseid = course.c_id
        left join users on user_course.userid = users.u_id
        where username = ‘tom‘

可以看出,并不是很复杂的关联表的查询已经如此的复杂

如果我们使用视图

#使用视图进行查询
select username,coursename from user_course_view where username = ‘tom‘

这就是最简单的查询语句

  2,见识了视图的便捷,再来看看视图是如何使用的。

    1,视图的创建

#创建视图
create view user_course_view as
    select * from
    user_course
    left join course on user_course.courseid = course.c_id
    left join users on user_course.userid = users.u_id

结果如下:

如上图所示,我们已经将三张表格放在了一张视图里面

对于想要查询的内容,我们可以在这个视图中进行,极大的简化了操作。

#创建视图,隐藏课程的描述信息
create view user_course_view as
    select user_course.*,users.*,course.c_id,course.coursename from
    user_course
    left join course on user_course.courseid = course.c_id
    left join users on user_course.userid = users.u_id

假设课程的描述信息是隐秘信息,不希望用户查询的话,可以使用以上代码进行隐藏,效果如下:

与之前相比,课程的描述信息已经隐藏了,这就是视图的另一个优点。

  2,视图的相关操作

  上面我们已经讲了视图的查询操作,那么除了查询还可以进行哪些操作呢?

  视图与表是一对一的关系:此时视图和表的操作是一样的。

  视图与表是一对多的关系:上面的小案例中,视图与表是一对三的关系

    只可以对视图进行改的操作,而且是在没有其他约束的情况下

insert into user_course_view(userid,courseid,coursename) value(3,2,‘java‘);#错误的
update user_course_view set coursename = ‘java web‘ where u_c_id = 1;#正确

总结

  本人的一点总结,如有错误,请批评指正。

原文地址:https://www.cnblogs.com/aixinyiji/p/11017557.html

时间: 2024-08-29 20:07:23

MySQL中视图的那点东西的相关文章

mysql 中视图和表的区别以及联系是什么?

一.两者的区别 1)本质 表是内容,视图是窗口.视图是已经编译好的sql语句,是基于sql语句的结果集的可视化的表,而表不是. 2)实与虚 表属于全局模式中的表,是实表:视图属于局部模式的表,是虚表. 3)是否存在物理记录 视图没有,而表有. 4)是否占用物理空间 表占用物理空间,而视图不占用.视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能用创建的语句来修改. 5)是否影响 视图的建立(create)和删除(drop)只影响视图本身,不影响对应的基本表. 6)安全因素 视图是查看数据

在Navicat for MySQL中打开视图时,提示视图没有主键的问题

一直把视图理解为一个select语句而已,视图一般就是用于查询,不会通过视图来更新表或视图本身的数据,所以视图根本不需要什么主键.今天自己建了一个视图view_test: drop view if exists view_test create view view_test as select a.c1,a.c2, b.c1,b.c2, c.c1,c.c2, d.c1,d.c2 from table_A a join teble_B b on a.c3=b.c3 join table_C c o

MySQL笔记---视图,存储过程, 触发器的使用入门

大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只能停留在名称的阶段.最近看完了一本薄薄的小书叫<MySQL必知必会>,记了不少笔记,也自己上手实践了一番,总算是了解了些皮毛. 下面通过实例来具体了解这几个东西,首先我的样例表是这样的. 视图: 什么是视图? 视图是虚拟的表,本身并不包含数据,通过一个例子,来更好地理解视图: 假设上述表中,我需要

mysql之视图、存储过程、触发器、约束、授权

视图:     简单视图:单张表     复杂视图:多张,子查询     物化视图: MariaDB [hidb]> create view v1_students as select name,age from students; MariaDB [hellodb]> create view v3_students as select name,age from students where age>40 ; Query OK, 0 rows affected (0.05 sec) M

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

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

一步一步带你入门MySQL中的索引和锁 (转)

出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构. InnoDB的索引结构 在InnoDB中是通过一种多路搜索树——B+树实现索引结构的.在B+树中是只有叶子结点会存储数据,而且所有叶子结点会形成一个链表.而在InnoDB中维护的是一个双向链表. 你可能会有一个疑问,为什么使用 B+树 而不使用二叉树或者B树? 首先,我们知道访问磁盘需要访问到

一步一步带你入门MySQL中的索引和锁

索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构. InnoDB的索引结构 在InnoDB中是通过一种多路搜索树——B+树实现索引结构的.在B+树中是只有叶子结点会存储数据,而且所有叶子结点会形成一个链表.而在InnoDB中维护的是一个双向链表. 你可能会有一个疑问,为什么使用 B+树 而不使用二叉树或者B树? 首先,我们知道访问磁盘需要访问到指定块中,而访问指定块是需要 盘片旋转 和 磁臂

MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file记录日志的文件名. 4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. 二

MySQL之视图、存储过程、触发器、函数、事务、动态执行SQL

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 创建视图: create view v1 as select * from student where id > 100; 今后可以直接通过: select * from v1;   #直接访问学生ID大于100的信息 删除视图: drop view v1; 修改视图: alter view v1 as select id,name f