什么是试图:

通俗的讲,试图就是一条select语句执行后返回的结果集。所以我们在创建试图的时候,主要工作就落在创建这条SQL查询语句上。

试图的特性:

  • 试图是对若干张基本表的引用,是一张虚拟的逻辑表,由查询语句执行的结果构成
  • 试图不存储具体的数据(基本表数据发生了改变,试图也会跟着改变)
  • 试图可以跟基本表一样,进行增删改查操作,但是增删改查操作是有限制的

试图的作用:

  • 方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
  • 更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建试图,可以把权限限定到行列级别;

使用场合:

  • 权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary…

  • 关键信息来源于多个复杂关联表,可以创建试图提取我们需要的信息,简化操作;

试图案例:

1.创建如下三张表

#users表的创建
CREATE TABLE `users` (`u_id` int(4) NOT NULL auto_increment,`username` varchar(20) default NULL,`age` int(4) default NULL,`country` varchar(20) default NULL,PRIMARY KEY  (`u_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;#course表的创建
CREATE TABLE `course` (`c_id` int(4) NOT NULL auto_increment,`coursename` varchar(20) default NULL,`description` varchar(255) default NULL,PRIMARY KEY  (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;#user_course表的创建
CREATE TABLE `user_course` (`u_c_id` int(4) NOT NULL auto_increment,`userid` int(4) NOT NULL,`courseid` int(4) NOT NULL,PRIMARY KEY  (`u_c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

2.分别向三张表中插入数据
users表:

course表:

user_course表:

3.要求查询tom所修的课程,显示tom的名字和课程名

常规的方法是使用外连接的方式查询:
SELECT username,coursename FROM
user_course
JOIN users
ON user_course.userid=users.u_id
JOIN course
ON user_course.courseid=course.c_id
WHERE username='tom';

结果:

可以看出,并不是很复杂的关联表的查询已经如此的复杂了,下面我再使用试图的方式做同样的查询。
1.试图的创建

CREATE VIEW user_course_view ASSELECT * FROM user_courseJOIN usersON user_course.userid=users.u_idJOIN courseON user_course.courseid=course.c_id;

查看试图"user_course_view"

再啰嗦一下,试图本身并不存储数据,它只是一个逻辑表。
2.使用试图查询tom所修的课程,显示tom的名字和课程名

SELECT username,coursename
FROM user_course_view
WHERE user_course_view.username='tom';

结果:

使用试图创建后,让本来很复杂的查询变的很简单。
3.使用试图表的行列及信息进行隐藏,从而提高数据的安全性

CREATE VIEW user_course_view1 ASSELECT user_course.*,users.*,course.c_id,course.coursenameFROM user_courseJOIN usersON user_course.userid=users.u_idJOIN courseON user_course.courseid=course.c_id;

结果:

这样就很好的隐藏了"coursename"这一列的数据。

哪些操作可以在视图上进行呢?

由于试图只是一张逻辑表,也就致使并不是所有的增删改操作都可以在视图上进行的。

  • 试图与表是一对一关系情况:如果没有其它约束(如试图中没有的字段,在基本表中是必填字段情况的约束)是可以进行增删改数据操作
  • 试图与表是一对多关系情况:如果只修改一张表的数据,且没有其它约束(如试图中没有的字段,在基本表中是必填字段情况的约束),是可以进行数据操作的
    tip:对试图进行修改时要小心,因为不经意间就会修改基本表中的多条数据

关于"information_schema"数据库

MySQL数据库中的"information_schema"数据库中保存了大量元数据查询的试图。"information_schema"数据库是一个虚拟库,并不占用存储空间。
为了避免有些读者不熟悉元数据的概念,这里多说一句题外话。MySQL中的元数据就是中数据库中表的属性信息,比如:表所在的库名、表名、使用的存储引擎、有多少数据行等

mysql> use information_schema;  进入information_schema数据库内,库内有很多表,这些表就是相应的试图名。其中TABLES试图,包含了整个数据中所有表的元数据。
mysql> desc tables;  查看tables试图的属性结构
选择几个常用的介绍一下:
TABLE_SCHEMA        代指表所在的库名
TABLE_NAME          代指表名
ENGINE              代指存储引擎
TABLE_ROWS          代指有多少数据行
AVG_ROW_LENGTH      代指平均行长度
INDEX_LENGTH        代指索引长度

information_schema使用案例
1.统计上面users表占用的空间大小。我们知道表占用空间大小=平均行长度*行数+索引长度

SELECT table_name,(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024
FROM information_schema.TABLES
WHERE table_schema='viewtest' AND table_name='users';
ps:"viewtest"是users表所在的数据库

2.配合concat()函数拼接语句或命令

模仿以下语句,进行数据库的分库分表备份
mysqldump -uroot -p123 viewtest users >/bak/viewtest_users.sql
select concat("mysqldunp -uroot -p123",table_schema," ",table_name," >/bak/",table_schema,"_",table_name,".sql")
from information_schema.tables;

MySQL中试图的应用相关推荐

  1. MySql中管理百万级要注意些什么东西(转载)

    一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应 用编程接口(API) 应用程序 二.优化硬件 如果你需要庞大的数据库表 (>2G),你应该考虑使用64位的硬 ...

  2. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到右的 ...

  3. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  4. mysql中的where,group by,having:

    最近工作中碰到不少关于mysql的问题,以前天真的认为掌握增删改查就没什么问题了,结果是屡次碰壁.事实上mysql还有很多很多需要研究的东西.. 整理了一下自己最近遇到的一些问题,还有一些理论性的东西 ...

  5. MySQL中show语法使用总结

    MySQL中 show 语法的使用: 先查看MySQL版本信息: mysql> select version(); +------------+ | version() | +--------- ...

  6. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  7. MySQL中show语法

    1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称.  2. show databases; -- 显示mysql中所有数 ...

  8. php数据存储mysql_php – 在MySQL中存储路线数据的最佳方式

    我正在开发一个应用程序,它要求我存储一些位置的方向,下面是我试图存储的数据的示例: 方向1 从西部:乘528 East(Beechline),经过机场出口,然后从13号出口驶入Narcoossee R ...

  9. mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...

    好的,我正在寻找使用PHP在MySQL中进行"嵌套"事务的解决方案,并且正如您在MySQL文档中所知的那样,不可能在事务内进行事务(Mysql transactions withi ...

最新文章

  1. Ios上任意控件上添加自定义Badge
  2. python如何帮我在投资中获取更高收益
  3. 【小o地图Excel插件版】不止能做图表,还能抓58、大众点评网页数据...
  4. cURL error 60: SSL certificate problem: unable to get local issuer certificate 解决思路
  5. caffeine 弱引用key的实现
  6. tuples_通过字典赋值
  7. linux多环境变量使用字典,字典的用处非常大,昨天在网上找了个能在linux跑的字典程序,分享一下。...
  8. Android Canvas drawText实现中文垂直居中
  9. 猪年适合学什么编程语言?
  10. 解决Request method 'GET' not supported问题
  11. python爬取豆瓣电影名称与评分进行分析
  12. 吴恩达机器学习作业6---Support Vector Machines apply in Spam Classification(下)
  13. Android音视频【五】H265/HEVC码流结构
  14. 安全公司发现雄迈数字摄像机的主控口令“已泄露”
  15. Unity IOS微信登录
  16. 三星三防s8计算机功能在哪里,三星s8三防版怎么样 三防版三星s8配置参数介绍...
  17. EOS区块链开发的第一步
  18. DB2存储过程——begin end的作用
  19. 一图看懂鸿蒙股票,近五个交易日鸿蒙2.0概念股市复盘数据,一分钟教你看懂(5月1日)...
  20. 使用libreswan搭建ipsec点对点隧道 实现两idc内网网段互通

热门文章

  1. 2018年最新从PayPal提现美金的方法(实战教程)!
  2. 【Win10系统右下角网络图标消失、无法联网、网络Internet状态闪退等问题解决方法】
  3. 计算机奥赛金牌排名,2019五大学科竞赛含金量排名
  4. 混沌序列加密matlab,基于三维Lorenz混沌系统和Matlab仿真工具实现混沌数字视频加密...
  5. mysql查询的结果拼接字符串_MySql查询结果拼接成字符串
  6. 大型网站架构演变史(含技术栈与价值观)
  7. React:开发者工具谷歌插件下载安装
  8. react 日期怎么格式化_react日期格式化组件
  9. 微信订阅号之1-注册
  10. 影响债市行情的主要因素_决定债券收益的十大因素