视图:Select语句的执行方法,数据库只存储视图定义本身,而不保存视图的执行结果。
- 执行方式:类似于C语言中:内联函数,将语句替换到对应位置
- 使用方法:可以看作一个TABLE
- 作用:
1:隐藏数据,结合权限管理机制,可以提供更加灵活的安全控制
创建视图
CREATE VIEW v AS <query expression>
- case:
USE world;
CREATE VIEW v_select AS
SELECT district, SUM(population)
FROM city
WHERE countrycode = 'CHN'
GROUP BY district
HAVING SUM(population) > 5000000
ORDER BY SUM(population) DESC
LIMIT 5 OFFSET 0;
- 补充:I_S (Information_Schema)保证表的安全(不让用户接触元数据)
每次数据库启动,会自动在内存中生成I_S,生产查询MySQL部分元数据信息视图
– 类似于C语言中的typedef:保存元数据的查询方法, I_S中保存的都是视图 - I_S.tables 常用信息介绍 – 作用:保存所有表的数据字典信息(一部分元数据)
DESC TABLES; #查询视图信息: tables中存了MySQL中所有表的情况:全局的统计
TABLE_SCHEMA #表所在的库
TABLE_NAME #表名
ENGINE #表的引擎
TABLE_ROWS #表的数据行数(不是实时的值,Write_Back)
AVG_ROW_LENGTH #平均行长度
DATA_LENGTH #表使用的存储空间大小(不是实时的值)
INDEX_LENGTH #表中索引使用的存储空间大小
DATA_FREE #表中是否有碎片(频繁DELETE会产生碎片)
可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
提示:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
更新视图
满足以下条件的视图可更新:
1:FROM子句只有一个数据库关系
2:SELECT子句只包含关系的属性名(不包含表达式,聚集函数,DISTINCT=》无法反推:比如没法通过SUM(col)值知道col都包含哪些元素,不可逆性)
3:满足主键约束,参照完整性约束
4:查询中不含有GROUP BY或HAVING (同2)
可以对视图使用DUDATE、INSERT、DROP、DELETE操作,同时使用WITH CHECK OPTION做自定义完整性检查,防止出现越权(修改本视图看不到的数据)等等