SQL数据库语言基础之SqlServer视图的创建、修改与视图数据的增删改查

2023-05-16

文章目录

    • 一、认识视图
    • 二、创建、查询视图
    • 三、修改、删除视图
    • 四、修改视图数据(与操作表一样,只是把table换成view)

一、认识视图

1、视图的理解
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据 。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表 。

从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表 一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等,但是这些对视图的操作是会影响到表的原数据。

2、视图的作用
(1)筛选表中的行;

(2)降低数据库的复杂程度;

(3)将多个物理数据库抽象为一个逻辑数据库;

(4)防止未经许可的用户访问敏感数据。

(5)创建视图时,将列名改为有意义的名称,使用户更容易理解列所代表的内容。

(6)使获得数据更容易,通过创建视图来方便用户访问多个表中的数据。

3、视图的注意事项
(1)只能在当前数据库中创建视图;
(2)一个视图最多可以引用1024个列;
(3)不能在视图上创建全文索引,不能在规则、默认的定义中引用视图;
(4)如果视图中某一列是函数、数学表达式、常量或者来自多个表的列名相同,则必须为列定义名称;
(5)当视图引用基表或视图被删除,该视图也不能再被使用;
(6)视图最多可以嵌套32层;
(7)视图的命名必须遵循标识符命名规则,不可与表同名。

二、创建、查询视图

1、语法格式

CREATE VIEW 视图名(字段名1,字段名2……)
AS 
SELECT 
[with check option]

字段名的选是给视图中选取字段的别名,常用于多表连接时。
[with check option]用于限制用户的操作,比如创建加密视图。

2、测试操作
(1)创建STU表中的SNO,SNAME字段组成的视图

CREATE VIEW STU_V
AS
SELECT SNO,SNAME FROM STU

--查询视图
SELECT * FROM STU_V

(2)创建所有男生信息的学号、姓名、班级组成的视图

--创建视图
CREATE VIEW STU_V2(学号,姓名,班级)
AS
SELECT SNO,SNAME,CLASS FROM STU WHERE SEX='男'

--查询视图
SELECT * FROM STU_V2
--查询原表
SELECT * FROM STU

2.2.1
(3)别名的使用也可以用原来的AS

CREATE VIEW STU_V2
AS
SELECT SNO AS 学号,SNAME AS 姓名,CLASS AS 班级 FROM STU WHERE SEX='男'

3、创建视图注意事项
(1)不能包括COMPUTER、COMPUTER BY语句
(2)不能有ORDER BY语句(除非使用TOP关键字)
(3)不能有OPTION关键字
(4)不能有INTO关键字
(5)不能使用临时表、表变量

4、视图使用ORDER BY 例外

CREATE VIEW STU_V3(学号,姓名,班级)
AS
SELECT TOP 4 SNO,SNAME,CLASS FROM STU WHERE SEX='男'
ORDER BY SNO DESC

--查询视图
SELECT * FROM STU_V3

此处的TOP 4表示选择前4条记录,若为1,则是前1条记录。不加TOP,则会报错。
2.4.1

5、查询数据库中的所有视图

SELECT * FROM INFORMATION_SCHEMA.VIEWS

6、创建加密视图(encryption)

CREATE VIEW STU_V4(学号,姓名,班级)
with encryption
AS
SELECT SNO,SNAME,CLASS FROM STU WHERE SEX='男'
--查询所有视图
SELECT * FROM INFORMATION_SCHEMA.VIEWS

2.6.1

三、修改、删除视图

1、修改视图(ALTER VIEW)
(1)语法格式

ALTER VIEW 视图名(字段名1,字段名2……)
AS 
SELECT 
[with check option]

(2)原视图STU_V2
3.1.1
(3)只留一个班级的别名,并且只检索女生信息

--修改前
SELECT * FROM STU_V2

--修改
ALTER VIEW STU_V2
AS
SELECT SNO,SNAME,CLASS as 班级
FROM STU
WHERE SEX='女'

--修改后
SELECT * FROM STU_V2

3.1.2

2、删除视图(DROP VIEW)

--判断:如果存在指定视图则删除
IF EXISTS (SELECT * FROM STU WHERE name='STU_V3')  --单引号里面为视图名称
    DROP VIEW STU_V3 --视图名称

四、修改视图数据(与操作表一样,只是把table换成view)

1、测试练习

--创建视图并修改字段的别名
CREATE VIEW STU_V5(学号,姓名,性别,班级,出生日期,联系电话)
AS 
SELECT * FROM STU
SELECT * FROM STU_V5  --查询一下创建的视图

--插入视图数据
INSERT INTO STU_V5(学号,姓名,性别)
VALUES('0477','莫卡','女')
SELECT * FROM STU_V5  --查询视图,数据已修改
SELECT * FROM STU  --查询原表,原表的数据也被修改了

--修改视图的数据值
UPDATE STU_V5
SET 班级='挖掘06'
WHERE 姓名='莫卡'
SELECT * FROM STU_V5  --查询修改了值的视图

--删除视图的行数据
DELETE FROM STU_V5
WHERE 姓名='莫卡'
SELECT * FROM STU_V5  --查询删除了值的视图

2、注意事项
当需要更新(UPDATE)视图数据时,
若视图需要值函数返回结果,则不能更新;
若查询的视图所包含的列来自多个表也不能更新;
不能更新GROUP BY和DISTINCT的视图;
不能更新存储过程返回的结果。

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

SQL数据库语言基础之SqlServer视图的创建、修改与视图数据的增删改查 的相关文章

  • 使用条件 SQL 统计每月汇总记录

    我有一张桌子 我们就叫他们桌子吧SUMMARYDATA NIP NAME DEPARTMENT STATUSIN STATUSOUT TOTALLOSTTIME A1 ARIA BB 2020 01 21 08 06 23 2020 01
  • 如何计算 Postgres 上图表中所有连接的节点(行)?

    我的桌子有account id and device id One account id可以有多个device ids 反之亦然 我正在尝试计算每个连接的多对多关系的深度 Ex account id device id 1 10 1 11
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • 自动提取数据 - Oracle SQL Developer

    我通过 SQL Developer 连接到 Oracle 数据库 我想编写一个返回每月数据集的查询 然后将该数据提取到分隔文本文件中 我知道如何做到这一点就好了 我想知道是否有一种方法可以编写一个脚本来运行查询并在一年内逐月提取数据 这样我
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • 标量子查询包含多行

    我正在使用 H2 数据库并想要移动一些数据 为此 我创建了以下查询 UPDATE CUSTOMER SET EMAIL SELECT service EMAIL FROM CUSTOMER SERVICE AS service INNER
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 从字符串中删除某些字符

    我正在尝试删除某些字符 目前我的输出如下cityname district但我想删除cityname SELECT Ort FROM dbo tblOrtsteileGeo WHERE GKZ 06440004 Output B dinge
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • SQL Server:将表达式转换为数据类型 bigint 时出现算术溢出错误

    这是我的查询顺序 SELECT CASE WHEN BarCode IS NOT NULL AND ExternelBarCode IS NULL THEN BarCode WHEN BarCode IS NULL AND Externel
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013

随机推荐