MySQL视图的操作
为什么要创建视图?
可以实现查询的简化,而且还会提高安全性
简述视图的概念。
本质上是一种虚拟表,其内容与真实的表相似。包含一系列带有名称的列和行的数据。但是,视图并不在数据库中以存储数据值的形式存在,行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
视图的主要特点有哪些?
① 视图的列可以来自于不同的表,是表的抽象和在逻辑意义上建立的关系。
② 视图是由基本表(实表)产生的表(虚表)
③ 视图的建立和删除不影响基本表
④ 对视图内容的更新(添加,删除和修改)直接影响基本表(只能是单个表的数据)
⑤ 当视图来自多个基本表,不允许添加和删除数据(不可以修改)
sum;avg;count是什么函数?
Sum:求和函数
Avg:求平均函数
Count:求个数函数
group by子句的作用
分组函数
order by子句的作用
进行顺序的升序,降序的
在哪些情况下需要修改视图?通过视图修改基本表有什么好处?
对于已经创建好的表,尤其是有大量数据的表;不需要做额外的工作,例如数据的重新加载等。
在同一个数据库当中视图的名称是不可以相同的删除视图不会影响基本表?
使用create or replace view语句修改视图可以用原视图名称因为create or replace viem是实现替换的功能。
用“学生表”作为数据源创建“学生视图”
创建视图的语法形式:
create view view_name
AS 查询语句
【注意】:因为视图来源于表,所以在创建视图时只需要指明视图名称和视图来源。如果视图中的列直接来源于表的某列,可以直接使用数据源表的列名和数据类型;如果视图的列来源于表的列表达式,则有必要对表达式定义别名,数据类型就是表达式结果的数据类型。
定义“住宿管理视图”
视图 |
数据来源 |
||
视图名 |
别名 |
表名 |
列名 |
学生视图 |
StudentNo |
学生表 |
学生编号 |
StudentName |
学生姓名 |
||
Sex |
性别 |
||
NativePlace |
籍贯 |
||
Birthday |
出生日期 |
(1)不设别名的语法:
create view 学生视图 as
select 学生编号,学生姓名,性别,籍贯,出生日期 from 学生表;
desc 学生视图; drop view 学生视图;
(2)设别名的语法:
create view 学生视图 as select 学生编号 as StudentNo,学生姓名 as StudentName,性别 as Sex,籍贯 as NativePlace,出生日期 as Birthday from 学生表; desc 学生视图; drop view 学生视图;
(3)创建成绩表
create table 成绩表( 班级编号 char(9), 学生编号 char(9), 选修课程编号 char(9), 成绩 decimal (9,2) );
(4)封装使用聚合函数
create view 班级成绩视图 as
select 班级编号,sum(成绩) as 总成绩,count(学生编号) as 参考人数,avg(成绩) as 平均成绩 from 成绩表 group by 班级编号 order by avg(成绩);
3.查看视图
(1)show tables语句查看视图名
use 教学管理数据库 show tables;
(2)show table status语句查看视图详细信息
show table status from 教学管理数据库\G
(3)show create view语句查看视图定义信息
show create view 学生视图\G
(4)describe|desc语句查看视图设计信息
desc 学生视图;
(5)通过系统表查看视图信息
select * from views where table_name='学生视图'\G
4.删除视图
一、 使用create or replace view语句修改视图。
注意:如果数据库中已经拥有“班级成绩视图”,要再次使用以下语句创建视图时,虽然语句没有任何语法错误,但是会出现视图已存在的错误信息。这同时也证明视图名不能重复。本实例在原有基础上增加了计算最高分和最低分,如果删除原有视图重新创建没有必要,我们可以修改该视图。
create view 班级成绩视图 as select 班级编号,sum(成绩) as 总成绩,count(学生编号) as 参考人数,avg(成绩) as 平均成绩,max(成绩) as 最高分,min(成绩) as 最低分 from 成绩表 group by 班级编号 order by avg(成绩);
注:由于数据库中存在班级成绩视图,所以报错。
create or replace view 班级成绩视图 as select 班级编号,sum(成绩) as 总成绩,count(学生编号) as 参考人数,avg(成绩) as 平均成绩,max(成绩) as 最高分,min(成绩) as 最低分 from 成绩表 group by 班级编号 order by avg(成绩) desc; Query OK, 0 rows affected (0.01 sec)
修改视图成功!
【查看视图数据】
select *from 班级成绩视图;
二、使用alter语句修改视图
alter view 班级成绩视图 as select 班级编号, sum(成绩) as 总成绩,count(学生编号) as 参考人数,avg(成绩) as 平均成绩 from 成绩表 group by 班级编号 order by avg(成绩) desc; Query OK, 0 rows affected (0.01 sec)
修改视图成功!
create or replace view 学生视图 -> as -> select 学生编号 as studentno,学生姓名 as studentname -> from 学生表;
二、 通过SQLyog软件修改视图(略,课堂演示)
三、 检索(查询)数据
select *from 班级成绩视图;
四、 添加数据操作
use 教学管理数据库 show tables; desc 学生视图; insert into 学生视图 values('2017001','张三','男','江西南昌','20010903'); insert into 学生视图 values('2017002','李四','女','江西抚州','20011223'); select * from 学生视图; +----------+----------+------+----------+---------------------+ | 学生编号 | 学生姓名 | 性别 | 籍贯 | 出生日期 | +----------+----------+------+----------+---------------------+ | 2017001 | 张三 | 男 | 江西南昌 | 2001-09-03 00:00:00 | | 2017002 | 李四 | 女 | 江西抚州 | 2001-12-23 00:00:00 | +----------+----------+------+----------+---------------------+
添加数据成功!
五、 删除数据操作
delete from 学生视图 where 学生姓名='张三'; select * from 学生视图; +----------+----------+------+----------+---------------------+ | 学生编号 | 学生姓名 | 性别 | 籍贯 | 出生日期 | +----------+----------+------+----------+---------------------+ | 2017002 | 李四 | 女 | 江西抚州 | 2001-12-23 00:00:00 | +----------+----------+------+----------+---------------------+
删除数据成功!
六、 更新数据操作
update 学生视图 set 籍贯='江西南昌' where 学生姓名='李四'; select *from 学生视图; +----------+----------+------+----------+---------------------+ | 学生编号 | 学生姓名 | 性别 | 籍贯 | 出生日期 | +----------+----------+------+----------+---------------------+ | 2017002 | 李四 | 女 | 江西南昌 | 2001-12-23 00:00:00 | +----------+----------+------+----------+---------------------+
更新数据成功!
平均数:select avg(成绩) from 成绩表; 查看最高: select max(成绩) from 成绩表; 查看最低: select min(成绩) from 成绩表; 求和:select sum(成绩) from 成绩表; select count(成绩) from 成绩表; Select 班级编号 ,sum(成绩) from 成绩表 分组:select 选修课程编号,sum(成绩) as 总成绩 from 成绩表 group by 选修课程编号 order by sum(成绩) desc;