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