什么是视图定义?
视图是基于SQL语句中的结果集的可视化的表,可以是一个或者多个表的结合体。数据库中的设计和结构不会受到视图中的函数或者语句影响,也就是说彼此没有什么关联。
快速举个例子:
应用场景:当前有两个表,两个表通过name关联,分别是用户表和成绩表,用户和成绩一对多对应,一个用户对应0到多个成绩,sql表语句如下:
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`grade` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
CONSTRAINT `course_ibfk_1` FOREIGN KEY (`name`) REFERENCES `user` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
例如:咱们需要根据用户查询对应的成绩:
解决方案一:
平时咱们就写sql:
select
u.*,c.grade
from
user u
left join
course c
on
u.name = c.name;
解决方案二:
使用视图简化sql语句:
1.创建视图语句
CREATE ALGORITHM=UNDEFINED DEFINER=`code`@`%` SQL SECURITY DEFINER VIEW `tt` AS (select `u`.`id` AS `id`,`u`.`name` AS `name`,`u`.`age` AS `age`,`c`.`grade` AS `grade` from (`user` `u` left join `course` `c` on((`u`.`name` = `c`.`name`))));
select
*
from
tt
创建视图语句:
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];
创建视图分成三部分结束:
(1) create [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}] view 视图名 [(属性清单)]
ALGORITHM表示视图选择的算法(可选参数)
UNDEFINED:MySQL将自动选择所要使用的算法
MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
(2) as select 语句
as后面就是咱们经常写的sql语句。例如 select * from tableName
(3) [WITH [CASCADED|LOCAL] CHECK OPTION]
CHECK OPTION:表示更新视图时要保证在该试图的权限范围之内
CASCADED:更新视图时要满足所有相关视图和表的条件
LOCAL:更新视图时,要满足该视图本身定义的条件即可
删除视图:
DROP VIEW IF EXISTS 视图名称;