上一张内容在结尾阶段引入了MySQL数据库的视图概念,本章将纤细介绍视图的集中用法。在创建视图之前先创建学生表,学院表和学员信息表,通过使用视图对着三张表的操作,使我们对视图有一个基本的认识和了解。
使用视图的原则:
1、视图名字唯一性
2、视图的创建个数不受限制,用户可以创建多个视图
3、用户创建视图,必须从数据库管理员得到权限。
4、视图可以嵌套,
5、一些数据库管理系统禁止用户在查询语句中使用order by子句。
一、创建实用表数据
创建学生表
1
2
|
mysql>
create
table
studenginfo(sno
int
(4) zerofill,sname
varchar
(18),sex ENUM(
'男'
,
'女'
)
not
null
default
'女'
,address
varchar
(48)
default
'北京'
,dno
int
(3));
Query OK, 0
rows
affected (0.07 sec)
|
创建学院表
1
2
3
4
5
6
7
8
9
10
11
|
create
table
recruitinfo(address
varchar
(18)
not
null
,score
float
not
null
,snum
int
(3)
not
null
);
Query OK, 0
rows
affected (0.08 sec)
mysql> show
create
table
department\G;
*************************** 1. row ***************************
Table
: department
Create
Table
:
CREATE
TABLE
`department` (
`dno`
int
(2)
NOT
NULL
,
`dname`
varchar
(18)
NOT
NULL
,
`dnum`
int
(3)
NOT
NULL
DEFAULT
'0'
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8
1 row
in
set
(0.00 sec)
|
为学生表创建索引
1
|
mysql>
create
index
name_index
on
studentinfo (sname);
|
二、视图:
视图作为查询数据的另外一种形式,利用视图,用户可以集中、简化和定制数据库,同时提供了安全保证
视图是从一个或过个表中导出的表,其结构和数据是建立在对标的查询基础之上的。就本质而言,视图是一张虚表。
视图创建语法:
1
2
|
create
view
<view_name> [column1,column2...]
as
select
<column_name>
from
<tb_name>;
|
其中[column1,column2,...]为可选项,缺省是子查询结果中的字段名,select语句指明了视图中的字段机器数据。
强调:
1、视图创建后,只在数据字典中存放视图的定义,而其中的select语句并不执行
2、只有当用户对视图进行操作时,才按照视图的定义将数据从基本表中取出。
创建视图:
1、创建一个与studentinfo相同信息的视图
1
2
|
mysql>
create
view
studentinfo_view
as
select
*
from
studentinfo;
select
*
from
studentinfo_view;
|
2、为视图创建视图
1
|
mysql>
create
view
boy_view
as
select
*
from
studentinfo_view
where
sex=
'男'
;
|
3、为列创建视图并查看其信息
1
|
mysql>
create
view
nameaddress_view
as
select
sname,address
from
studentinfo;
|
4、创建与表具有不同字段名的视图
1
2
|
mysql>
create
view
New_view(boy_name,boy_address)
as
select
sname,address
from
studentinfo
where
sex=
'男'
;
Query OK, 0
rows
affected (0.00 sec)
|
5、利用视图简化表的复杂连接
创建一个关于学生信息表(studentinfo)、招生信息表(Recruitinfo)和Department的关联。
sname、dname和dnum三个字段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
mysql>
create
view
join_view
as
select
sname,dname,score
from
studentinfo s,department d,recruitinfo r
where
s.address=r.address
and
s.dno=d.dno;
Query OK, 0
rows
affected (0.00 sec)
mysql>
select
*
from
join_view;
+
-----------+--------------------+-------+
| sname | dname | score |
+
-----------+--------------------+-------+
| 张平 | 汽车系 | 648.5 |
| 李山 | 电子工程系 | 560 |
| 王彤 | 汽车系 | 654.5 |
| 张伟 | 计算机工程系 | 638 |
| 高守传 | 机械工程 | 650 |
| 刘红 | 工程物理系 | 629.5 |
| 张勇 | 应用数学系 | 625 |
| 刘晓 | 电子工程系 | 650 |
| 吴军 | 电子工程系 | 631 |
| 张大山 | 材料工程系 | 635 |
+
-----------+--------------------+-------+
10
rows
in
set
(0.03 sec)
|
6、视图简化复杂查询的过程
6.1 给予学生表,创建boys_view视图,包含所有男同学信息
1
|
mysql>
create
view
boys_view
as
select
*
from
studentinfo
where
sex=
'男'
;
|
给予recruitinfo表,创建视图score_view,包含录取分数高于630的所有学生的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql>
create
view
boyscore_view
as
select
*
from
score_view
where
sno
in
(
select
sno
from
boys_view);
mysql>
select
*
from
boyscore_view;
+
------+-----------+-----+---------+------+
| sno | sname | sex | address | dno |
+
------+-----------+-----+---------+------+
| 0005 | 高守传 | 男 | 山东 | 3 |
| 0004 | 张伟 | 男 | 浙江 | 1 |
| 0009 | 吴军 | 男 | 山西 | 4 |
| 0010 | 张大山 | 男 | 陕西 | 7 |
+
------+-----------+-----+---------+------+
4
rows
in
set
(0.00 sec)
mysql>
create
view
result_view (sname,dname)
as
select
boyscore_view.sname,department.dname
from
boyscore_view,department
where
boyscore_view.dno=department.dno;
Query OK, 0
rows
affected (0.00 sec)
|
删除视图
语法:drop view view_name
drop view studentinfo_view
注意:视图在物理上是不存在的,只是一个查询结果,是一个被存储的查询。create view语句只是保存了视图的定义,所以在使用drop view语句删除视图时,删除的也只是视图的定义,对实际表中的数据没有影响。
本文转自 CARYFLASH 51CTO博客,原文链接:http://blog.51cto.com/maoxiaoxiong/1983954