数据库对象
| 对象 | 说明 |
|---|---|
| 表 | 是存储数据的逻辑单元,以行和列的形式存在,一行代表一条记录,列代表不同记录中的不同 |
| 数据字典 | 就是系统表,存放数据库相关信息的表,系统表的数据通常由数据库系统维护,程序员通常不修改只有查看的功能 |
| 约束 | 执行数据的校验规则,用于保证数据完整性的规则 |
| 视图 | 一个或多个表中的数据显示,在视图中并不存储数据 |
| 索引 | 提高数据库的查询性能,相当于书的目录 |
| 存储过程 | 用于完成一次业务处理,没有返回值,但可以通过传出的参数将多个值传给调用环境 |
| 存储函数 | 完成一次特定的计算,有一个返回值 |
| 触发器 | 相当于一个事件监听器,当数据库发生特定事件后,触发器被触发完成相应的处理 |
视图
概念和定义
视图是一种虚拟表 ,本身是不具有数据的,占用很少的内存空间,它是 SQL 中的一个重要概念
- 视图建立在已有表的基础上, 视图赖以建立的这些表称为 基表 ;视图的创建和删除只影响视图本身,不影响对应的基表。
- 但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化,反之亦然。
- 视图,是向用户提供基表数据的另一种表现形式。通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。
相当于数据库中数据表的另外一种呈现方式:将查询的结果集放到一张虚拟表中;
视图的创建
视图创建语法(完整的语法结构):
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句 [WITH [CASCADED|LOCAL] CHECK OPTION]
常用的视图创建语法结构:
CREATE VIEW 视图名称
AS 查询语句
创建单表视图
创建单表视图
create view v_student1(stu_id, stu_name, stu_dept, stu_phone) as
select id, name, department, '13812345678'
from student;
- 可以在视图的名称后加上对应的字段名称(查询结果显示的字段名称)
- 视图的字段名称列表与对应的查询字段一一对应
- 可以在查询语句中添加新的结果字段(不会影响基表)
在创建视图的过程中可以将聚合函数的记过映射在视图的查询结果中:
create view v_score as
select stu_id, c_name, sum(grade)
from score
group by stu_id, c_name;
在创建视图的过程中可以通过在 SQL 语句中取别名的方式让视图显示对应的别名字段
# 可以在SQL中给对应的字段取别名
create view v_score2 as
select stu_id, c_name, sum(grade) sum_grade
from score
group by stu_id, c_name;
创建多表视图
案例:统计不同学生信息,和他们的最高分,最低分,平均分
create view v_student_score as
select s1.id stu_id, s1.name stu_name, s1.department, sum(grade) sum_grade, avg(grade) avg_grade, min(grade) min_grade
from student s1
left join score s2 on
s1.id = s2.stu_id
group by s1.id, s1.name;
select * from v_student_score;
基于视图创建视图
根据之前创建视图的部分字段,可以创建新的视图
# 显示 v_student_score 的部分字段 --- 创建新的视图
create view v_score_student2 as
select stu_id, stu_name, sum_grade
from v_student_score;
select * from v_score_student2;
视图的操作
查看视图
通过命令查看当前视图的状态,创建信息等内容:
查看当前所有表和视图信息:
# 查看所有表和视图的信息
show tables;
查看视图结构|表结构
describe v_student1;
describe student;
查看视图或者数据表的属性信息
show table status like 'v_student1';
show table status like 'student';
查看视图、数据表的定义信息
show create view v_student1;
show create table student;
更新视图数据
一般情况: MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当 视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
# 修改视图的内容 (修改视图中的数据会直接影响基表中的数据)
update v_student1
set stu_name = '王二麻子'
where v_student1.stu_id = '901';
select *
from v_student1;
select *
from student;
# 删除视图内容,会影响基表的数据
delete from v_student1 where v_student1.stu_id = '907';
select * from student;
不可更新的视图:
要使视图可更新,视图中的行和底层基本表中的行之间必须存在 一对一的关系。
另外当视图定义出现如下情况时,视图不支持更新操作:
- 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
- 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
- 在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;
- 在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT, 也不支持UPDATE使用了数学表达式、子查询的字段值;
- 在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、 聚合函数 、 GROUP BY 、 HAVING 、 UNION 等,视图将不支持INSERT、UPDATE、DELETE;
- 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持 INSERT、UPDATE、DELETE; 视图定义基于一个不可更新视图 ;
- 常量视图。
在原有视图的基础上修改视图
- 通过 create or replace ... 语句修改视图
- 通过 alter view as ... 语句修改视图
as 后面跟的是对应的查询语句
# 在原有视图的基础上修改视图
create or replace view v_student1 as
select * from student;
select * from v_student1;
alter view v_score as
select * from score;
select * from v_score;
删除视图
删除视图的语法是:
DROP VIEW IF EXISTS 视图名称;
DROP VIEW IF EXISTS 视图名称1,视图名称2,视图名称3,...;
视图总结
视图优点:
| 视图优点 | 说明 |
|---|---|
| 操作简单 | 将经常使用的查询定义为视图,可以让开发人员不需要关心对应的数据表结构,表与表的关联关系,也不需要关心不同数据表之间的业务逻辑关系 |
| 减少数据冗余 | 视图存储的其实是查询语句,本身不存储数据,不占用数据资源,减少了数据冗余 |
| 数据安全 | 在用户和真正的数据表之间加上了一层虚拟表,增加用户与真实数据之间的隔离性 |
| 灵活多变 | 在业务逻辑发生变动的情况下,改动数据表字段,结构工作量较大,可以通过更改 |
| 简化复杂查询的逻辑 | 数据库里如果有多条复杂的查询逻辑,可以使用 视图进行分解创建多个视图在结合起来,完成复杂的查询逻辑 |
视图不足:
如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。
特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。
因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。
实际项目中,如果视图过多,会导致数据库维护成本的问题。 所以,在创建视图的时候,你要结合实际项目需求,综合考虑视图的优点和不足,这样才能正确使用视图,使系统整体达到最优。