SQL-使用视图

2023-11-11

什么是视图?

它们怎样工作?何时使用它们?

如何利用视图简化执行的某些SQL操作?


1. 使用视图的原因

  A.  重用SQL语句。
  B.  简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询。
  C.  使用表的一部分而不是整个表。
  D.  保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
  E.  更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

2. 使用方法

创建视图之后,可以用与表基本相同的方式使用它们。可以对视图执行SELECT操作,过滤和排列数据,将视图联结到其他视图或表,甚至添加和更新数据(添加和更新数据存在某系限制)。

视图仅仅是用来查看存储在别处数据的一种设施。视图本身不包含数据,因此返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。

3. 视图创建的规则和限制

  1. 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
  2. 对于可以创建的视图数目没有限制。
  3. 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
  4. 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构成视图。所允许的嵌套层数在不同的DBMS中有所不同(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其全面测试)。
  5. 许多DBMS禁止在视图查询中使用ORDER BY子句。
  6. 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要
    使用别名。
  7. 视图不能索引,也不能有关联的触发器或默认值。
  8. 有些DBMS把视图作为只读查询,这表示可以从视图检索数据,但不能将数据写回底表层。
  9. 有些DBMS允许创建这样的视图,它不能进行导致行不再属于视图的插入和更新。例如有一个视图,只检索带有电子邮件地址的顾客。如果更新某个顾客,删除他的电子邮件地址,将使该顾客不再属于视图。这是默认行为,而且是允许的,但有的DBMS可能会防止这种情况发生。

4. 创建视图

视图用CREATE VIEW 语句来创建。CREATE VIEW只能用于创建不存在的视图。

视图重命名:
删除视图,可以使用DROP语句,其语法为DROP VIEW viewname;

覆盖(或更新)视图,必须先删除它,然后再重新创建。

① 一个最常见的视图应用是隐藏复杂的SQL,这通常涉及联结:

-- 创建一个名为ProductCustomers的视图,返回已订购了任意产品的所有顾客的列表
-- 创建可重用的视图:创建不绑定特定数据的视图
CREATE VIEW ProductCustomer AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;

-- 检索订购了产品RGAN01的顾客
SELECT cust_name, cust_contact
FROM ProductCustomer
WHERE prod_id = 'RGAN01';

查询结果:

这里写图片描述

可以看出,视图极大地简化了复杂SQL语句的使用。利用视图,可以一次性编写基础的SQL,然后根据需要多次使用。

② 重新格式化检索出的数据:

-- 创建视图:在单个组合计算列中返回供应商名和位置
CREATE VIEW vendorLocations AS
SELECT RIRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
FROM vendors;

-- 检索数据,创建所有的邮票标签
SELECT *
FROM vendorLocations

③ 视图过滤不想要的数据

-- 可以定义customerEMailList视图,过滤没有电子邮件地址的顾客
CREATE VIEW customerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;

-- 使用视图CustomerEMailList, 过滤了cust_email列中具有NULL值的那些行,使它们不被检索出来
SELECT *
FROM customeremaillist;

查询结果:

这里写图片描述

注:从视图检索数据时如果使用了一条WHERE子句,则两组子句将自动组合(一组在视图中,另一组是传递给视图的)。

④ 使用视图与计算字段

-- 使用视图:检索某个订单中的物品,计算每种物品的总价格
CREATE VIEW orderitemsexpanded AS
SELECT order_num,
       prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM orderitems;

-- 检索订单20008的详细内容(上面的输出)
SELECT *
FROM orderitemsexpanded
WHERE order_num = 20008;

查询结果:

这里写图片描述

总结:视图非常好创建,而且很好使用。正确使用视图,可以极大地简化复杂数据的处理。

视图为虚拟表,它们包含的不是数据而是根据需要检索出来的数据。视图提供了一种封装的SELECT语句层次,可以用来简化数据处理,重新格式化或保护基础数据。

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

SQL-使用视图 的相关文章

  • Android 中读取未提交的事务

    我正在进行大量数据库操作 这会向我的数据库添加大约 10 000 条记录 由于这可能需要很长时间 因此最好使用事务 db startTransaction do write operations db setTransactionSucce
  • 无法访问 Big Query 中类型为 ARRAY> 的字段

    我正在尝试在 BigQuery 上使用标准 SQL 方言 即不是旧版 SQL 运行查询 我的查询是 SELECT date hits referer FROM refresh ga sessions xxxxxx LIMIT 1000 但不
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • 使用显式创建表语句与 select into 创建表

    使用显式创建表语句和加载数据与选择数据之间是否存在性能差异 此示例仅显示 2 列 但问题是针对使用非常大的表 下面的示例也使用临时表 尽管我也想知道使用常规表的效果 我认为无论表格类型如何 它们都是相同的 临时表场景 Explicitly
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • value >= all(select v2 ...) 产生与 value = (select max(v2) ...) 不同的结果

    Here https stackoverflow com questions 17026651 query from union of joins 17027784 noredirect 1 comment24611997 17027784
  • 迁移问题:MS SQL > MySQL:插入缓冲区内存

    我在使用 MySQL Workbench 上的内置迁移工具时遇到问题 我正在将一个非常大的数据库从 MS SQL 2014 迁移到 MySQL MS SQL 服务器本地部署在我的 Windows 8 1 桌面上 MySQL 服务器在我的网络
  • 如何选择列值不不同的每一行

    我需要运行一个 select 语句 返回列值不不同的所有行 例如 EmailAddress 例如 如果表格如下所示 CustomerName EmailAddress Aaron email protected cdn cgi l emai
  • 更高效的 LINQ 查询

    有人可以帮我将此查询循环变成高效的 Linq 查询吗 我将其加载到 TreeView 中 因此必须附加每个项目 包含也非常低效 延迟加载项目也不起作用 事实上 这个查询访问数据库的次数比应有的要多 public IQueryable
  • SQLite 使用循环重新编号 ID

    您好 我有一个包含许多插入行的表 我需要按 id 对所有行重新编号并排序 我找到了这段代码 但它对我不起作用 SET i 100 UPDATE main Categories SET ID i i 1 WHERE Name White AL
  • PostgreSQL WHERE 计数条件

    我在 PostgreSQL 中有以下查询 SELECT COUNT a log id AS overall count FROM Log as a License as b WHERE a license id 7 AND a licens
  • 在 Oracle 中如何将多行组合成逗号分隔的列表? [复制]

    这个问题在这里已经有答案了 我有一个简单的查询 select from countries 结果如下 country name Albania Andorra Antigua 我想在一行中返回结果 如下所示 Albania Andorra
  • 如何选择从数据集中进入数据表的列?

    作为数据工作的新手 我希望我能正确地提出这个问题 如何选择从数据集中进入数据表的列 我知道我可以使用 填充数据表 DataTable table dataSet1 Tables 0 但这会引入所有列 如何仅使用某些列填充数据表 我正在使用
  • SQLite:从命令行仅将模式转储到 .sql 文件中

    我正在尝试转储架构test db仅 即没有数据 到名为的文件中schema sql从 OS X 中的命令行 无需启动 sqlite3 我知道我能做到 sqlite3 open test db output schema sql schema
  • 内连接中的排序依据

    我将内部连接放入查询中 我得到了结果 但不知道数据如何输入输出 任何人都可以告诉我内部连接如何匹配数据 下面我显示了一个图像 有两张桌子 一张或两张桌子 根据我的说法 第一行应该是 Mohit 但输出不同 请告诉我 In SQL 输出的顺序
  • MySQL 中的 INSERT 和 UPDATE 有什么区别?

    它似乎INSERT and UPDATE对我做同样的事情 有什么场合我应该使用INSERT代替UPDATE反之亦然 In 增删改查操作 http en wikipedia org wiki Create read update and de
  • 使用 C# 和 ADO.NET SET NOCOUNT ON 并读取消息

    SET NOCOUNT ON 会阻止显示受 Transact SQL 语句或存储过程影响的行数的消息作为结果集的一部分返回 a 如何使用 C 和 ADO NET 读取这些消息 我假设读取这些消息的 C 代码是相同的 无论 T SQL 语句是
  • SQL:计算高于组平均值的值

    如何使用 SQL 计算高于一组平均值的值 例如 我有桌子A with q t 1 5 1 6 1 2 1 8 2 6 2 4 2 3 2 1 第 1 组的平均值为 5 25 组内有两个值高于5 25 8和6 因此高于该组平均值的值的数量为
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod

随机推荐

  • linux 中移动文件_如何在Linux中移动文件

    linux 中移动文件 在Linux中移动文件看似比较简单 但是可用的选项却比大多数人想象的要多 本文向初学者讲授如何在GUI和命令行中移动文件 同时还解释了幕后实际发生的情况 并介绍了许多经验丰富的用户很少探索的命令行选项 搬什么 在研究
  • STM32CubeMX基础例程(小熊派):02.按键轮询检测

    1 准备开发板 这里我选用了一块网红开发板 小熊派 这款板子的人气比较高 还是全国大学生物联网设计竞赛 华为杯 的华为竞赛开发板 我个人也比较喜欢用这款板子 这款板子在放在纸箱吃灰半年之后 被我重新拿了起来 并想借此写博客的机会 整理一下自
  • TensorFlow 的基本概念和使用场景

    TensorFlow 是一个开源的 跨平台的机器学习框架 由 Google 于 2015 年发布 它提供了一套完整的工具链 可以帮助开发者快速构建和训练各种类型的机器学习模型 TensorFlow 的核心概念是张量 Tensor 和计算图
  • 详解代码覆盖率及各语言主流工具

    更多内容关注微信公众号 fullstack888 代码覆盖 英语 Code coverage 是软件测试中的一种度量 描述程序中源代码被测试的比例和程度 所得比例称为代码覆盖率 在做单元测试时 代码覆盖率常常被拿来作为衡量测试好坏的指标 甚
  • 微策略笔试题

    1 堆栈的区别 优劣 以及栈最多层次 一 预备知识 程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 其 操作方式类似于数据结构中的栈 2 堆区
  • mysql 批量修改自增数据_SqlServer Mysql数据库修改自增列的值及相应问题的解决方案...

    SQL Server 平台修改自增列值 由于之前处理过sql server数据库的迁移工作 尝试过其自增列值的变更 但是通过SQL 语句修改自增列值 是严格不允许的 直接报错 无法更新标识列 自增列名称 sql server我测试是2008
  • 微信小程序开发的基本流程

    一 微信小程序简介 1 微信小程序简称小程序 张小龙在微信公开课 Pro 上发布的小程序正式上线 时间是2017年1月9日 2 微信小程序这个词可以分解为 微信 和 小程序 两部分 1 其中 微信 可以理解为 微信中的 指的是小程序的执行环
  • selenium-鼠标操作ActionChains

    actionChains常用操作 move to element 移动到某个元素 悬停 click 点击 double click 双击 context click 右键
  • Eclipse导入项目出现No projects are found to import、中文乱码等问题

    首先说一下导入的步骤 1 打开eclipse 左上角选择File gt 选择Import 2 选择Existing Project into Workspace 3 选择第一行的select root directory 然后选择你要导入包
  • #PRBS# PRBS7高速串行总线的常用测试码型

    PRBS的定义 PRBS Pseudo Random Binary Sequence 伪随机二进制序列 PRBS 码具有 随机 特性 是因为在 PRBS 码流中 二进制数 0 和 1 是随机出现的 但是它又和真正意义上的随机码不同 这种 随
  • 基于GRU门控循环网络的时间序列预测matlab仿真,对比LSTM网络

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 LSTM GRU 2 算法运行软件版本 matlab2022a 3 部分核心程序 构建GRU网络模型 la
  • 如何通过Geth、Node.js和UNIX/PHP访问以太坊节点

    本文旨在说明通过Geth Node js如何访问以太坊节点和UNIX下PHP如何访问以太坊节点 说明如何通过RPC使用此 A 以太坊节点 对于以太坊主网络使用RPC url http 85 214 51 53 8545 对于Ropsten测
  • 线上生产问题系列之-@Async使用不当引发的血案

    现象描述 突然客户群里反馈 线上某功能处理出现严重拥堵 再处理不好就要切换渠道 这个功能就是一个通知功能 客户依赖通知结果去完成他的业务逻辑 但是这个通知非常缓慢 严重拥堵 背景描述 常有这样一个需求场景 为了提高请求的吞吐量 在一个请求链
  • 奇偶调序

    题目描述 输入一个整数数组 调整数组中数字的顺序 使得所有奇数位于数组的前半部分 所有偶数位于数组的后半部分 要求时间复杂度为O n 分析与解法 最容易想到的办法是从头扫描这个数组 每碰到一个偶数 拿出这个数字 并把位于这个数字后面的所有数
  • Scala针对容器的操作(遍历、映射、过滤、归约)案例

    Scala针对容器的操作 遍历 映射 一 遍历操作 二 映射操作 2 1 map方法 2 2 flatmap方法 三 过滤操作 四 归约操作 一 遍历操作 Scala容器的标准遍历方法foreach def foreach U f Elem
  • react+ts+echarts5.x按需导入实现世界地图

    registerMap注册世界地图 1 获取世界地图geoJSON格式的文件 获取地图的渠道 这个步骤很重要 本人找了很久都没找到世界地图的GeoJSON文件 这个网址可以提供 并且也提供了各个国家的GeoJSON a 根据 在线实例 确定
  • 前端js采坑,一个函数中同时有多个ajax()异步请求

    在近期的项目中 问题 多个异步请求执行时 有两个请求的路径是相同的 导致结果只执行当中的一个异步请求 add function vm showList false vm title 新增 vm role deptName null dept
  • 微服务架构-Day7

    学习目标 学会微服务架构 对应项目hotel demo 学习笔记 1 数据聚合 聚合 aggregations 可以让我们极其方便的实现对数据的统计 分析 运算 实现这些统计功能的比数据库的sql要方便的多 而且查询速度非常快 可以实现近实
  • display设为inline-block时引发的高度问题,大坑

    今天在写小程序 点击让这个遮罩层显示 结果一直下移 莫名其妙 解决方案 在元素的CSS中添加 vertical align bottom
  • SQL-使用视图

    什么是视图 它们怎样工作 何时使用它们 如何利用视图简化执行的某些SQL操作 1 使用视图的原因 A 重用SQL语句 B 简化复杂的SQL操作 在编写查询后 可以方便地重用它而不必知道其基本查询 C 使用表的一部分而不是整个表 D 保护数据