视图就是一条select语句执行后返回的结果集。
创建视图时,主要的任务就是这一条SQL查询语句。
对于复杂的SQL查询 => 写成视图 => 下次用方便
DBA写好视图给普通开发者用
写好视图,将视图授权给用户,达到更细粒度和精确的授权
视图对若干张表的引用,是一张虚表,不保存具体的数据,只保存查询方法(SQL)
如果表的数据发生了变化,视图的结果也会一起变化
1. 简化查询
2. 权限控制
创建两个表用于视图测试
SET FOREIGN_KEY_CHECKS=0; --》暂时禁用外键约束检查
DROP TABLE IF EXISTS course;
CREATE TABLE course (
sid int(11) NOT NULL AUTO_INCREMENT,
sname varchar(32) NOT NULL,
PRIMARY KEY (sid)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `course` VALUES ('1', '语文');
INSERT INTO `course` VALUES ('2', '数学');
INSERT INTO `course` VALUES ('3', '英语');
INSERT INTO `course` VALUES ('4', '物理');
INSERT INTO `course` VALUES ('5', '');
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL,
course_id int(11) NOT NULL,
PRIMARY KEY (id),
KEY fk_student_course (course_id),
CONSTRAINT fk_student_course FOREIGN KEY (course_id) REFERENCES course (sid)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', '小飞', '1');
INSERT INTO `student` VALUES ('2', 'hukey', '2');
INSERT INTO `student` VALUES ('3', '小王', '3');
INSERT INTO `student` VALUES ('4', '阿狗', '4');
查询小飞上的所有课程相关信息(查看小飞课程的中文名字)
SELECT * FROM student LEFT JOIN course ON student.id = course.sid WHERE student.name = "小飞";
CREATE ALGORITHM=UNDEFINED
DEFINER = 'root'@'localhost'
SQL SECURITY DEFINER
VIEW view_student_course AS (
SELECT * FROM student LEFT JOIN course ON student.id = course.sid);
ALGORITHM=UNDEFINED 指定视图的算法
SQL SECURITY DEFINER 指定视图查询数据时安全验证方式
CREATE VIEW view_student_course AS ( SELECT * FROM student LEFT JOIN course ON student.id = course.sid);
>SELECT * FROM view_student_course WHERE name="小飞";
+----+--------+-----------+------+--------+
| id | name | course_id | sid | sname |
+----+--------+-----------+------+--------+
| 1 | 小飞 | 1 | 1 | 语文 |
+----+--------+-----------+------+--------+
INSERT INTO student VALUES(5, "小刘", 5);
>SELECT * FROM view_student_course WHERE name="小刘";
+----+--------+-----------+------+-------+
| id | name | course_id | sid | sname |
+----+--------+-----------+------+-------+
| 5 | 小刘 | 5 | 5 | |
+----+--------+-----------+------+-------+
>SHOW TABLE STATUS WHERE COMMENT="view"\G
>SHOW CREATE VIEW view_student_course \G
ALTER VIEW view_student_course AS (SELECT * FROM product);
>SELECT * FROM view_student_course;
+------+-----------------+-------+-------------+
| pid | pname | price | category_id |
+------+-----------------+-------+-------------+
| 1 | 联想 | 5018 | c001 |
DROP VIEW view_name;