MySQL View 视图

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

拓展阅读

MySQL View
MySQL truncate table 与 delete 清空表的区别和坑
MySQL Ruler mysql 日常开辟规范
MySQL datetime timestamp 以及如何自动更新,如何实现范围查询
MySQL 06 mysql 如何实现类似 oracle 的 merge into
MySQL 05 MySQL入门教程(MySQL tutorial book)
MySQL 04- EMOJI 表情与 UTF8MB4 的故事
MySQL Expression 1 of ORDER BY clause is not in SELECT list,references column
Mysql View

丑话说在前面,对于企业级项目是不推荐使用视图的。但是东西用在合适的地方就是最好的。
参考资料:
视图简介

一、为何使用视图

  • 安全
用户权限与视图绑定。实际上可以通过shiro或者spring-security控制。

  • 查询性能提高
  • 虚拟表不用修改表布局,可以完成某些业务需求。这一点比较实用。
二、视图的工作机制

  • 视图的工作机制
当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。如许不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是同等的。

  • 如此设计的优点
节流空间。维护好真实表的内容,就可保证视图的完整性。
CRUD

为了测试。创建一个user表。DDL如下:
  1. CREATE TABLE `user` (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,自增',
  3.   `mobile` varchar(20) NOT NULL COMMENT '手机号',
  4.   `password` varchar(64) NOT NULL COMMENT '密码',
  5.   `salt` varchar(128) NOT NULL COMMENT '密码盐',
  6.   `nickname` varchar(32) NOT NULL DEFAULT '' COMMENT '昵称',
  7.   `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除 {0:未删除, 1:已删除}',
  8.   `created_time` datetime NOT NULL COMMENT '创建时间',
  9.   `updated_time` datetime NOT NULL COMMENT '最后更新时间',
  10.   PRIMARY KEY (`id`),
  11.   UNIQUE KEY `id_UNIQUE` (`id`),
  12.   UNIQUE KEY `mobile_UNIQUE` (`mobile`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'
复制代码
数据初始化:
  1. INSERT INTO `user` (mobile, password, salt, nickname, is_deleted, created_time, updated_time) VALUES ('13062666053', 'a7097b4e5fa3c1d1165e66b2d72a2d060f288d64', '649f6afc93874cf8', '某小宝', 0, '2016-09-17 14:08:38', '2016-09-17 14:08:38');
  2. INSERT INTO `user` (mobile, password, salt, nickname, is_deleted, created_time, updated_time) VALUES ('13012345678', '67917009d2faccc292171bb16084d7410616cdcb', '7c3186569813f1c3', '某宝', 0, '2016-09-17 14:08:38', '2016-09-17 14:08:38');
  3. INSERT INTO `user` (mobile, password, salt, nickname, is_deleted, created_time, updated_time) VALUES ('13111111111', '847100b326a0574c0cdcc22483e13cb39accdefd', '48c3e9cfac9ac472', '11', 0, '2016-09-17 18:29:25', '2016-09-17 18:29:25');
  4. INSERT INTO `user` (mobile, password, salt, nickname, is_deleted, created_time, updated_time) VALUES ('13111111112', '1d4fe693d850b2e5de5f348c69bfe15a78249022', 'c1d2a40cd8db1a88', '12', 0, '2016-09-17 18:30:10', '2016-09-17 18:30:10')
复制代码

  • Create
  1. CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  2.     VIEW view_name [(column_list)]
  3.     AS select_statement
  4. [WITH [CASCADED | LOCAL] CHECK OPTION]
复制代码
假设我们只关心用户的信息,如下:
  1. CREATE VIEW v_user_info AS SELECT nickname, mobile, is_deleted FROM `user`;
复制代码

  • Read
视图创建乐成之后,可以像普通表一样对待。
  1. mysql> select * from v_user_info;
  2. +-----------+-------------+------------+
  3. | nickname  | mobile      | is_deleted |
  4. +-----------+-------------+------------+
  5. | 某小宝    | 13062666053 |          0 |
  6. | 某宝      | 13012345678 |          0 |
  7. | 11        | 13111111111 |          0 |
  8. | 12        | 13111111112 |          0 |
  9. +-----------+-------------+------------+
  10. 4 rows in set (0.00 sec)
  11. mysql> desc v_user_info;
  12. +------------+-------------+------+-----+---------+-------+
  13. | Field      | Type        | Null | Key | Default | Extra |
  14. +------------+-------------+------+-----+---------+-------+
  15. | nickname   | varchar(32) | NO   |     |         |       |
  16. | mobile     | varchar(20) | NO   |     | NULL    |       |
  17. | is_deleted | tinyint(4)  | NO   |     | 0       |       |
  18. +------------+-------------+------+-----+---------+-------+
  19. 3 rows in set (0.00 sec)
复制代码

  • Update
对视图的数据修改会直接反应在真实表之上。
  1. mysql> select * from user where nickname='11';
  2. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  3. | id | mobile      | password                                 | salt             | nickname | is_deleted | created_time        | updated_time        |
  4. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  5. |  5 | 13111111111 | 847100b326a0574c0cdcc22483e13cb39accdefd | 48c3e9cfac9ac472 | 11       |          0 | 2016-09-17 18:29:25 | 2016-09-17 18:29:25 |
  6. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> update v_user_info set mobile='10123456789' where nickname='11';
  9. Query OK, 1 row affected (0.01 sec)
  10. Rows matched: 1  Changed: 1  Warnings: 0
  11. mysql> select * from user where nickname='11';
  12. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  13. | id | mobile      | password                                 | salt             | nickname | is_deleted | created_time        | updated_time        |
  14. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  15. |  5 | 10123456789 | 847100b326a0574c0cdcc22483e13cb39accdefd | 48c3e9cfac9ac472 | 11       |          0 | 2016-09-17 18:29:25 | 2016-09-17 18:29:25 |
  16. +----+-------------+------------------------------------------+------------------+----------+------------+---------------------+---------------------+
  17. 1 row in set (0.00 sec)
复制代码
我们也可以修改视图的布局,就像修改表布局一样。比如我们不想关心is_deleted了。
  1. mysql> alter view v_user_info AS SELECT mobile, nickname FROM user;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> select * from v_user_info;
  4. +-------------+-----------+
  5. | mobile      | nickname  |
  6. +-------------+-----------+
  7. | 13062666053 | 某小宝    |
  8. | 13012345678 | 某宝      |
  9. | 10123456789 | 11        |
  10. | 13111111112 | 12        |
  11. +-------------+-----------+
  12. 4 rows in set (0.00 sec)
复制代码

  • Drop
  1. DROP VIEW VIEW_NAME;
复制代码
比如我们不想要这张视图了
  1. mysql> drop view v_user_info;
  2. Query OK, 0 rows affected (0.00 sec)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表