MySQL 视图是一种虚拟表,它是由查询结果集构成的表。视图并不存储实际的数据,而是存储了查询语句和查询结果集的定义。当用户查询视图时,MySQL 会执行视图定义中的查询语句,并返回查询结果集作为视图的结果。视图可以看作是一个封装了查询语句的窗口,通过这个窗口可以方便地查询和操作数据库中的数据。以下会通过视图的创建、查看、修改、删除进行举例。
这是详细信息得内容。
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`sex` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三名', '男');
INSERT INTO `student` VALUES ('2', '李四浩', '男');
INSERT INTO `student` VALUES ('3', '王五期', '女');
INSERT INTO `student` VALUES ('5', '三七熊', '女');
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`studentid` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '1', '语文', '81');
INSERT INTO `course` VALUES ('2', '1', '数学', '74');
INSERT INTO `course` VALUES ('3', '1', '英语', '56');
INSERT INTO `course` VALUES ('4', '2', '语文', '71');
INSERT INTO `course` VALUES ('5', '2', '数学', '77');
INSERT INTO `course` VALUES ('6', '2', '英语', '66');
INSERT INTO `course` VALUES ('7', '3', '语文', '61');
INSERT INTO `course` VALUES ('8', '3', '数学', '87');
INSERT INTO `course` VALUES ('9', '3', '英语', '86');
INSERT INTO `course` VALUES ('10', '4', '语文', '71');
INSERT INTO `course` VALUES ('11', '4', '数学', '57');
INSERT INTO `course` VALUES ('12', '4', '英语', '76');mysql> CREATE VIEW `NewStudent`AS -> SELECT student.id AS sid,student.`name` FROM student; Query OK, 0 rows affected (0.04 sec)
mysql> CREATE VIEW `NewView`AS -> SELECT student.id AS sid,student.`name`,student.sex,course.id AS cid,course.studentid,course.`name` AS cname,course.score FROM student -> INNER JOIN course ON student.id = course.studentid ; Query OK, 0 rows affected (0.03 sec)
其中,CREATE VIEW语句用于创建视图,newview是视图的名称,AS关键字后面是视图的定义,即查询语句。SELECT子句用于指定视图中包含的列,FROM子句用于指定视图的数据源表,INNER JOIN子句用于关联两表的条件。
mysql> DESCRIBE NewView; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | sid | int(11) | NO | | 0 | | | name | varchar(50) | YES | | NULL | | | sex | varchar(11) | YES | | NULL | | | cid | int(11) | NO | | 0 | | | studentid | int(11) | YES | | NULL | | | cname | varchar(255) | YES | | NULL | | | score | int(11) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+
或者
mysql> DESC NewView; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | sid | int(11) | NO | | 0 | | | name | varchar(50) | YES | | NULL | | | sex | varchar(11) | YES | | NULL | | | cid | int(11) | NO | | 0 | | | studentid | int(11) | YES | | NULL | | | cname | varchar(255) | YES | | NULL | | | score | int(11) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+
DESCRIBE/DESC 除了可以查询视图的结构,同样也可以查询表的结构
mysql> select * from newview; +-----+-----------+------+-----+-----------+--------+-------+ | sid | name | sex | cid | studentid | cname | score | +-----+-----------+------+-----+-----------+--------+-------+ | 1 | 张三名 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三名 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三名 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | +-----+-----------+------+-----+-----------+--------+-------+
修改结构使用ALTER VIEW 语句修改,ALTER VIEW语句不能修改视图的名称。
mysql> ALTER VIEW `newstudent`AS -> SELECT student.id,student.`name` FROM student ; Query OK, 0 rows affected (0.04 sec)
修改视图名称使用 RENAME TABLE语句修改。
mysql> rename table newstudent to studentview; Query OK, 0 rows affected (0.06 sec)
修改单表数据会改变原表的数据(其他已经创建关联到原表的数据也会改变),先看原本表数据和视图数据。
mysql> select * from student; +----+-----------+------+ | id | name | sex | +----+-----------+------+ | 1 | 张三名 | 男 | | 2 | 李四浩 | 男 | | 3 | 王五期 | 女 | +----+-----------+------+ mysql> select * from studentview; +----+-----------+ | id | name | +----+-----------+ | 1 | 张三名 | | 2 | 李四浩 | | 3 | 王五期 | +----+-----------+
使用 update 语句更新id为1的name列为“张三”数据。
mysql> update studentview set name='张三' where id=1; Query OK, 1 row affected (0.07 sec)
mysql> select * from studentview; +----+-----------+ | id | name | +----+-----------+ | 1 | 张三 | | 2 | 李四浩 | | 3 | 王五期 | +----+-----------+ mysql> select * from student; +----+-----------+------+ | id | name | sex | +----+-----------+------+ | 1 | 张三 | 男 | | 2 | 李四浩 | 男 | | 3 | 王五期 | 女 | +----+-----------+------+ mysql> select * from newview; +-----+-----------+------+-----+-----------+--------+-------+ | sid | name | sex | cid | studentid | cname | score | +-----+-----------+------+-----+-----------+--------+-------+ | 1 | 张三 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | +-----+-----------+------+-----+-----------+--------+-------+
注意:在关联多表时修改数据不起作用。
mysql> update newview set name='张三三' where sid=1; Query OK, 0 rows affected (0.02 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> select * from newview; +-----+-----------+------+-----+-----------+--------+-------+ | sid | name | sex | cid | studentid | cname | score | +-----+-----------+------+-----+-----------+--------+-------+ | 1 | 张三 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | +-----+-----------+------+-----+-----------+--------+-------+
使用DELETE 语句删除视图数据,和修改电表一样,同样可以删除视图数据和影响原表数据和其他关联原表的视图。
mysql> delete from studentview where id=3; Query OK, 1 row affected (0.04 sec)
mysql> select * from studentview; +----+-----------+ | id | name | +----+-----------+ | 1 | 张三1 | | 2 | 李四浩 | +----+-----------+ mysql> select * from student; +----+-----------+------+ | id | name | sex | +----+-----------+------+ | 1 | 张三1 | 男 | | 2 | 李四浩 | 男 | +----+-----------+------+ mysql> select * from newview; +-----+-----------+------+-----+-----------+--------+-------+ | sid | name | sex | cid | studentid | cname | score | +-----+-----------+------+-----+-----------+--------+-------+ | 1 | 张三1 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三1 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三1 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | +-----+-----------+------+-----+-----------+--------+-------+
删除关联多表的视图数据会报错
mysql> delete from newview where cid=1; ERROR 1395 (HY000): Can not delete from join view 'test.newview'
DROP VIEW语句删除视图只是删除这视图,不影响原表。
mysql> DROP VIEW newview; Query OK, 0 rows affected (0.01 sec) mysql> select * from newview; ERROR 1146 (42S02): Table 'test.newview' doesn't exist