MySQL数据库 - 视图和索引

视图介绍

概述:

视图是在一个或者多个基本表或视图的基础上,通过查询语句定义虚拟表,与基本表类似,试图可用于SELECT语句中进行查询。不同之处在于,视图只存储其定义语句,并未存储其数据。当使用视图进行查询时,视图包含的临时数据才会生成,因此,视图中的内容总是与基本表中数据保持一致,即当基本表中的数据发生变化时,相关视图的数据也随之发生变化。

作用:

  1. 视图提供了数据操作的便携性
  2. 视图提升了数据的逻辑独立性
  3. 试图提升了数据的安全性
  4. 试图可用于数据集成

索引介绍

作用:

在很多数据库系统中,数据库读取的次数多于数据库写的次数,因此,如何提高数据库读取数据的效率是数据库优化的主要工作之一,索引采取键值对的数据结构,可加快检索速度。索引的键由表或视图中一列或多列生成,值存储了键所对应数据的存储位置。

索引是一种以空间代价提高时间效率的方法,它采用预先建立的键值结构,根据查询条件,快速定位目标数据

类型:

  1. 根据索引特征进行分类,普通索引,唯一索引,主键索引,全文索引和空间索引
  2. 根据索引涉及列数进行分类,单列索引和复合索引
  3. 根据索引存储方式进行分类,B-Tree索引和Hash索引
  4. 根据索引与数据物理存储关系进行分类,聚集型索引和非聚集型索引

MySQL上的视图管理与索引管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
-- 创建数据库			--所用的数据库复制到navicat上点击运行可直接创建实验所用的数据库
create database kk;
use kk;

-- 创建课程表c
CREATE TABLE c (
cno char(10) NOT NULL COMMENT '课程号',
cn varchar(45) NOT NULL COMMENT '课程名',
ct int NOT NULL COMMENT '课时',
PRIMARY KEY (cno)
);
-- 创建学生表s
CREATE TABLE s (
sno char(10) NOT NULL COMMENT '学号',
sn varchar(45) NOT NULL COMMENT '姓名',
sex enum('男','女') NOT NULL DEFAULT '男' COMMENT '性别',
age int NOT NULL COMMENT '年龄',
maj varchar(45) NOT NULL COMMENT '专业',
dept varchar(45) NOT NULL COMMENT '院系',
PRIMARY KEY (sno)
) ;
-- 创建选课表
CREATE TABLE sc (
sno char(10) NOT NULL COMMENT '学号',
cno char(10) NOT NULL COMMENT '课程号',
score decimal(5,2) DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (sno,cno),
FOREIGN KEY (cno) REFERENCES c (cno),
FOREIGN KEY (sno) REFERENCES s (sno)
);
-- 创建教师表t
CREATE TABLE t (
tno char(10) NOT NULL COMMENT '教师号',
tn varchar(45) DEFAULT NULL COMMENT '姓名',
sex enum('男','女') NOT NULL DEFAULT '男' COMMENT '性别',
age int NOT NULL COMMENT '年龄',
prof varchar(10) NOT NULL COMMENT '职称',
sal decimal(6,2) NOT NULL COMMENT '工资',
maj varchar(45) NOT NULL COMMENT '专业',
dept varchar(45) NOT NULL COMMENT '院系',
PRIMARY KEY (tno)
);
-- 创建授课表tc
CREATE TABLE tc (
tno char(10) NOT NULL COMMENT '教师号',
cno char(10) NOT NULL COMMENT '课程号',
tcdate date NOT NULL COMMENT '开课日期',
PRIMARY KEY (tno,cno),
FOREIGN KEY (cno) REFERENCES c (cno),
FOREIGN KEY (tno) REFERENCES t (tno)
) ;
-- 分别在以上表中插入数据,注意主表和从表
INSERT INTO c VALUES
('c1','Java程序设计',40),
('c8','控制理论',32),
('c5','数据库系统',56),
('c6','数据挖掘',32),
('c4','数据结构',64),
('c2','程序设计基础',48),
('c3','线性代数',48),
('c7','高等数学',60);

INSERT INTO s VALUES
('s1','王彤','女',18,'计算机','信息学院'),
('s10','韩义','男',19,'计算机','信息学院'),
('s11','杨青','男',19,'计算机','工学院'),
('s2','苏乐','女',20,'信息','信息学院'),
('s3','林欣怡','男',19,'信息','信息学院'),
('s4','陶然','女',18,'自动化','工学院'),
('s5','魏立','男',17,'数学','理学院'),
('s6','何欣荣','女',21,'计算机','信息学院'),
('s7','赵琳琳','女',19,'数学','理学院'),
('s8','李轩','男',19,'自动化','工学院');

INSERT INTO sc VALUES
('s1','c1',90.50),
('s1','c2',85.00),
('s2','c4',70.00),
('s2','c5',57.00),
('s2','c6',81.50),
('s2','c7',NULL),
('s3','c1',75.00),
('s3','c2',70.50),
('s3','c4',85.00),
('s4','c1',93.00),
('s4','c2',85.00),
('s4','c3',83.00),
('s4','c6',NULL),
('s5','c2',89.00),
('s5','c7',60.00),
('s7','c2',62.00),
('s7','c5',80.00),
('s7','c7',100.00),
('s8','c3',96.00),
('s8','c7',78.50);


INSERT INTO t VALUES
('t1','刘杨','男',40,'教授',3610.50,'计算机','信息学院'),
('t2','石丽','女',26,'讲师',2923.30,'信息','信息学院'),
('t3','顾伟','男',32,'副教授',3145.00,'计算机','信息学院'),
('t4','赵礼','女',50,'教授',4267.90,'自动化','工学院'),
('t5','赵希希','女',36,'副教授',3332.67,'数学','理学院'),
('t6','张刚','男',30,'讲师',3012.00,'自动化','工学院');

INSERT INTO tc VALUES
('t1','c1','2021-09-03'),
('t1','c2','2021-09-04'),
('t2','c5','2021-09-06'),
('t2','c6','2021-09-10'),
('t3','c2','2021-03-08'),
('t3','c4','2021-03-06'),
('t4','c3','2020-03-10'),
('t5','c7','2020-03-09'),
('t5','c8','2021-09-10');



-- 开始操作

--使用这个数据库
use kk;
--创建信息学院学生视图 s_view
create view s_view
as select * from s
where dept='信息学院';

--创建学生选课情况视图 s_sc_c_view,视图字段列表为学号 sno、姓名 sname、课程名 cname 及成绩 score
CREATE VIEW s_sc_c_view(sn,sname,cname,score)
AS SELECT s.sno,sn,cn,score
FROM s,c,sc
WHERE s.sno=sc.sno AND sc.cno=c.cno

--在信息学院的学生视图 s_view 基础上,创建计算机专业学生视图 s_maj_view
CREATE VIEW s_maj_view
AS SELECT * FROM s_view
WHERE maj='计算机';

--查看视图 s_view 的结构信息
DESCRIBE s_view;

--查看视图 s_view 的状态信息
SHOW TABLE STATUS LIKE 's_view';

--查看视图 s_view 的创建信息
SHOW CREATE VIEW s_view;

--查询视图 s_view 的元信息
select * from information_schema.VIEWS
where table_name='s_view';

--删除视图 s_view
DROP VIEW s_view;

--构建用于更新数据的学生视图 s_update_view,提供学生表中的所有信息
CREATE view s_update_view
AS SELECT * FROM s;

--使用 s_update_view 视图向学生表 s 中插入一条学生记录,学生记录中各字段信息为
(s10,韩义,男,19,计算机,信息学院)
INSERT INTO s_update_view
VALUES('s12','韩义','男','19','计算机','信息学院');

--使用 s_update_view 视图,将学号为 s10 的学生年龄修改为 20 岁
UPDATE s_update_view
SET age=20
WHERE sno='s10';

--删除视图 s_update_view 中学号为 s10 的数据
DELETE FROM s_update_view
WHERE sno='s10';

--构建一个提供工学院学生信息的 s_check_view 视图
并指定WITH CHECK OPTION 参数(条件检查参数,看是否满足创建语句中select语句的条件)
CREATE VIEW s_check_view
AS SELECT * FROM s
WHERE dept='工学院'
WITH CHECK OPTION;

--为学生表 s 的姓名字段(sn)建立普通索引 s_name_index,索引针对 sn 的前 6个字节且以降序方式排列
CREATE INDEX s_name_index
ON s(sn(6) DESC);

--为课程表 c 的课程名(cn)和学时(ct)字段建立复合唯一索引 c_cn_ct_index
CREATE UNIQUE INDEX c_cn_ct_index
ON c(cn,ct);

--假设已经在学生表 s 中增加了 TEXT 类型的学生基本信息列(info),为 info 列创建全文索引 s_info_index
CREATE FULLTEXT INDEX s_info_index
ON s(info);

--创建教室表 classroom,要求包含自增主键 cid、教室编号 crno(非空字符串)、教室教学楼名称 cbn(非空字符串)
创建 classroom 表时,附加由教室编(crno)和教室名称(cbn)构成的普通唯一索引 cn_cb_index
CREATE TABLE classroom(
cid INT AUTO_INCREMENT,
crno VARCHAR(10) NOT NULL,
cbn VARCHAR(10) NOT NULL,
PRIMARY KEY(cid),
UNIQUE INDEX cn_cb_index(crno,cbn)
);

--为教师表 t 中的教师姓名(tn)添加索引 tn_index,索引长度为 6 且使用降序排列
ALTER TABLE t
ADD INDEX tn_index(tn(6) DESC);

--查看当前数据库下学生表 s 的索引信息
SHOW index from s;

--删除当前数据库学生表 s 上的索引 s_name_index
ALTER TABLE s
DROP INDEX s_name_index;