一、常见的数据库对象
- 表:表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录
- 数据字典:就是系统表,存放数据库相关信息的表。
- 约束:执行数据校验的规则,用于保证数据完整性的规则
- 视图:一个或者多个数据表里的数据的逻辑显示,视图并不存储数据
- 索引:用于提高查询性能,相当于书的目录
- 存储过程:用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调用环境
- 存储函数:用于完成一次特定的计算,具有一个返回值
- 触发器:相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理
二、视图
- 视图是一种
虚拟表
,本身是不具有数据
的,占用很少的内存空间,它是 SQL 中的一个重要概念 -
视图建立在已有的表的基础上
,视图赖以建立的这些表称为基表
- 视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应的发生变化,反之亦然。
- 视图是向用户提供基表数据的另一种表现形式。
-
视图可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户指定不同的查询视图,从而保证了安全性(敏感信息)
视图-基表.png
三、创建视图
- 语法格式
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句
[WITH [CASCADED|LOCAL] CHECK OPTION]
1、创建单表视图
CREATE OR REPLACE VIEW view_emp
AS
SELECT id, name
FROM emp;
- 查询视图
SELECT *
FROM view_emp;
- SELECT更加丰富(使用AVG函数)
CREATE OR REPLACE VIEW view_emp_avg
AS
SELECT dep_id, AVG(salary)
FROM emp
GROUP BY dep_id;
小结
- 实际上就是在SQL查询语句的基础上封装了视图 VIEW,这样就会给予 SQL 语句的结果集形成一张虚拟表
- 在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和 SELECT 语句中的字段列表一致。
2、创建多表联合视图
CREATE VIEW view_emp_dept(emp_id, emp_name, dept_name)
AS
SELECT e.id, e.name, t.name
FROM emp e
JOIN dept t ON e.dep_id = t.id;
3、基于视图创建视图
CREATE VIEW view_view_emp_dept(id, name, dept_name)
AS
SELECT ve.id, ved.emp_name, ved.dept_name
FROM view_emp ve
JOIN view_emp_dept ved ON ve.id = ved.emp_id;
四、更新视图的数据
1、新增数据
- 通过视图来新增数据从而在基表中新增数据
INSERT INTO view_emp
VALUES (1, 'Raven');
- 查询视图,多了一条数据
SELECT *
FROM view_emp
ORDER BY id;
通过视图来新增数据.png
- 查看基表
SELECT *
FROM emp
ORDER BY id;
通过视图来新增数据从而在基表中新增数据.png
小结
- 通过视图新增数据,如同在基表新增数据
- 通过视图新增数据,不一定可以给基表新增数据(视图中字段一般是少于基表中字段,如果少于的字段为非空时,就无法通过视图来保存数据)
2、更新数据
UPDATE view_emp
SET name = '111'
WHERE id = 1;
3、删除操作
DELETE
FROM view_emp
WHERE id = 1;
小结
虽然可以更新视图数据,但总的来说,视图作为
虚拟表
,主要用于方便查询
不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的
五、修改、删除视图
1、修改视图
- 方式一
CREATE OR REPLACE VIEW view_emp_dept(emp_id, emp_name, salary, dept_name)
AS
SELECT e.id, e.name, e.salary, t.name
FROM emp e
JOIN dept t ON e.dep_id = t.id;
- 方式二
ALTER VIEW view_emp_dept(emp_id, emp_name, salary, dept_name)
AS
SELECT e.id, e.name, e.salary, t.name
FROM emp e
JOIN dept t ON e.dep_id = t.id;
2、删除视图
- 删除视图只是删除视图的定义,并不会删除基表的数据
DROP VIEW IF EXISTS view_view_emp_dept;
六、小结
1、视图的优点
- 1、操作简单:将经常使用的查询操作定义为视图
- 2、减少数据冗余:视图与实际数据表不一样,它存储的是查询语句。
- 3、数据安全:MySQL将用户对数据的
访问限制
在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。 - 4、适应灵活多变的需求
- 5、能够分解复杂的查询逻辑:数据库中如果存在复杂的查询逻辑,则可以将问题进行拆解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑
2、视图的不足
- 如果实际数据表的结构变更了,就需要及时对相关的视图进行相应的维护。特别是嵌套的视图,维护成本较高。
七、练习
#1. 使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME),员工号(EMPLOYEE_ID),部门 号(DEPARTMENT_ID)
CREATE VIEW employee_vu(last_name, emp_id, dept_id)
AS
SELECT last_name, employee_id, department_id
FROM employee;
#2. 显示视图的结构
DESC employee_vu;
# 3. 查询视图中的全部内容
SELECT *
FROM employee_vu;
# 4. 将视图中的数据限定在部门号是80的范围内
CREATE OR REPLACE VIEW employee_vu(last_name, emp_id, dept_id)
AS
SELECT last_name, employee_id, department_id
FROM employee
WHERE department_id = 80;
# 准备
CREATE TABLE IF NOT EXISTS employee
AS
SELECT *
FROM atguigudb.employees;
USE test;
网友评论