视图是表的一个映射,是一张虚表,在结构上视图和普通的表没什么区别,一样可以用sql语句来增删改查;

视图创建后是一直存在数据库内

操作

创建视图

语法

  1. CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
  2. VIEW 视图名 [(字段清单)]
  3. AS SELECT 语句
  4. [WITH [CASCADED|LOCAL] CHECK OPTION];
  • algorithm表示视图选择的算法(可选参数)

    • Merge: 当引用视图时,引用视图的sql语句与定义sql视图的语句合并(相当于只存储了sql).
    • Temptable:当引用视图时,根据视图的创建语句建立一个临时表.该临时表是一直存储在mysql数据库中的,除非认为删除;
    • Undefined(默认):未定义,自动,让系统帮你选.

Merge

  1. -- Merge,意味着视图只是一个规则,语句规则, 当查询视图时,把查询视图的语句(比如where那些)与创建时的语句where子句等合并,分析.再形成一条新的select语句.
  2. -- 创建视图的语句:
  3. CREATE altorethm=merge VIEW `g2` AS SELECT `goods_id`,`cat_id`,`goods_name`,`shop_price` FROM `goods` ORDER BY `cat_id` ASC,`shop_price` DESC;
  4. --查询视图的语句:
  5. SELECT * FROM `g2` GROUP BY `cat_id`;
  6. -- 最终执行的语句:
  7. SELECT `goods_id`,`cat_id`,`goods_name`,`shop_price` FROM `goods` GROUP BY `cat_id` ORDER BY `cat_id` ASC,`shop_price` DESC;

temptable

  1. -- temptable是根据创建语句瞬间创建一张临时表,然后查询视图的语句从该临时表查数据.
  2. CREATE ALTORETHM=TEMPTABLE VIEW `g2` AS SELECT `goods_id`,`cat_id`,`goods_name`,`shop_price` FROM `goods` ORDER BY `cat_id` ASC,`shop_price` DESC;
  3. -- 查询视图的语句:
  4. SELECT * FROM `g2` GROUP BY `cat_id`;
  5. -- 最终执行的2句话: 取数据并放在临时表,然后去查临时表.
  • 字段清单表示视图中的列名,默认与SELECT查询结果中的列名相同(可选参数)
  • WITH CHECK OPTION表示更新视图时要保证在该试图的权限范围之内(可选参数)注意,with check option对于没有where条件的视图不起作用的
    • CASCADED:更新视图时要满足所有相关视图和表的条件,创建试图时最好加上WITH CASCADED CHECK OPTION参数,这种方式比较严格,可以保证数据的安全性;cascaded是 WITH CHECK OPTION的默认值
    • LOCAL:更新视图时,要满足该视图本身定义的条件即可

with [cascaded] check option

  1. mysql> create view v1 as
  2. select * from goods where stock > 100 WITH check OPTION; -- 使用了with check option 这个选项那后面对视图的插入只限于包含stock的表;
  3. Query OK, 0 rows affected
  4. -- ↓↓ 只允许插入包含stock字段的sql
  5. mysql> INSERT into v1(gname) values('zhouzhou');
  6. 1369 - CHECK OPTION failed 'test.v1'
  7. mysql> INSERT into v1(gname,stock) values('zhouzhou',8000);
  8. Query OK, 1 row affected
  9. -- ↓↓ 不影响删除
  10. mysql> delete from v1 where gname = 'ganggang';
  11. Query OK, 2 rows affected
  12. -- ↓↓ 貌似也不影响更新
  13. mysql> update v1 set gname = 'test' where gid = 11;
  14. Query OK, 1 row affected
  15. Rows matched: 1 Changed: 1 Warnings: 0
  16. -- 其实错误,因为更新后查询出来的表字段里面能查询到stock > 100;所以可以更新;
  17. -- ↓↓ 如果更新后的结构不能再通过stock>100来查询就不能进行更新;
  18. mysql> update v1 set stock = 99;
  19. 1369 - CHECK OPTION failed 'test.v1'

with local check option

以后研究... wait for

Example1: 单表创建视图

  1. CREATE VIEW v1 AS
  2. SELECT
  3. user_id, nickname, IF (sex = 1, '男', '女') as sex, user_money
  4. FROM
  5. users
  6. ORDER BY
  7. user_money DESC
  8. LIMIT 10;
  9. -- question: 该视图不能被更新?
  10. update v1 set user_money=5000 where user_id = 2659;
  11. [Err] 1288 - The target table v2 of the UPDATE is not updatable

Example1: 多表创建视图

  1. CREATE VIEW v3 AS
  2. SELECT
  3. u.user_id,
  4. nickname,
  5. lhmoney,
  6. user_recommend,
  7. goods
  8. FROM
  9. users AS u
  10. JOIN COMMENT AS c ON u.user_id = c.user_id
  11. ORDER BY
  12. user_id ASC WITH CASCADED CHECK OPTION;

创建视图时注意:

[Err] 1349 - View's SELECT contains a subquery in the FROM clause -- 不能在SELECT的FROM子句中包含子查询。

删除视图

  1. mysql> drop view v1; -- drop view 视图名;
  2. Query OK, 0 rows affected

修改视图

CREATE OR REPLACE VIEW 修改视图

CREATE OR REPLACE语句非常灵活,在视图存在的情况下可对视图进行修改,视图不在的情况下可创建视图,其基本用法和CREATE VIEW 几乎一致

  1. CREATE OR REPLACE ALGORITHM=TEMPTABLE
  2. VIEW v2(uid,nickname,money) AS
  3. SELECT
  4. user_id,
  5. nickname,
  6. user_money
  7. FROM
  8. users
  9. ORDER BY
  10. user_money DESC
  11. LIMIT 10;

ALTER VIEW 修改视图

  1. AlTER VIEW
  2. v3(uid,cid,nickname,lhb,content,goods) AS
  3. SELECT
  4. u.user_id,
  5. user_comment_id,
  6. nickname,
  7. lhmoney,
  8. user_recommend,
  9. goods
  10. FROM
  11. users AS u
  12. JOIN COMMENT AS c ON u.user_id = c.user_id
  13. ORDER BY
  14. user_id ASC WITH CASCADED CHECK OPTION;

关于更新视图数据

视图是表的查询结果映射,那原表的数据改变了,视图也当然会跟着做相应的改变。

但,如果视图里面的数据改变了呢?

首先,视图增删改是会影响表的;也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。但是,视图并不是总是能增删改的。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

  • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION或UNION ALL
  • 位于选择列表中的子查询
  • Join
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表。
  • 仅引用文字值(在该情况下,没有要更新的基本表)。
  • ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
  1. mysql> update v4 set sex=5 where user_id = 32; -- 一定程度上保证了基表数据的安全性
  2. 1288 - The target table v4 of the UPDATE is not updatable

关于视图的可插入性:insert

如果视图满足关于视图列的下述额外要求,可更新的视图也是可插入的:

  • 不得有重复的视图列名称。
  • 视图必须包含没有默认值的基表中的所有列。
  • 视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:
  • 3.14159
  • col1 + 3
  • UPPER(col2)
  • col3 / col4
  • (subquery)

查看视图

  • 查看视图数据与查看普通表一样
  • 查看视图字段结构
  1. mysql> describe v3;
  2. +----------------+-------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------------+-------------+------+-----+---------+-------+
  5. | user_id | int(11) | NO | | 0 | |
  6. | nickname | varchar(25) | NO | | | |
  7. | lhmoney | int(11) | NO | | 0 | |
  8. | user_recommend | longtext | YES | | NULL | |
  9. | goods | int(10) | NO | | 0 | |
  10. +----------------+-------------+------+-----+---------+-------+
  • 查看视图基本信息
  1. mysql> show table status like 'v3'\G -- 该命令与查看普通表的命令是一样的,而此处大多数为NULL正是证明视图是一张虚表;
  2. *************************** 1. row ***************************
  3. Name: v3
  4. Engine: NULL
  5. Version: NULL
  6. Row_format: NULL
  7. Rows: NULL
  8. Avg_row_length: NULL
  9. Data_length: NULL
  10. Max_data_length: NULL
  11. Index_length: NULL
  12. Data_free: NULL
  13. Auto_increment: NULL
  14. Create_time: NULL
  15. Update_time: NULL
  16. Check_time: NULL
  17. Collation: NULL
  18. Checksum: NULL
  19. Create_options: NULL
  20. Comment: VIEW
  21. 1 row in set (0.01 sec)
  22. mysql> show table status like 'users'\G
  23. *************************** 1. row ***************************
  24. Name: users
  25. Engine: InnoDB
  26. Version: 10
  27. Row_format: Compact
  28. Rows: 171650
  29. Avg_row_length: 82
  30. Data_length: 14172160
  31. Max_data_length: 0
  32. Index_length: 11567104
  33. Data_free: 66060288
  34. Auto_increment: 169781
  35. Create_time: 2015-05-01 23:03:29
  36. Update_time: NULL
  37. Check_time: NULL
  38. Collation: utf8_general_ci
  39. Checksum: NULL
  40. Create_options:
  41. Comment: 用户信息表
  42. 1 row in set (0.01 sec)
  • 查看视图详细信息
  1. mysql> show create view v3\G
  2. *************************** 1. row ***************************
  3. View: v3
  4. Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIE
  5. W `v3` AS select `u`.`user_id` AS `user_id`,`u`.`nickname` AS `nickname`,`u`.`lhmoney` AS `lhmoney`,
  6. `c`.`user_recommend` AS `user_recommend`,`c`.`goods` AS `goods` from (`users` `u` join `comment` `c`
  7. on((`u`.`user_id` = `c`.`user_id`))) order by `u`.`user_id` WITH CASCADED CHECK OPTION
  8. character_set_client: utf8
  9. collation_connection: utf8_general_ci
  10. 1 row in set (0.01 sec)
  • 在information_schema的views表中查看视图详细信息;
  1. mysql> SELECT * FROM information_schema.views\G
  2. *************************** 1. row ***************************
  3. TABLE_CATALOG: def
  4. TABLE_SCHEMA: test
  5. TABLE_NAME: v1
  6. VIEW_DEFINITION: select `test`.`users`.`user_id` AS `user_id`,`test`.`users`.`nickname` AS `nic
  7. kname`,if((`test`.`users`.`sex` = 1),'男','女') AS `sex`,`test`.`users`.`user_money` AS `user_money`
  8. from `test`.`users` order by `test`.`users`.`user_money` desc limit 10
  9. CHECK_OPTION: NONE
  10. IS_UPDATABLE: NO
  11. DEFINER: root@localhost
  12. SECURITY_TYPE: DEFINER
  13. CHARACTER_SET_CLIENT: utf8
  14. COLLATION_CONNECTION: utf8_general_ci

information_schema是Mysql自带的一个数据库,详细请参考我的另外一边博文《探寻mysql自带的数据库》

作用

  1. 可以简化查询,我们把复杂而又频繁的查询先存储为视图,下次查询的时候,直接在这个视图里面找;

  2. 可以进行权限控制,Mysql的权限可以精确到表,但不能精确到列,但可以把表的权限封闭,另外创建一个视图,该视图中就是只存储开放了相应的权限列;

  3. 大数据分表时可以用到:

    比如,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成4张表来存放.

    思路1:

    News表,分成四表,每表给一个id

    Newsid, 1,2,3,4

    News1,news2,news3,news4表

    把一张表的数据分散到4张表里,分散的方法很多,

    最常用可以用id取模来计算.

    Id%4+1 = [1,2,3,4]

    比如

    1. $_GET['id'] = 17,
    2. 17%4 + 1 = 2,
    3. $tableName = 'news'.'2'
    4. Select * from news2 where id = 17;

思路2:

还可以用视图, 把4张表形成一张视图

Create view news as select from n1 union select from n2 union.........

【mysql的编程专题⑥】视图的更多相关文章

  1. 【mysql的编程专题⑤】自定义函数

    用户自定义函数(user-defined function,UDF) 是一种对mysql的扩展途径,其用法与内置函数相同 创建自定义函数 语法 create function function_nam ...

  2. 【mysql的编程专题④】存储过程

    类似函数,但是没有返回值,把sql进行封装,便于多次使用或多种应用程序共享使用.不能用在SQL语句中,只能使用CALL调用; 创建存储过程 语法 CREATE PROCEDURE sp_name ([ ...

  3. 【mysql的编程专题③】内置函数

    数学函数 常用 abs(x) 返回x的绝对值 floor(x) 返回小于x的最大整数值 mod(x,y) 返回x/y的模(余数) rand() 返回0到1内的随机值,可以通过提供一个参数(种子)使ra ...

  4. 【mysql的编程专题】触发器

    类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql; 一个触发器要具备4要素: 1.监视地点 -- 要执行触发器的表 2.监视事件 -- 由什么DML事件来牵引 3.触发 ...

  5. 【mysql的编程专题①】流程控制与其他语法

    流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中; 如果用在select上就会随着query出来的row来隐式迭代; 注释与语句结束符 语句结束符 默认有两 ...

  6. 《MySQL 存储过程编程》-读书笔记

    本书结构: 第一部分:存储编程基础 第1章:存储过程程序基础 第2章:MySQL存储编程指南 第3章:语言基础 第4章:语句块 第5章:在存储程序中使用SQL 第一章:MySQL存储程序介绍 存储程序 ...

  7. MySql数据库连接池专题

    MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html

  8. 知识点:Mysql 基本用法之视图

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时 ...

  9. 使用C语言调用mysql数据库编程实战以及技巧

    今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...

随机推荐

  1. springMVC+Hibernate常用的配置文件

    每次写一个新的web项目时都要写配置文件.比较麻烦,现在把常用到的配置文件记录下来,方便以后使用 web.xml <?xml version="1.0" encoding=& ...

  2. 内存管理算法--Buddy伙伴算法

    Buddy算法的优缺点: 1)尽管伙伴内存算法在内存碎片问题上已经做的相当出色,但是该算法中,一个很小的块往往会阻碍一个大块的合并,一个系统中,对内存块的分配,大小是随机的,一片内存中仅一个小的内存块 ...

  3. POJ 3928 Ping pong

    题目链接:http://poj.org/problem?id=3928 乒乓比赛,有N个人参加,输入每个玩家的技能等级,对每个人设置一个特定ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判 ...

  4. vim 跳转命令

    基本跳转: hjkl:左下上右 HML:当前屏幕顶.中.底部 web:下一单词词首.下一单词词尾.前一单词词首 gg:文件首  G:文件末尾  ngg/nG:第n行 ta:移动到所在行之后第一个字符a ...

  5. 印象笔记无法同步问题解决 Unable to send HTTP request: 12029

    问题 今天突然发现本地软件不能访问网络. 包括: 印象笔记无法同步, 搜狗输入法无法登陆. 但其它上网正常. 思路及解决过程 因为chrome上网 ,qq上网均正常. 且同事可以正常使用. 推测是本地 ...

  6. JSONP VS CORS

    What is JSONP ? http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about What is CORS? htt ...

  7. Knockout.js 初探

    Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的 ...

  8. √GMAP.NET 地图

    深入理解最强桌面地图控件GMAP.NET ---[更新]百度地图 enjoyeclipse 2013-11-18 22:23 阅读:3897 评论:20     深入理解最强桌面地图控件GMAP.NE ...

  9. JS中的!=、== 、!==、===的用法和区别。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var num = 1;   var str = '1';   var test = 1;   t ...

  10. 九度OJ1172--哈夫曼树

    哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入: 输入有多组数据.每 ...