博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原】mysql 视图
阅读量:6689 次
发布时间:2019-06-25

本文共 6910 字,大约阅读时间需要 23 分钟。

从为知笔记粘过来格式不太对,没有修改了
视图是从一个或者多个表中导出来的表,是一种虚拟存在的表,视图就像一个窗口,通过它可以看到系统专门提供的数据。
视图可以使用户的操作方便,保证并且数据库系统的安全。
 
内容:
视图的作用
创建视图
查看视图
修改视图
更新视图
删除视图
 

视图简介

视图从已经存在的表中导出,还可以从已经存在的视图导出,数据库只保存视图的定义,而没有存放视图的数据。视图的数据还是保存在原来的表中。视图的数据依赖于原来的表,一旦原来的表发生改变,视图的数据也相应变化。
 
如果需要经常查询多个表的制定字段的数据,可以在这些表上建立一个视图
 
MySQL的视图不支持输入参数的功能。
 
视图的作用:可以起到筛选器的作用,那些对用户没有用或者用户没有权限了解的信息可以直接屏蔽掉,归纳为:
使操作简化,增加数据的安全性,提高表的逻辑独立性
 

创建视图

mysql通过create view实现创建视图,语法:
create [algorithm
={undifined|merge|temptable}]
view view_name [(properties)]
as
select
* [
with [
CASCADED|
LOCAL]
check
option];
 
解析:
algorithm是可选参数,表示视图选择的算法,undefined表示mysql自动选择算法,merge表示将使用视图的语句与视图定义合并,使视图的定义部分取代语句的对应部分,temptable表示视图的结构保存到临时表,然后使用临时表执行语句。
view_name表示要创建的视图的名字。
properties是可选参数,指定视图中各属性的名词,默认与select中查询的相同。
select是一个完整的查询语句从某个表中查询某些满足条件的记录并导入视图中。
with check option是可选参数,表示更新视图是要保证在视图的权限范围之内。
 
最好使用with cascaded check option参数
 
权限查询:在mysql数据库的user表中保存着权限信息,使用如下语句查询
select select_priv, create_view_priv
from mysql.
user whrer
user
=
'username';
其中‘username’是数据库用户的用户名。
查询结果:
mysql
>
select select_priv, create_view_priv
from mysql.
user
where
user
=
'root';
+
-------------+------------------+
| select_priv | create_view_priv |
+
-------------+------------------+
| Y | Y |
| Y | Y |
+
-------------+------------------+
2
rows
in
set (
0.
09 sec)
 
在单表创建视图:
 
mysql
> use login;
Database changed
mysql
>
select
*
from login;
+
-----+----------+----------------------------------+
| uid | username |
password |
+
-----+----------+----------------------------------+
|
1 | test |
098f6bcd4621d373cade4e832627b4f6 |
|
2 | test1 |
5a105e8b9d40e1329780d62ea2265d8a |
|
3 | test2 | ad0234829205b9033196ba818f7a872b |
|
4 |
user | ee11cbb19052e40b07aac0ca060c23ee |
|
5 | testk | f2fc2720249d97db37e2a5a3330baa4e |
+
-----+----------+----------------------------------+
5
rows
in
set (
0.
05 sec)
mysql
>
create
view login_view
as
select
*
from login
where uid
>
=
2
and uid
<
=
4;
Query OK,
0
rows affected (
0.
12 sec)
mysql
>
desc login_view;
+
----------+-------------+------+-----+---------+-------+
| Field |
Type |
Null |
Key |
Default | Extra |
+
----------+-------------+------+-----+---------+-------+
| uid |
int(
11) |
NO | |
0 | |
| username |
varchar(
32) |
NO | |
NULL | |
|
password |
varchar(
32) |
NO | |
NULL | |
+
----------+-------------+------+-----+---------+-------+
3
rows
in
set (
0.
07 sec)
mysql
>
select
*
from login_view;
+
-----+----------+----------------------------------+
| uid | username |
password |
+
-----+----------+----------------------------------+
|
2 | test1 |
5a105e8b9d40e1329780d62ea2265d8a |
|
3 | test2 | ad0234829205b9033196ba818f7a872b |
|
4 |
user | ee11cbb19052e40b07aac0ca060c23ee |
+
-----+----------+----------------------------------+
3
rows
in
set (
0.
04 sec)
 
在多表上建立视图
在多表创建视图类似单表操作,只在select语句使用多表查询即可。

查看视图

1:使用desc语句
2:show table status语句查询视图基本信息。
show table status like 'view_name';
 
mysql
>
show
table status
like
'login_view' \
G;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Name: login_view
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
 
这条语句用于查看表信息:
mysql
>
show
table status
like
'login' \
G;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Name: login
Engine: InnoDB
Version:
10
Row_format: Compact
Rows:
5
Avg_row_length:
3276
Data_length:
16384
Max_data_length:
0
Index_length:
16384
Data_free:
7340032
Auto_increment:
6
Create_time:
2012
-
10
-
28
18:
28:
57
Update_time:
NULL
Check_time:
NULL
Collation: utf8_general_ci
Checksum:
NULL
Create_options:
Comment:
1
row
in
set (
0.
01 sec)
 
从上面两个查询结构可以直观看出视图和表的区别。
虽然show table status可以查看视图的基本信息,但是不推荐使用,因为能提供的信息太少。
 
3.show create view语句查看视图信息
 
mysql
>
show
create
view login_view \
G;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
View: login_view
Create
View:
CREATE ALGORITHM
=UNDEFINED
DEFINER
=`root`@`localhost`
SQL
SECURITY
DEFINER VIE
W `login_view`
AS
select `login`.`uid`
AS `uid`,`login`.`username`
AS `username`,`login`.`
password`
AS `
password`
from `login`
where ((`login`.`uid`
>
=
2)
and (`login`.`uid`
<
=
4))
character_set_client: gbk
collation_connection: gbk_chinese_ci
1
row
in
set (
0.00 sec)
 
4:在view表中查看视图的详细信息。
select
*
from information_schema.views \
G;
 
information_schema是mysql自带的一个数据库。查询结果如下:
mysql
>
select
*
from information_schema.views \
G;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
TABLE_CATALOG: def
TABLE_SCHEMA: login
TABLE_NAME: login_view
VIEW_DEFINITION:
select `login`.`login`.`uid`
AS `uid`,`login`.`login`.`username`
AS `username`
,`login`.`login`.`
password`
AS `
password`
from `login`.`login`
where ((`login`.`login`.`uid`
>
=
2) a
nd (`login`.`login`.`uid`
<
=
4))
CHECK_OPTION:
NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE:
DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
1
row
in
set (
0.
10 sec)
 

修改视图

create or replace view语句与alter语句修改
 
1.create or replace view
语法:
create
or replace [algorithm
={undefined|merge|temptable}]
view view_name [(propertise)]
as selecte
* [
with [
cascaded|
local]
check
option];
 
有点像create view,create or replace在视图不存在的情况下创建视图,视图已存在则修改视图。
 
2.alter语句
 
alter [algorithm
={undefined|merge|temptable}]
view view_name [(propertise)]
as selecte
* [
with [
cascaded|
local]
check
option];
参数和create view相同。
 

更新视图

update,注意不要写成updata。
语法:
update view_name
set property_1
=a[, property_2
=b..];
 
注意:更新会修改源表,而不只是修改视图,因为视图没有存储,实际操作都是针对源表。主键字段不能update。update会修改视图中的所有数据。
 
不能更新视图的情况
  1. 视图包含sum(),count(),max(),min()等函数。
  2. 视图包含union,union all,distinct,group by, having等关键字。
  3. 常量视图
  4. 创建视图的select语句包含select子句。
  5. 由不可更新的视图导出的视图。//视图可以继续导出视图。
  6. 创建视图是algorithm参数为temptable。
  7. 视图对应的表上没有默认值的列,并且该列不再视图里。
  8. 除此外with check option可能决定视图鞥否更新。

删除视图

删除视图时只删除视图的定义,而不删除视图源表的数据。
语法:
drop
view [if exits] view_name_list [
restrict|cascad];
解析:
if exits判断视图是否存在,存在则执行删除,不存在则不执行。
可以一次删除多个视图。
mysql
>
drop
view if exits login_view;
ERROR
1064 (
42000): You have an error
in your
SQL syntax;
check the manual that corresponds
to your
MySQL server
version
for the
right syntax
to use near
'exits login_view'
at line
1
mysql
>
drop
view if
exists login_view;
Query OK,
0
rows affected (
0.00 sec)
mysql
>
desc login_view;
ERROR
1146 (
42S02):
Table
'login.login_view' doesn
't exist
 
删除视图需要权限允许。查看是否有删除权限的命令:
select Drop_priv
from mysql.
user
where
user
=
'username';
 
结果为:
mysql
>
select drop_priv
from mysql.
user
where
user
=
'root';
+
-----------+
| drop_priv |
+
-----------+
| Y |
| Y |
+
-----------+
2
rows
in
set (
0.00 sec)
<>

转载于:https://www.cnblogs.com/kiwi/archive/2012/11/17/2775228.html

你可能感兴趣的文章
《Vim实用技巧(第2版)》——2.5 能够重复,就别用次数
查看>>
JVM上的随机数与熵池策略
查看>>
《为iPad而设计:打造畅销App》——第1章 拥抱新模式
查看>>
如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2
查看>>
Java8并发教程:Threads和Executors
查看>>
《Python算法教程》——2.3 图与树的实现
查看>>
Apache Spark机器学习.2.2 数据清洗
查看>>
v8世界探险(3) - v8的抽象语法树结构
查看>>
内核月报201702
查看>>
【Spark Summit East 2017】商品集群上的时间演化图处理
查看>>
omega监控系列之connection
查看>>
《C语言及程序设计》实践项目——用if语句实现分支结构
查看>>
PYTHON小CASE
查看>>
MySQL5.6 RC innodb_log_compressed_pages 测试 及实现简述
查看>>
“AI +跨界+技术” 看2018中国会展创新者大会的新观点
查看>>
JavaScript——数据类型转换(显式和隐式)
查看>>
React项目实践(二)一个登录页面的状态迁移
查看>>
【半月刊 4】前端高频面试题及答案汇总
查看>>
冒泡排序
查看>>
lc686. Repeated String Match
查看>>