一、视图
1.常见的数据库对象
①表table:表是存储数据的逻辑单元,行和列形式存在。列是字段,行是记录。
②数据字典:系统表,存放数据库相关信息的表。系统表的数据通常是数据库系统维护。
③约束constraint:执行数据校验规则,用于保证数据完整性
④视图view:一个或多个表里的数据的逻辑显示,视图不存储数据
⑤索引index:用于提高查询性能,相当于书的目录。
⑥存储过程procedure:完成一次完整的业务处理,没有返回值。但可以传出参数将多个值传给调用函数
⑦存储函数:用于完成一次的特定计算,具有一个返回值
⑧触发器:相当于一个事件监听器,当数据库发生特定事件时,触发器被触。完成相应的处理。
2.视图概述
2.1为什么使用视图?
视图是使用表的一部分,也可以针对不同的用户制定不同的查询视图。
2.2 视图的理解
①视图是一种虚拟表,不具有数据的,占用很少的空间。
②视图建立在已有表的基础上,视图赖以建立的表是基表。
③视图的数据进行增加、删除和修改,数据表的数据也发生变化。
④把视图理解为存储起来的select语句
⑤视图应用在大型项目,不针对于小型项目
⑥视图优点简化查询,控制数据的访问
3.创建视图
3.1创建单表视图
create view 视图名称
as
select 语句
举例①
create view vu_emp1
AS
select employee_id,last_name,salary
from emps
查看视图
select * from vu_emp1;
举例② 查询语句字段起别名作为视图的字段名
create view vu_emp2
as
select employee_id emp_id,last_name lname,salary
from emps
where salary>8000;
查看视图
select * from vu_emp2;
举例③起别名 视图和查询的字段名依次匹配
create view vu_emp3(emp_id,lname,monthly_sal)
as
select employee_id,last_name,salary
from emps
where salary>8000;
查看视图
select * from vu_emp3;
举例④视图中的字段在基表中没有对应的
create view vu_emp_sal
as
select department_id,avg(salary) avg_sal
from emps
where department_id is not NULL
group by department_id;
查看视图
select * from vu_emp_sal;
3.2创建多表联合视图
create view vu_emp_dept
as
select e.employee_id,e.department_id,d.department_name
from emps e
join depts d on e.department_id=d.department_id;
select * from vu_emp_dept;
查看视图
select * from vu_emp_dept;
3.3利用视图对数据进行格式化:员工姓名(部门名)
create view vu_lname_empname
as
select concat(e.last_name,'(',d.department_name,')'),e.salary
from emps e
join depts d on e.department_id=d.department_id;
查看视图
select * from vu_lname_empname;
3.4 基于视图创建视图
select * from vu_emp1;
基于vu_emp1创建视图
create view vu_emp4
as
select employee_id,last_name
from vu_emp1
查看vu_emp4
select * from vu_emp4
4.查看视图
①查看数据库的表对象、视图对象
show tables;
②查看视图的结构
desc 视图名称
③查看视图的属性信息
# 查看视图信息(显示数据表的存储引擎、版本、数据行数和数据大小等)
执行结果显示,注释Comment为VIEW,说明该表为视图,其他的信息为NULL,说明这是一个虚表。
show table status like '视图名称'
④视图的详细定义信息
show create view 视图名称
5.更新视图的数据—跟更新表格一样
举例①修改
update vu_emp1
set salary = 20000
where employee_id = 101;
视图和表格同时修改
举例②删除
delete
from vu_emp1
where employee_id=101
5.1不可更新视图的情况
①视图的更新必须要和基表存在一对一的关系
②出现多表查询的视图,聚合函数…
虽然可以更新视图数据,但总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的
数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。
6.修改、删除视图
6.1修改视图
ALTER VIEW 视图名称
AS
查询语句
6.2删除视图
DROP VIEW 视图名;
7.总结
7.1视图的优点
①简化查询,操作简单
②减少数据的冗余
在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源,减少了数据冗余。
③数据安全
MySQL将用户对数据的 访问限制 在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。这也可以理解为视图具有 隔离性 。视图相当于在用户和实际的数据表之间加了一层虚拟表。
4. 适应灵活多变的需求
5. 能够分解复杂的查询逻辑
7.2视图的缺点
①表的结构发生变化,对应的视图需要及时进行维护。特别是嵌套视图,维护复杂,可读性不好。
②视图过多,维护成本高
8课后练习
练习一
#1. 使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME),员工号(EMPLOYEE_ID),部门号(DEPARTMENT_ID)
create view employee_vu
as
select last_name,employee_id,department_id
from emps
#2. 显示视图的结构
desc employee_vu
#3. 查询视图中的全部内容
select * from employee_vu
#4. 将视图中的数据限定在部门号是80的范围内
alter view employee_vu
as
select last_name,employee_id,department_id
from emps
where department_id=80
练习二
CREATE TABLE emps
AS
SELECT * FROM atguigudb.employees;
#1. 创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
create view emp_v1
as
select last_name,salary,email,phone_number
from emps
where phone_number like '011%'
#2. 要求将视图 emp_v1 修改为查询电话号码以‘011’开头的并且邮箱中包含 e 字符的员工姓名和邮箱、电话号码
alter view emp_v1
as
select last_name,salary,email,phone_number
from emps
where email like '%e%' and phone_number like '011%'
#3. 向 emp_v1 插入一条记录,是否可以?
失败了,在表里有些非空字段没有默认值,在视图里面没有出现此字段
#4. 修改emp_v1中员工的工资,每人涨薪1000
update emp_v1
set salary=salary+1000
#5. 删除emp_v1中姓名为Olsen的员工
delete from emp_v1
where last_name='Olsen'
#6. 创建视图emp_v2,要求查询部门的最高工资高于 12000 的部门id和其最高工资
create view emp_v2
as
select department_id,max(salary)
from emps
group by department_id having max(salary)>12000
#7. 向 emp_v2 中插入一条记录,是否可以?
不可以,聚合函数
#8. 删除刚才的emp_v2 和 emp_v1
drop view emp_v2,emp_v1