一,视图:是指将一张表或者多张表中的某些想要的字段单独提取出来组成的新表,视图是建立在其引用表上的,所有视图表是虚表,视图中的字段可以有两种方式得到;
1,直接引用原表中的字段(这种引用方式会对原表数据和视图表数据的安全性都产生影响,无论是原表还是视图中的数据发生改变那么另一个表中的数据也将一同改变);
2,通过引用原表中的单个或多个字段在经过一定的计算或组合而得到新的字段(这种引用方式可以对原表中的数据起到一定的保护作用(删除除外))
mysql> select * from score;
+----+------+---------+---------+------+------+
| id | math | chinses | english | mul | s_id |
+----+------+---------+---------+------+------+
| 1 | 98 | 88 | 79 | 288 | 1 |
| 2 | 78 | 89 | 69 | 308 | 3 |
| 3 | 98 | 95 | 99 | 398 | 2 |
| 4 | 78 | 88 | 79 | 210 | 4 |
| 5 | 79 | 68 | 69 | 268 | 5 |
+----+------+---------+---------+------+------+
5 rows in set (0.00 sec)
//创建视图
mysql> create view sc_view(学生id,总分,综合,主科) as /其中学生id是直接引用score表中的id字段,而其他字段都是通过一定的运算后得到的
->select id,math+chinses+english+mul, /当对sc_view视图的学生id进行修改时,score表的id字段也将一起被改变,反之也有相同的结果
->mul+0,math+chinses+english from score; /但是对sc_view视图中除学生id以外的其他字段进行修改时,都会失败,
Query OK, 0 rows affected (0.00 sec) /但是通过修改score表中的字段时将会影响到sc_view视图表的字段(从而对score表数据起到保护的作用) mysql> select * from sc_view; +--------+------+------+------+ | 学生id | 总分 | 综合 | 主科 | +--------+------+------+------+ | 1 | 553 | 288 | 265 | | 2 | 544 | 308 | 236 | | 3 | 690 | 398 | 292 | | 4 | 455 | 210 | 245 | | 5 | 484 | 268 | 216 | +--------+------+------+------+ 5 rows in set (0.00 sec)
//查看视图
desc sc_view; //查看视图结构
show create view sc_view; //查看视图创建语句
mysql> show table status like 'sc_view';//--虚拟表(查看视图信息)*注意两张信息表的区别*
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| sc_view | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | VIEW |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)
mysql> show table status like 'score';//--真实表(查看表信息)
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| score | InnoDB | 10 | Dynamic | 3 | 5461 | 16384 | 0 | 16384 | 0 | 6 | 2017-06-05 10:35:56 | 2017-06-05 16:16:44 | NULL | utf8_general_ci | NULL | | |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)
//视图修改(表数据修改)
mysql> update sc_view set 综合=250 where 学生id=4; //(数据修改)因为sc_view中的‘综合’字段是score中的mul字段通过‘mul+0’得到的,所有在sc_view中不能修改‘综合’字段
ERROR 1348 (HY000): Column '综合' is not updatable
mysql> update score set mul=230 where id=4; //(数据修改)修改score表中的mul字段影响到了sc_view表中的‘综合’字段
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from score;
+----+------+---------+---------+------+------+
| id | math | chinses | english | mul | s_id |
+----+------+---------+---------+------+------+
| 1 | 98 | 88 | 79 | 288 | 1 |
| 2 | 78 | 89 | 69 | 308 | 3 |
| 3 | 98 | 95 | 99 | 398 | 2 |
| 4 | 78 | 88 | 79 | 230 | 4 |
| 5 | 79 | 68 | 69 | 268 | 5 |
+----+------+---------+---------+------+------+
5 rows in set (0.00 sec)
mysql> select * from sc_view;
+--------+------+------+------+
| 学生id | 总分 | 综合 | 主科 |
+--------+------+------+------+
| 1 | 553 | 288 | 265 |
| 2 | 544 | 308 | 236 |
| 3 | 690 | 398 | 292 |
| 4 | 475 | 230 | 245 |
| 5 | 484 | 268 | 216 |
+--------+------+------+------+
5 rows in set (0.00 sec)
//(修改视图字段)不能通过add drop等添加或删除字段,只能通过替换整张视图的方式来达到增加或删除字段的效果
mysql> alter view sc_view(学生id,总分,综合,主科) as select id,math+chinses+english+mul,mul,
-> math+chinses+english from score;
Query OK, 0 rows affected (0.00 sec)
//上下两种方式等效
mysql> create or replace view sc_view(学生id,总分,综合,主科) as select id,math+chinses+english+mul,mul+0,
-> math+chinses+english from score;
Query OK, 0 rows affected (0.00 sec)
//视图的删除(视图数据的删除)
mysql> select * from sc_view; //原视图数据
+--------+------+------+------+
| 学生id | 总分 | 综合 | 主科 |
+--------+------+------+------+
| 1 | 553 | 288 | 265 |
| 2 | 544 | 308 | 236 |
| 3 | 690 | 398 | 292 |
| 4 | 496 | 230 | 266 |
| 5 | 484 | 268 | 216 |
+--------+------+------+------+
5 rows in set (0.00 sec)
mysql> delete from sc_view where 主科=236; //删除视图中指定的数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from sc_view; //删除数据后的视图
+--------+------+------+------+
| 学生id | 总分 | 综合 | 主科 |
+--------+------+------+------+
| 1 | 553 | 288 | 265 |
| 3 | 690 | 398 | 292 |
| 4 | 496 | 230 | 266 |
| 5 | 484 | 268 | 216 |
+--------+------+------+------+
4 rows in set (0.00 sec)
//视图的删除(视图整张表的删除)
mysql> select * from sc_view; //删除视图前
+--------+------+------+------+
| 学生id | 总分 | 综合 | 主科 |
+--------+------+------+------+
| 1 | 553 | 288 | 265 |
| 3 | 690 | 398 | 292 |
| 5 | 484 | 268 | 216 |
+--------+------+------+------+
3 rows in set (0.00 sec)
mysql> drop view if exists sc_view; //删除视图前先对视图进行了判断
Query OK, 0 rows affected (0.00 sec)
mysql> select * from sc_view; //删除视图后再查看 提示不存在
ERROR 1146 (42S02): Table 'gaokao.sc_view' doesn't exist
使用视图的理由是什么?
1、安全性:一般是这样做的:创建一个视图,定义好该视图所操作的数据。
之后将用户权限与视图绑定,这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。
2、查询性能提高
3、有灵活性的功能需求后,需要改动表的结构而导致工作量比较大,那么可以使用虚拟表的形式达到少修改的效果。
这是在实际开发中比较有用的
4、复杂的查询需求,可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。