24. 视图

2023-05-22  本文已影响0人  Liuzhl

1. 视图概述

视图是从一个或多个表或视图中导出的表。
视图与表不同,数据来源的表可以称为基本表。
视图是虚表,视图所对应的数据不进行实际存储。
数据库中只存储视图的定义,对视图的数据进行操作是,系统根据视图的定义去操作与视图关联的基本表。
视图一经定义,可以像表一样进行增删改查。
使用视图有以下好处:

  1. 为用户集中数据,简化用户的数据查询和处理
  2. 屏蔽数据库的复杂性,用户不用去了解基本表的数据与结构
  3. 简化用户权限管理
  4. 便于数据共享
  5. 可以重新组织数据以便输出到其他应用程序中

2. 创建视图

CREATE OR REPLACE VIEW 视图名称
AS
SELECT 语句

  1. 视图名称后,可以子定义列名列表,注意列数要和查询出来的结果一致,如果省略,就用查询出来的列名列表

  2. select 语句后,可跟WITH CHECK OPTION对更新数据进行验证。

案例1:创建视图,查询出学生基本信息,以及他所选修的课程名称和成绩

CREATE OR REPLACE VIEW stuInfo
    AS
    SELECT xs.*, kc.name AS courseName,xs_kc.score
    FROM xs,kc,xs_kc
    WHERE xs.stuno=xs_kc.stuno
    AND kc.courseno=xs_kc.course;

注意:MySQL不区分大小写,所以驼峰命名stuInfo,他会保存成stuinfo,不利于识别,所以数据库中多个单词连接,推荐使用下划线规则stu_info


3. 查询视图

查询视图和查询表是一样的
案例2:从stuinfo视图中查询出王林的相关信息。

SELECT *
FROM stuInfo
WHERE name='王林';

4. 更新视图

1. 可更新视图

包含了以下子句的视图不可更新:

  1. 聚合函数
  2. distinct关键字
  3. group by 子句
  4. order by 子句
  5. having 子句
  6. union 子句
  7. 子查询
  8. 多表查询
  9. select 中有不可更新视图
    综上,只剩了where子句和limit。

2. 插入数据

  1. 如果视图是可更新视图,插入视图数据时,会在基本表也插入数据。
  2. 如果视图后面加了WITH CHECK OPTION,在更新数据时会检查新数据是否复合视图定义中where子句的条件
  3. WITH CHECK OPTION只能和可更新视图一起使用

案例3:创建一个视图,只要学生的学号,姓名,专业和学分

CREATE OR REPLACE VIEW stu_credit
    AS
    SELECT stuno, name, major, credit
    FROM xs
    WITH CHECK OPTION;

向stu_credit插入一条数据

INSERT INTO stu_credit
VALUES('081304', '唐三', '锻造系', 55);

没加条件,WITH CHECK OPTION能通过,能添加

创建视图时加了条件

CREATE OR REPLACE VIEW stu_credit2
    AS
    SELECT stuno, name, major, credit
    FROM xs
    WHERE major='计算机'
    WITH CHECK OPTION;

再添加一条数据,major不是计算机

INSERT INTO stu_credit2
VALUES('081305', '小舞', '控制系', 55);

插入失败
有条件是major='计算机',那么就只能插入计算机的人
CHECK OPTION failed 'xscj.stu_credit2

再添加一条数据,major是计算机

INSERT INTO stu_credit2
VALUES('081114', '叶凡', '计算机', 52);

插入成功

插入的时候,还要注意原表的需求,如stuno是主键不能省略

INSERT INTO stu_credit2(name, major, credit)
VALUES('刘备', '计算机', 60);

插入失败
Field of view 'xscj.stu_credit2'
underlying table doesn't have a default value

3. 修改数据

如果数据来自于单表,可以直接修改数据
创建一个视图叫stu_info,包含计算机学生的学号、姓名、专业、学分

CREATE OR REPLACE VIEW stu_info
    AS
    SELECT stuno, name, major, credit
    FROM xs
    WHERE major='计算机'
    WITH CHECK OPTION;

将严红的学分改成50分

UPDATE stu_info
SET credit=50
WHERE name='严红';

当数据来自于多张表,一次只能修改一张表内容
创建一个视图course_info,查询出学生学号,和他所选课程的名字,和学分

CREATE OR REPLACE VIEW course_info
    AS
    SELECT stuno, kc.name, kc.credit
    FROM kc, xs_kc
    WHERE kc.courseno=xs_kc.course;

将801101的学号改为081104,并且计算机基础的学分改为4

UPDATE course_info
SET stuno='081104', credit='4'
WHERE stuno='081101'
AND credit='5';

结果报错:不能同时修改多张基本表
Can not modify more than one base table
through a join view 'xscj.course_info'

只能一张表一张表的修改内容:

UPDATE course_info
SET stuno='081104'
WHERE stuno='081101';

UPDATE course_info
SET credit='4'
WHERE name='计算机基础';

4. 删除数据

删除数据也只能删除单表形成的视图,不能删除多张表组成的视图
将stu_info中诸葛亮的数据删除(成功)

DELETE FROM stu_info
WHERE name='诸葛亮';

删除course_info中的关于计算机基础的信息(失败)

DELETE FROM course_info
WHERE name='计算机基础';

Can not delete from join view 'xscj.course_info'
不能从多表查询得到的视图中删除数据,因为数据来源于多张表


5. 修改视图定义

就是将定义视图时的create or replace 改成 alter


6. 删除视图

语法:DROP VIEW IF EXISTS 视图1,视图2...


上一篇下一篇

猜你喜欢

热点阅读