SQL语言---视图操作

2023-11-20


前言

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


一、视图

1.什么是视图?

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

2.建立视图

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

3.删除视图

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

二、定义视图

1.建立视图

(1)语法格式

CREATE  VIEW 
    <视图名>  [(<列名>  [,<列名>])]
AS  <子查询>
[WITH  CHECK  OPTION];

(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;

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

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

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

在这里插入图片描述

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

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

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

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

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

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

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

CREATE VIEW STU_GRADE_DATA (<学号>,<丢失分数>)
AS
SELECT <学号>,(100-<成绩>)
FROM <成绩表>
WHERE
<课程编号>=(
	SELECT <课程编号>
	FROM <课程表>
	WHERE <课程名称>='数据库');

2.删除视图

(1)语法格式

DROP VIEW <视图名>[CASCADE];

三、查询视图

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

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

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

视图消解法(View Resolution)

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

2.语法使用

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

(1)举例讲解

例子1:查询分数

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

SELECT * 
FROM (
	SELECT <学号>,AVG(<成绩>)
	FROM <成绩表>
	GROUP BY <学号>
) 
AS  STU_GRADE_AVG1 (<学号>,<平均分数>)
WHERE <平均分数>>=90

四、更新视图

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
例子2:插入元组

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

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

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

DELETE
FROM ROOM_2
WHERE F_ROOMNUM=406

UPDATE ROOM_2
SET F_ROOMNUM=302
WHERE F_ROOMID=10506

3.ORACLE的限制

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

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

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

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


总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL语言---视图操作 的相关文章

  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 神秘的 getClobVal()

    我有一个表 AKADMIN 其中包含 XMLTYPE 列 其名称为 XML 我想在该列中使用 getClobVal select t xml getClobVal t xml getClobVal t xml getClobVal as c
  • 如何停止 CTE 中的递归?

    我有一个数据库表 如下所示 ID PredecessorID Data 43b1e103 d8c6 40f9 b031 e5d9ef18a739 null 55f6951b 5ed3 46c8 9ad5 64e496cb521a 43b1e
  • 使用 href 和 php 从 sql 数据库对 html 表进行排序

    我有一个 html 表 其中包含来自 php 吐出的 sql 表的产品数据 我想通过单击表列的标题对数据进行排序 我像这样输出我的表 php product list sql mysql query SELECT FROM products
  • SQL选择符号||是什么意思意思是?

    什么是 在 SQL 中做什么 SELECT a b AS letter 表示字符串连接 不幸的是 字符串连接不能在所有 sql 方言之间完全移植 ANSI SQL 中缀运算符 mysql concat 可变参数函数 caution 表示 逻
  • Google BigQuery:如何使用 SQL 创建新列

    我想在不使用旧版 SQL 的情况下向现有表添加一列 基本的 SQL 语法是 ALTER TABLE table name ADD column name datatype 我格式化了 Google BigQuery 的查询 ALTER TA
  • 单个 sql 查询可以处理 sql server 中的 null 或值日期范围

    使用 SQL Server 2008 我有一个存储过程 其中开始日期和结束日期作为日期范围的输入参数 寻找一个singlesql 查询 其中在 where 子句中有一个开始日期和结束日期 可以处理日期均为空或都有值的两种情况 我不想使用 I
  • MySQL中Join同表临时表

    我喜欢在 MySQL 中加入一个失败的临时表 这个想法很简单 CREATE TEMPORARY TABLE temp table LIKE any other table srsly it does not matter which tab
  • 查询查找表中姓名和号码之间的重复项

    SELECT count lower name number FROM tbl GROUP BY lower name number HAVING count gt 1 输入表1 slno name number 1 aaa 111 2 A
  • Spring Boot如何加入自定义查询

    我需要创建一个端点 该端点按州返回人口普查数据以及城市列表 我目前使用两个端点来获取此数据 目前回应 自定义查询一 censusByState id 1 code 11 name Rond nia statePopulation 18152
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • SQL Server 数据库中的表具有互斥外键的最佳实践

    在这里 我正在寻找针对以下问题的优缺点的最佳解决方案 Entity1 E1 pk 与其他不同的列 Entity2 E2 pk 与其他不同的列 Entity3 E3 pk 与其他不同的列 我需要创建之间的关系Entity1 and Entit
  • 导出 Azure SQL 数据库时出现错误 SQL71501

    导出 Azure SQL 数据库时出现奇怪的错误 导出一直工作正常 直到最近发生一些架构更改 但现在出现错误 SQL71501 该数据库是V12 兼容性级别130 尽管master数据库仍兼容级别 120 该问题似乎是由一个新的表值函数引起
  • 创建用于存储高尔夫球成绩的可扩展数据库架构

    我正在尝试设计一个数据库来存储我所有的朋友和我的高尔夫球成绩 您可能知道 高尔夫得分由 18 洞的个人得分组成 我可以想到两种设计模式的方法 创建一个表 每个洞有一列 例如 h1 到 h18 该表具有引用其他表的 FK player id
  • 当添加列较少时追加到现有 SQLite 表,而不将数据库读入 R

    是否有一些简单的方法 无论是在 SQL 端还是在 R 端 将 data frame 附加到具有更多列的现有表 缺失的列应该用 NA 填充 如果它能够优雅地处理比表 1 列数更多的表 2 那么会加分吗 library RSQLite Crea
  • 如何从 Databricks Delta 表中删除列?

    我最近开始发现 Databricks 并遇到了需要删除增量表的特定列的情况 当我使用 PostgreSQL 时 它就像 ALTER TABLE main metrics table DROP COLUMN metric 1 我正在浏览 Da
  • SQL 解析键值字符串

    我有一个像这样的逗号分隔字符串 key1 value1 key2 value2 key3 value3 key1 value1 1 key2 value2 1 key3 value3 1 我想将它解析成一个如下所示的表 Key1 Key2
  • Oracle - 仅当不存在时才创建索引

    有没有什么方法可以在oracle中创建索引 只有当它们不存在时 就像是 CREATE INDEX IF NOT EXISTS ord customer ix ON orders customer id 仅当索引不存在时添加索引 declar
  • 如何使用to_sql将pandas数据帧写入oracle数据库?

    我是一个新的oracle学习者 我正在尝试将 pandas 数据帧写入 oracle 表中 经过网上研究 我发现代码本身很简单 但我不知道为什么我的代码不起作用 我已经从本地文件中读取了 pandas 数据框 import cx Oracl
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐

  • 关于面试总结13-app测试面试题

    前言 现在面试个测试岗位 都是要求全能的 web 接口 app啥都要会测 那么APP测试一般需要哪些技能呢 面试app测试岗位会被问到哪些问题 怎样让面试管觉得你对APP测试很精通的样子 本篇总结了app测试面试时候经常被问的10个相关问题
  • 解决深度下外接显示屏调整屏幕分辨率的问题

    将以下命令粘贴进去即可 cvt 1366 768 60 1368x768 59 88 Hz CVT hsync 47 79 kHz pclk 85 25 MHz Modeline 1368x768 60 00 85 25 1368 1440
  • 数据库概论笔记第五章(ER模型)

    E R模型 1 建立模型 数据库可以被定义为实体的集合和实体间的关系 实体集 相同类型的实体的集合 属性类型 实体集都拥有的描述性的属性 域domain 每个属性允许值的集合 简单simple属性 不可分割的属性 复合composite属性
  • sqlServer将一个表中的字段更新到另一个表中

    将表2 中 evaluate 字段更新到表1 UPDATE dbo 表1 SET evaluate c evaluate FROM dbo 表2 c dbo 表1 i WHERE c id i indexId
  • vue 权限按钮显示隐藏 (组件法)

    咱们做后台管理系统 肯定避免不了 权限菜单 权限按钮的显示与隐藏 我分享一下 我的实现 创建一个权限显示隐藏的公共组件
  • Android TabLayout设置选中状态标题字体大小,粗细

    最全Tablayout详解https blog csdn net yechaoa article details 122270969 布局文件
  • 分享5个免费、高清、无版权视频素材网站,果断收藏!

    现在各种短视频和自媒体是越来越火了 创作者们对于自己作品的版权也愈发重视 稍不留神你的视频可能就侵权了 例如使用 未经授权的视频素材 都是会涉及到侵权的 其实现在有很多无版权的视频素材网站 可以满足大家一定的创作需求 下面给大家分享5个免费
  • 前端vue实现分页功能

    前端Vue实现分页功能 我们都知道在spring boot项目中安装pagehelper可以实现分页功能 但是在vue中也能在前端实现分页 1 首先 在data中定义以下变量 data return list null listLoadin
  • 【spring aop】连接点(Jointpoint)、切入点(Pointcut)、增强(Advice)、方面/切面(Aspect、Advisor)

    文章目录 前言 1 先来回顾一下AOP中的一些术语 2 增强方式简介 2 1 MethodBeforeAdvice前置增强 2 2 AfterReturningAdvice后置增强 2 3 ThrowsAdvice异常增强 2 4 Meth
  • Unity3d Terrain地形制作系列(一)

    游戏简单地形 地形制作 地形制作 第一步在场景里加载一个地形对象 第二步 我们在属性面板里找到绘制地形 然后选择Set Height 绘制高度 应该我们要制作低凹的效果 所有先让他有个高度 不然是不能实现低凹的效果 如图 我们然后选择绘制地
  • Node.js安装及环境配置(简单易懂全面!)

    参考 https www cnblogs com liuqiyun p 8133904 html https www jianshu com p 13f45e24b1de 目录 一 安装环境 二 安装Node js步骤 三 前期准备 四 开
  • 球迷 如何在Linux纯命令行玩转谷歌浏览器,边看欧洲杯,边看足球宝贝

    大家好 我是Lex 喜欢欺负超人那个Lex 擅长领域 python开发 网络安全渗透 Windows域控Exchange架构 今日重点 1 Linux骚操作 纯命令行玩转GoogleChrome浏览器 2 在Linux命令行打开足球宝贝的搜
  • stm32f103中断函数配置

    一 配置中断优先级NVIC 1 初始化中断结构体在misc h中找到 NVIC InitTypeDef 这个结构体并定义 2 中断优先级分组 在misc c文件里找到 void NVIC PriorityGroupConfig uint32
  • U-Boot启动过程完全分析

    1 1 U Boot工作过程 U Boot启动内核的过程可以分为两个阶段 两个阶段的功能如下 1 第一阶段的功能 硬件设备初始化 加载U Boot第二阶段代码到RAM空间 设置好栈 跳转到第二阶段代码入口 2 第二阶段的功能 初始化本阶段使
  • AE/VAE/DDPM

    Docshttps laiye tech feishu cn docx XRKldiRcZoMDomxwrKtcWD8EnQb基于Diffusion的典型可控图片生成模型在上文扩散模型原理的基础上 本文对目前最前沿的几个可控图像生成模型如D
  • PostgreSQL的AWR(PG_PROFILE)

    PostgreSQL参数配置 如下配置为使用pg profile最基本的配置 shared preload libraries pg stat statements pg stat statements max 10000 pg stat
  • 一个人录制课程--全网独一

    获取方式 见文末 共计八章节 1 php编程 2 web安全基础 3 中间人攻击与抓包 4 正反向代理与端口转发5 提权 6 内网 7 实战8工具 1 PHP编程 1 讲师介绍 http协议 挖掘BUG mp4 2 搭建apache php
  • 贝叶斯网络的python实现:Monty Hall问题的求解

    前两节分别介绍了贝叶斯图模型的必要性以及贝叶斯网络的基本原理 本节将通过一个简单的问题介绍贝叶斯网络的python实现 三门问题 Monty Hall problem 亦称为蒙提霍尔问题 蒙特霍问题或蒙提霍尔悖论 是电视节目中一个简单的游戏
  • Spring Bean的三种注入方式

    Spring Bean的三种注入方式 setter 方法 属性 注入 构造方法注入 注解注入 Resource和 Autowired 自动装配 Autowired 和 Resource Autowired Spring提供的注解 byTyp
  • SQL语言---视图操作

    文章目录 前言 一 视图 1 什么是视图 2 建立视图 3 删除视图 二 定义视图 1 建立视图 1 语法格式 2 举例讲解 例子1 建立房间视图 例子2 基于多表建立视图 例子3 基于视图建立视图 例子4 基于表达式的视图 2 删除视图