MySQL知识(十七)——视图
来源:互联网 发布:硅谷密探软件 编辑:程序博客网 时间:2024/05/29 03:35
1 视图概述
1.1 视图的含义
视图是从一个或者多个表中导出的,也可以从已经存在的视图基础上定义,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。视图可以使用户操作方便,而且可以保障数据库系统的安全。
视图一经定义便存储在数据库中,与其相应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
1.2 视图的作用
与直接从数据表中读取相比,视图有以下优点:
(1)简单化
视图呈现的数据就是需要的。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
(2)安全性
通过视图用户只能查询和修改他们所能见到的数据。
(3)逻辑数据独立性
视图可以帮助用户屏蔽真实表结构变化带来的影响。
2 创建视图
2.1 语法形式
创建视图使用CREATE VIEW语句:
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEW view_name[(column_list)]AS SELECT_statement[WITH [CASCADED|LOCAL] CHECK OPTION]]
- CREATE:创建新的视图
- REPLACE:替换已经创建的视图
- ALGORITHM:视图选择的算法
- view_name:视图名称
- column_list:属性列
- SELECT_statement:SELECT语句
WITH [CASCADED|LOCAL] CHECK OPTION:视图在更新时保证在视图的权限范围之内
ALGORITHM有3个取值:
UNDEFINED:MySQL自动选择算法;
MERGE:将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分
TEMPTABLE:将视图的结果存入临时表,然后用临时表来执行语句CASCADED与LOCAL为可选参数:
CASCADED为默认值,表示更新视图时要满足所有相关视图和表的条件;
LOCAL:更新视图满足该视图本省定义的条件即可
2.2 在单表上创建视图
mysql> CREATE TABLE t(quantity INT,price INT);Query OK, 0 rows affectedmysql> INSERT INTO t VALUES(3,50);Query OK, 1 row affectedmysql> CREATE VIEW view_t AS SELECT quantity,price,quantity*price FROM t;Query OK, 0 rows affectedmysql> SELECT * FROM view_t;+----------+-------+----------------+| quantity | price | quantity*price |+----------+-------+----------------+| 3 | 50 | 150 |+----------+-------+----------------+1 row in set
可以指定视图字段的名称:
mysql> CREATE VIEW view_t2(qty,price,total) AS SELECT quantity,price,quantity*price FROM t;Query OK, 0 rows affectedmysql> SELECT * FROM view_t2;+-----+-------+-------+| qty | price | total |+-----+-------+-------+| 3 | 50 | 150 |+-----+-------+-------+1 row in set
2.3 在多表上创建视图
(1)创建student表和stu_info表,并插入数据
mysql> CREATE TABLE student( s_id INT, name VARCHAR(40));Query OK, 0 rows affectedmysql> CREATE TABLE stu_info( s_id INT, glass VARCHAR(40), addr VARCHAR(90));Query OK, 0 rows affectedmysql> INSERT INTO student VALUES(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai'); Query OK, 3 rows affectedRecords: 3 Duplicates: 0 Warnings: 0mysql> INSERT INTO stu_info VALUES(1, 'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong');Query OK, 3 rows affectedRecords: 3 Duplicates: 0 Warnings: 0
(2)创建视图
mysql> CREATE VIEW stu_glass(id,name,glass) -> AS SELECT student.s_id,student.name,stu_info.glass -> FROM student,stu_info -> WHERE student.s_id=stu_info.s_id;Query OK, 0 rows affectedmysql> SELECT * FROM stu_glass;+----+----------+--------+| id | name | glass |+----+----------+--------+| 1 | wanglin1 | wuban || 2 | gaoli | liuban || 3 | zhanghai | qiban |+----+----------+--------+3 rows in set
3 查看视图
3.1 DESCRIBE或DESC
mysql> DESC view_t;+----------------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------------+------------+------+-----+---------+-------+| quantity | int(11) | YES | | NULL | || price | int(11) | YES | | NULL | || quantity*price | bigint(21) | YES | | NULL | |+----------------+------------+------+-----+---------+-------+3 rows in set
3.2 SHOW TABLE STATUS
mysql> SHOW TABLE STATUS LIKE 'view_t' \G;*************************** 1. row *************************** Name: view_t Engine: NULL Version: NULL Row_format: NULL Rows: NULL Avg_row_length: NULL Data_length: NULLMax_data_length: NULL Index_length: NULL Data_free: NULL Auto_increment: NULL Create_time: NULL Update_time: NULL Check_time: NULL Collation: NULL Checksum: NULL Create_options: NULL Comment: VIEW1 row in set (0.00 sec)
Comment值为VIEW说明表为视图,其他信息为NULL说明这是一个虚表。
3.3 SHOW CREATE VIEW
mysql> SHOW CREATE VIEW view_t \G;*************************** 1. row *************************** View: view_t Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity*price` from `t`character_set_client: utf8collation_connection: utf8_general_ci1 row in set (0.00 sec)
3.4 在views表中查看
在MySQL中,information_schema数据库下的views表中存储了所有视图的定义。
SELECT * FROM information_schema.views;
4 修改视图
修改数据库中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性。
4.1 CREATE OR REPLACE VIEW语句
修改视图的语句和创建视图的语句是完全一样的。
mysql> DESC view_t;+----------------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------------+------------+------+-----+---------+-------+| quantity | int(11) | YES | | NULL | || price | int(11) | YES | | NULL | || quantity*price | bigint(21) | YES | | NULL | |+----------------+------------+------+-----+---------+-------+3 rows in setmysql> CREATE OR REPLACE VIEW view_t AS SELECT * FROM t;Query OK, 0 rows affectedmysql> DESC view_t;+----------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+---------+------+-----+---------+-------+| quantity | int(11) | YES | | NULL | || price | int(11) | YES | | NULL | |+----------+---------+------+-----+---------+-------+2 rows in set
4.2 ALTER语句
语法跟创建视图的语句一样,只是将”CREATE OR REPLACE VIEW”改为”ALTER”。
mysql> ALTER VIEW view_t AS SELECT quantity FROM t;Query OK, 0 rows affectedmysql> DESC view_t;+----------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+---------+------+-----+---------+-------+| quantity | int(11) | YES | | NULL | |+----------+---------+------+-----+---------+-------+1 row in set
5 更新视图
更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对基本表增加或删除记录。
5.1 UPDATE语句
对视图更新,基本表的内容也会更新。
mysql> SELECT * FROM view_t;+----------+| quantity |+----------+| 3 |+----------+1 row in setmysql> SELECT * FROM t;+----------+-------+| quantity | price |+----------+-------+| 3 | 50 |+----------+-------+1 row in setmysql> UPDATE view_t SET quantity=5;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM t;+----------+-------+| quantity | price |+----------+-------+| 5 | 50 |+----------+-------+1 row in setmysql> SELECT * FROM view_t;+----------+| quantity |+----------+| 5 |+----------+1 row in setmysql> SELECT * FROM view_t2;+-----+-------+-------+| qty | price | total |+-----+-------+-------+| 5 | 50 | 250 |+-----+-------+-------+1 row in set
5.2 INSERT语句
对基本表进行插入数据,视图的内容也会跟着更新。(不能对视图进行插入操作)
mysql> INSERT INTO t VALUES(9,9);Query OK, 1 row affectedmysql> SELECT * FROM t;+----------+-------+| quantity | price |+----------+-------+| 5 | 50 || 9 | 9 |+----------+-------+2 rows in setmysql> SELECT * FROM view_t2;+-----+-------+-------+| qty | price | total |+-----+-------+-------+| 5 | 50 | 250 || 9 | 9 | 81 |+-----+-------+-------+2 rows in set
5.3 DELETE语句
删除视图的数据,相应的基本表的记录也会删除。
mysql> DELETE FROM view_t2 WHERE price=9;Query OK, 1 row affectedmysql> SELECT * FROM view_t2;+-----+-------+-------+| qty | price | total |+-----+-------+-------+| 5 | 50 | 250 |+-----+-------+-------+1 row in setmysql> SELECT * FROM t;+----------+-------+| quantity | price |+----------+-------+| 5 | 50 |+----------+-------+1 row in set
5.4 不能执行更新的视图
(1)视图中不包含基本表中被定义为非空的列
(2)在定义视图的SELECT语句后的字段列中使用了数学表达式
(3)在定义视图的SELECT语句后的字段列表中使用聚合函数
(4)在定义视图的SELECT语句中使用了DISTINCT,UNION,TOP,GROUP BY或HAVING子句
6 删除视图
DROP VIEW [IF EXISTS] view_name[,view_name]... [RESTRICT|CASCADE]
例如,删除stu_glass的视图:
mysql> DROP VIEW IF EXISTS stu_glass;Query OK, 0 rows affectedmysql> SHOW CREATE VIEW stu_glass;1146 - Table 'test.stu_glass' doesn't exist
7 视图和表的区别
- MySQL知识(十七)——视图
- Mysql学习笔记十七——表、视图的管理语句
- MySQL视图知识总结
- 篱笆家装宝典之十七——验收知识
- IOS学习(十七)多视图管理
- MySQL高级十七——MySQL账号权限赋予
- MySQL 入门(七)—— 视图
- MySQL 入门(七)—— 视图
- Java知识整理(十七)之Servlet
- MySQL学习笔记—视图
- MySQL知识(三)——数据类型
- MySQL知识(十三)——索引
- Mysql系列(十七)Mysql指令全集
- 十七.知识管理
- MySQL知识(十八)——MySQL触发器
- MySQL知识(二十四)——MySQL日志
- iOS入门(二十七)视图控制器UIViewController
- JavaScript FAQ(十七)——颜色
- 向applicationContext.xml中导入jdbc文件
- 在String 类型数据在转换成其他类型数据的异常处理
- 确定字符互异
- 常见的嵌入式linux学习和如何选择ARM芯片问答
- 一个很简单的聊天室
- MySQL知识(十七)——视图
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 原型链
- IP Address
- PL/SQL之流程控制语句
- 【CI学习笔记】CI显示数据库数据的实例
- PropertyPlaceholderConfigurer实例
- Remove Duplicates from Sorted Array
- 继承HorizonScollView的侧滑菜单实现