MySQL教程 MySQL教程MySQL 连接MySQL 查看数据库MySQL 创建数据库MySQL 修改数据库MySQL 删除数据库MySQL 选择数据库MySQL 数据类型MySQL存储引擎MySQL 数据表的增删改查MySQL 表数据增删改查操作MySQL 条件子句MySQL 清空表记录MySQL 模糊查询MySQL 处理重复数据MySQL 别名MySQL 限制查询结果数量Mysql 查询结果排序MySQL 范围查询MySQL 空值查询MySQL 查询结果合拼MySQL 分组MySQL 筛选分组MySQL 表连接MySQL NULL值处理MySQL 子查询MySQL 正则表达式MySQL 视图MySQL 索引MySQL 事务MySQL 数据库备份(导出)/还原(导入)MySQL安装 MySQL Windows版下载教程MySQL windows系统安装教程MySQL windows系统简单的安装教程MySQL Linux系统安装教程MySQL Linux系统下载教程MySQL Linux系统简单的安装教程配置MySQL环境变量

MySQL 视图

MySQL 视图是一种虚拟表,它是由查询结果集构成的表。视图并不存储实际的数据,而是存储了查询语句和查询结果集的定义。当用户查询视图时,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查看视图

查看视图结构

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 |
+-----+-----------+------+-----+-----------+--------+-------+

MySQL修改视图结构

修改视图结构

修改结构使用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 |
+-----+-----------+------+-----+-----------+--------+-------+

MySQL删除视图

删除单表视图数据

使用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