14 MySQL 视图

MySQL 视图

[toc]

视图概述

视图介绍

什么是视图

  • 虚拟表
  • 内容与真实的表相似,有字段有记录
  • 视图并不在数据库中以存储的数据的形式存在
  • 行和列的数据来自定义视图时查询所引用的基表,并且在具体引用视图时动态生成
  • 更新视图的数据,就是更新基表的数据
  • 更新基表的数据,仕途的数据也会跟着改变

视图优点

简单

  • 用户不需关心视图中的数据如何查询获得

  • 视图中的数据已经是过滤好的符合条件的结果集

安全

  • 用户只能看到视图中的数据

数据独立

  • 一旦视图结构确定,可以屏蔽表结构对用户的影响

视图使用限制

  1. 不能在视图上创建索引
  2. 在视图的 FROM 子句中不能使用子查询
  3. 以下情形中的视图是不可更新的
    • 包含以下关键字的 SQL 语句: 聚合函数( SUM, MIN, MAX,COUNT等), DISTINCT, GROUP BY, HAVING, UNION 或 UNION ALL
    • 常量视图, JOIN, FROM 一个不能更新的视图
    • WHERE 子句的子查询引用了 FROM 子句中的表
    • 使用了临时表

视图 基本使用

创建视图

create view 视图名称 as SQL查询;

create view 试图名称(字段名列表) as SQL查询;

注意: 在视图表中不定义字段名的话,默认使用基表的字段名,若定义字段名,视图表中的字段必须和基表的字段个数相等.

示例

#准备基表
mysql> create database db9;
mysql> use db9;
mysql> create table user(
    -> name char(20),
    -> password char(1),
    -> uid int(2),
    -> gid int(2),
    -> comment char(150),
    -> homedir char(150),
    -> shell char(30)
    -> );
mysql> system cp /etc/passwd /var/lib/mysql-files
mysql> load data infile "/var/lib/mysql-files/passwd" into table user fields terminated by ":" lines terminated by "\n";
mysql> alter table user add id int(2) primary key auto_increment first

#创建视图 不指定视图字段名称
mysql> create view t1 as select name,shell from user where uid<=20;
Query OK, 0 rows affected (0.32 sec)

mysql> show tables;
+---------------+
| Tables_in_db9 |
+---------------+
| t1            |
| user          |
+---------------+
2 rows in set (0.01 sec)

mysql> create view t3 as select name,uid,gid from user limit 3;
mysql> select * from t3;
+--------+------+------+
| name   | uid  | gid  |
+--------+------+------+
| root   |    0 |    0 |
| bin    |    1 |    1 |
| daemon |    2 |    2 |
+--------+------+------+

#创建视图 指定视图字段名称
#视图表里字段名和SQL查询里字段名必须一致
mysql> create view t4(user,stu_uid,stu_gid) as select name,uid,gid from user limit 3;
mysql> select * from t4;
+--------+---------+---------+
| user   | stu_uid | stu_gid |
+--------+---------+---------+
| root   |       0 |       0 |
| bin    |       1 |       1 |
| daemon |       2 |       2 |
+--------+---------+---------+


#数据目录下 视图 只有表结构,数据来源自基础表
[root@test6 db9]# ls
db.opt  t1.frm  user.frm  user.ibd

mysql> select * from t1;
+----------+----------------+
| name     | shell          |
+----------+----------------+
| root     | /bin/bash      |
| bin      | /sbin/nologin  |
| daemon   | /sbin/nologin  |
| adm      | /sbin/nologin  |
| lp       | /sbin/nologin  |
| sync     | /bin/sync      |
| shutdown | /sbin/shutdown |
| halt     | /sbin/halt     |
| mail     | /sbin/nologin  |
| operator | /sbin/nologin  |
| games    | /sbin/nologin  |
| ftp      | /sbin/nologin  |
+----------+----------------+
12 rows in set (0.00 sec)

查看视图

show table status;

show table status where comment="view"\G

查看创建视图具体命令

show create view 视图名;

示例

# 查看哪些表是视图
mysql> show table status where comment="view"\G;
*************************** 1. row ***************************
           Name: t1
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.01 sec)

#查看视图的数据基于哪个物理表
mysql>  show create view t1\G;
*************************** 1. row ***************************
                View: t1
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `t1` AS select `user`.`name` AS `name`,`user`.`shell` AS `shell` from `user` where (`user`.`uid` <= 20)
character_set_client: utf8
collation_connection: utf8_general_ci

使用视图

查询记录

select 字段名列表 from 视图名 where 条件;

插入记录

insert into 视图名(字段名列表) values(字段值列表);

更新记录

update 视图名 set 字段名=值 where 条件;

删除记录

Delete from 视图名 where 条件;

对视图操作即是对基表操作,反之依然 !!!

示例

修改

修改基表会影响视图,修改视图会影响基表


mysql> create view v5 as select id,name,shell,password from user;
mysql> select * from v5;
+----+-----------------+----------------+----------+
| id | name            | shell          | password |
+----+-----------------+----------------+----------+
|  1 | root            | /bin/bash      | x        |


mysql> update v5 set name="tom" where id=1;

mysql> select * from v5;
+----+-----------------+----------------+----------+
| id | name            | shell          | password |
+----+-----------------+----------------+----------+
|  1 | tom             | /bin/bash      | x        |

mysql> select id,name,shell,password from user;
+----+-----------------+----------------+----------+
| id | name            | shell          | password |
+----+-----------------+----------------+----------+
|  1 | tom             | /bin/bash      | x        |


增加

增加视图会增加基表

mysql> insert into v5(name,shell,password) values("leo","shelltest","x");

mysql> select * from v5 where name="leo";
+----+------+-----------+----------+
| id | name | shell     | password |
+----+------+-----------+----------+
| 24 | leo  | shelltest | x        |
+----+------+-----------+----------+

mysql> select id,name,shell from user where name="leo";
+----+------+-----------+
| id | name | shell     |
+----+------+-----------+
| 24 | leo  | shelltest |
+----+------+-----------+

删除视图

drop view 视图名;

删除视图表不会影响基表

视图 进阶

创建视图的完全格式

命令格式

CREATE
[OR REPLACE]
[ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER}]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[ WITH { CASCADED | LOCAL } CHECK OPTION]

设置字段别名

视图中的字段名不可以重复,所以要定义别名

create view 视图名

as

select 表别名.源字段名 as 字段别名 from 源表名 表别名 left join 源表名 表别名 on 条件;

create view v2
as
select a.name as aname, b.name as bname,a.uid as auid,b.uid as buid from user a left join info b on a.uid=b.uid;

重要选项说明

OR REPLACE

create or replace view 视图名 as select 查询;

创建时,若视图已存在,会替换已有视图

mysql> create view t1 as select * from info;
Query OK, 0 rows affected (0.01 sec)

#提示已存在
mysql> create view t1 as select * from info;
ERROR 1050 (42S01): Table 't1' already exists

#无提示,已覆盖
mysql> create or replace view t1 as select * from info;
Query OK, 0 rows affected (0.01 sec)

ALGORITHM

ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }

参数 意义
MERAGE 替换方式
TEMPTABLE 具体化方式
UNDEFINED 未定义

LOCAL 和 CASCADED

LOCAL 和 CASCADED关键字决定检查的范围

关键字 检查范围
LOCAL 仅检查当前视图的限制
CASCADED 同时要满足基表的限制 ( 默认值 )

示例

# 创建 info 表
mysql> create table info select name,uid,shell from user limit 5;

# 创建视图 v2 ,user表 别名a,字段重命名,
mysql> create view v2 as select a.name as aname, b.name as bname, a.uid as auid, b.uid as buid from user a left join info b on a.uid=b.uid;

mysql> select * from v2;
+-----------------+--------+-------+------+
| aname           | bname  | auid  | buid |
+-----------------+--------+-------+------+
| tom             | tom    |     0 |    0 |
| bin             | bin    |     1 |    1 |
| daemon          | daemon |     2 |    2 |
| adm             | adm    |     3 |    3 |
| lp              | lp     |     4 |    4 |
| sync            | NULL   |     5 | NULL |
| shutdown        | NULL   |     6 | NULL |
| halt            | NULL   |     7 | NULL |
| mail            | NULL   |     8 | NULL |
| operator        | NULL   |    11 | NULL |
| games           | NULL   |    12 | NULL |
| ftp             | NULL   |    14 | NULL |
| nobody          | NULL   |    99 | NULL |
| systemd-network | NULL   |   192 | NULL |
| dbus            | NULL   |    81 | NULL |
| polkitd         | NULL   |   999 | NULL |
| sshd            | NULL   |    74 | NULL |
| postfix         | NULL   |    89 | NULL |
| ntp             | NULL   |    38 | NULL |
| mysql           | NULL   |    27 | NULL |
| rpc             | NULL   |    32 | NULL |
| rpcuser         | NULL   |    29 | NULL |
| nfsnobody       | NULL   | 65534 | NULL |
+-----------------+--------+-------+------+
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,648评论 5 116
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 第一天 7月13日OCP笔记: Oracle Ocp11g准备资料: OracleFundmentals 书 管理...
    fjxCode阅读 2,678评论 0 4
  • 从影响我性格的那件事开始讲吧。那年我七岁,刚上一年级,这一年我爷爷去世。家里来电话了,我拿去给妈妈听。“…...
    _c270阅读 243评论 0 1
  • 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算...
    莮亾阅读 665评论 0 1