MySQL视图

关联查询的SQL语句(已虚拟化为无意义的表名和字段名)

select 
a.f1,a.f2,a.f3,
b.t1,b.t2,b.t3,
c.y1,c.y2,
d.z1
from A as a 
left join B as b on a.f1 = b.t1 and b.t2=1 and b.t3=1
left join C as c on a.f1 = c.y1 and c.y2!=3
left join D as d on a.f1 = d.z1
where a.f3=2
order by a.f2 desc 
limit 0,100;

改为创建视图:

create view e_view as
select 
a.f1,a.f2,a.f3,
b.t1,b.t2,b.t3,
c.y1,c.y2,
d.z1
from A as a 
left join B as b on a.f1 = b.t1 and b.t2=1 and b.t3=1
left join C as c on a.f1 = c.y1 and c.y2!=3
left join D as d on a.f1 = d.z1
where a.f3=2

简化后的查询方法:

select e_view where xxx order by a.f2 desc limit 0,100;

 

 

 


 

https://www.cnblogs.com/aixinyiji/p/11017557.html

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;#正确
posted @ 2020-01-10 15:52  浮尘微光  阅读(239)  评论(0编辑  收藏  举报