• SQL语言---视图操作



    前言

    本文主要讲解了SQL语言的视图操作,并且结合实例来讲解具体的代码操作


    一、视图

    1.什么是视图?

    • 视图是一个虚表,是从一个或几个基本表(或视图)导出的表
    • 它只存放视图的定义,不存放视图对应的数据
    • 同时基表中的数据发生变化,从视图中查询出的数据也随之改变

    2.建立视图

    • 关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句
    • 在对视图查询时,按视图的定义从基本表中将数据查出。
    • 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图

    3.删除视图

    • 删除视图是从数据字典中删除指定的视图定义
    • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
    • 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除

    二、定义视图

    1.建立视图

    (1)语法格式

    CREATE  VIEW 
        <视图名>  [(<列名>  [,<列名>])]
    AS  <子查询>
    [WITH  CHECK  OPTION];
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)举例讲解

    例子1:建立房间视图

    建立本科生宿舍2栋的房间视图(F_BUILDID=2)

    CREATE VIEW ROOM_2
    AS
    SELECT  F_ROOMID, F_ROOMNUM, F_ROOMATTR
    FROM  ROOM_INFORMATION
    WHERE  F_BUILDID=2;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:
    建立ROOM_2视图时,去掉了F_BUILD不等于2的元组,保留了主码F_ROOMID,
    所以ROOM_2为行列子集视图

    例子2:基于多表建立视图

    建立学生成绩视图(包括学号、课程名称、成绩)
    已知两个表

    在这里插入图片描述

    在这里插入图片描述
    由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。

    CREATE VIEW STU_GRADE(<学号>,<课程名称>,<成绩>)
    AS
    SELECT <成绩表.学号>,<成绩表.成绩>,<课程表.课程名称>
    FROM <成绩表>,<课程表>
    WHERE
    <课程表.课程编号>=<成绩表.课程编号>;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    例子3:基于视图建立视图

    建立成绩在80以上的学生成绩视图(包括学号、课程名称、成绩)

    由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。

    CREATE VIEW STU_GRADE_80(<学号>,<课程名称>,<成绩>)
    AS
    SELECT <学号>,<成绩>,<课程名称>
    FROM STU_GRADE
    WHERE
    <成绩>>=80;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    例子4:基于表达式的视图

    建立数据库课程,学生所丢失分数(假设总分100分)的视图(包括学号、丢失分数)

    由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。

    CREATE VIEW STU_GRADE_DATA (<学号>,<丢失分数>)
    AS
    SELECT <学号>,(100-<成绩>)
    FROM <成绩表>
    WHERE
    <课程编号>=(
    	SELECT <课程编号>
    	FROM <课程表>
    	WHERE <课程名称>='数据库');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.删除视图

    (1)语法格式

    DROP VIEW <视图名>[CASCADE];
    
    • 1

    三、查询视图

    1.查询视图与查询基本表的区别

    • 用户角度:查询视图与查询基本表相同,语法格式与使用也基本一致

    • 关系数据库管理系统实现视图查询的方法

    视图消解法(View Resolution)

    1.进行有效性检查
    2.转换成等价的对基本表的查询
    3.执行修正后的查询
    
    • 1
    • 2
    • 3

    2.语法使用

    查询视图与查询基本表相同,语法格式与使用也基本一致
    具体可以参考文章:
    SQL语言—数据的查询

    (1)举例讲解

    例子1:查询分数

    查询平均分数大于90分的学生学号

    SELECT * 
    FROM (
    	SELECT <学号>,AVG(<成绩>)
    	FROM <成绩表>
    	GROUP BY <学号>
    ) 
    AS  STU_GRADE_AVG1 (<学号>,<平均分数>)
    WHERE <平均分数>>=90
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    四、更新视图

    1.更新视图与更新基本表的区别

    • 从用户角度而言, 更新视图与更新基本表的方法相同
    • DBMS实现视图更新的方法
      1.视图实体化法(View Materialization)
      2.视图消解法(View Resolution)
    • 定义视图时指定WITH CHECK OPTION子句后, DBMS在更新视图时会进行检查, 防止用户通过视图对数据进行增加、删除、修改时, 操作不属于视图范围内的基本表数据

    2.语法使用

    更新视图与更新基本表相同,语法格式与使用也基本一致
    具体可以参考文章:
    SQL语言—数据更新

    (1)举例讲解

    例子1:更改视图的单一元组

    将ROOM_2视图中的F_ROOMID为10506的F_ROOMNUM更改为302

    UPDATE ROOM_2
    SET F_ROOMNUM=302
    WHERE F_ROOMID=10506
    
    • 1
    • 2
    • 3
    例子2:插入元组

    将ROOM_2视图中的插入一条新数据,其中F_ROOMID为10807,F_ROOMNUM为508,F_ROOMATTR为学生寝室。

    INSERT
    INTO ROOM_2
    VALUES(10807,508,’学生寝室’)
    
    • 1
    • 2
    • 3
    例子3:删除元组

    将ROOM_2视图中的F_ROOMNUM为406房间删除

    DELETE
    FROM ROOM_2
    WHERE F_ROOMNUM=406
    
    
    • 1
    • 2
    • 3
    • 4
    UPDATE ROOM_2
    SET F_ROOMNUM=302
    WHERE F_ROOMID=10506
    
    • 1
    • 2
    • 3

    3.ORACLE的限制

    • 简单视图可以执行DML操作;

    • 在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;

    • 在视图不出现下列情况时可通过视图修改基表数据或插入数据:
      1.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
      2.使用表达式定义的列;
      3.ROWNUM伪列。
      4.基表中未在视图中选择的其他列定义为非空且无默认值。

    • 一个不允许更新的视图上定义的视图也不允许更新


    总结

    文章不妥之处请读者包涵指正
    其它关于SQL语法的知识可以看文章:
    SQL语言概述与SQL语言的数据定义
    SQL语言—数据的查询
    SQL语言—数据更新

  • 相关阅读:
    React报错之react component changing uncontrolled input
    把jar包打成docker镜像并推送到Docker Hub
    JavaScript基础语法(流程控制语句)
    SpringAOP补充-通知获取类型
    Python 标准库之pathlib,路径操作
    英语四级核心词,记住这些就够了
    代理模式-P19
    【多线程(四)】线程状态介绍、线程池基本原理、Executors默认线程池、ThreadPoolExecutor线程池
    2.3IP详解及配置
    基于JSP的保险业务管理系统【数据库设计、源码、开题报告】
  • 原文地址:https://blog.csdn.net/weixin_52042488/article/details/127129820