SQL Server 数据库的查询和视图
SQL Server视图定义信息的查询

通过视图来访问数据,其优点是非常明显的。
如可以起到数据保密、保证数据的逻辑独立性、简化查询操作等。
但是,话说回来,SQL Server数据库中的视图并不是万能的,他与表这个基本对象还是有重大的区别。
在使用视图的时候,需要遵守四大限制。
限制条件一:视图数据的更改。
当用户更新视图中的数据时,其实更改的是其对应的数据表的数据。
无论是对视图中的数据进行更改,还是在视图中插入或者删除数据,都是类似的道理。
但是,不是所有视图都可以进行更改。
如下面的这些视图,在SQL Server数据库中就不能够直接对其内容进行更新,否则,系统会拒绝这种非法的操作。
如在一个视图中,若采用Group By子句,对视图中的内容进行了汇总。
则用户就不能够对这张视图进行更新。
这主要是因为采用Group By子句对查询结果进行汇总在后,视图中就会丢失这条纪录的物理存储位置。
如此,系统就无法找到需要更新的纪录。
若用户想要在视图中更改数据,则数据库管理员就不能够在视图中添加这个Group BY分组语句。
如不能够使用Distinct关键字。
这个关键字的用途就是去除重复的纪录。
如没有添加这个关键字的时候,视图查询出来的纪录有250条。
添加了这个关键字后,数据库就会剔除重复的纪录,只显示不重复的50条纪录。
此时,若用户要改变其中一个数据,则数据库就不知道其到底需要更改哪条纪录。
因为视图中看起来只有一条纪录,而在基础表中可能对有的纪录有几十条。
为此,若在视图中采用了Distinct关键字的话,就无法对视图中的内容进行更改。
如果在视图中有AVG、MAX等函数,则也不能够对其进行更新。
如在一张视图中,其采用了SUN函数来汇总员工的工资时,此时,就不能够对这张表进行更新。
这是数据库为了保障数据一致性所添加的限制条件。
可见,试图虽然方便、安全,但是,其仍然不能够代替表的地位。
当需要对一些表中的数据进行更新时,我们往往更多的通过对表的操作来完成。
因为对视图内容进行直接更改的话,需要遵守一些限制条件。
实现SQL Server数据库中的视图和查询

§2 创建视图
创建视图时应该注意以下情况: ①只能在当前数据库中创建视图。 ②视图中最多只能引用1024列。 ③如果视图引用的基表或者视图被删除, 则该视图不能再被使用,直到创建新的基表或 者视图。 ④如果视图中某一列是函数、数学表达式、 常量或者来自多个表的列名相同,则必须为列 定义名称。
⑤当视图所引用不同基表的列中有相同列定列的别名。 ⑥不能在视图上创建索引,不能在规则、 缺省、触发器的定义中引用视图。 ⑦当通过视图查询数据时,SQL Server要 检查以确保语句中涉及的所有数据库对象存在, 而且数据修改语句不能违反数据完整性规则。 ⑧视图的名称必须遵循标识符的规则,且 对每个用户必须是唯一的。此外,该名称不得 与该用户拥有的任何表的名称相同。
(6)WITH CHECK OPTION:强制视图上 执行的所有数据修改语句都必须符合由 SELECT查询语句设置的准则。通过视图修改 数据行时,WITH CHECK OPTION 可确保提 交修改后,仍可通过视图看到修改的数据。 ( 7 ) WITH ENCRYPTION : 表 示 SQL Server 加密包含 CREATE VIEW 语句文本的 系统表列。使用 WITH ENCRYPTION 可防止 将视图作为 SQL Server 复制的一部分发布。
(3)定义视图的语句是一个 SELECT查询语句。 该语句可以使用多个表或其它视图。若要从创 建视图的 SELECT 子句所引用的对象中选择, 必须具有适当的权限。视图不必是具体某个表 的行和列的简单子集。可以用具有任意复杂性 的 SELECT 子句,使用多个表或其它视图来创 建视图。 (4)在索引视图定义中,SELECT 语句必须是 单个表的语句或带有可选聚合的多表 JOIN。
SELECT子句
实验四:SQL Serve中的嵌套查询、数据更新和视图

实验四:SQL Serve中的嵌套查询、数据更新和视图一、实验目的:1.掌握SQL语言的核心语句--SELECT语句的使用,具体为在SQL Server2005环境下采用Transact-SQL实现嵌套查询。
2.掌握采用Transact-SQL实现数据更新。
3.掌握采用Transact-SQL实现视图的定义、删除、查询与更新。
二、实验内容按照《数据库系统概论》P82页中的学生课程数据库和P75页中的SPJ数据库完成以下查询(一)嵌套查询中的存在量词1.查询还没有给任何工程供应过零件的供应商号sno和供应商名称sname,用带EXISTS谓词的子查询或相关联子查询实现。
select sno,sname from s where not exists(select*from spj where spj.sno = s.sno)2.查询使用了全部零件的工程号JNO,用带EXISTS谓词的子查询实现。
select jno from j where not exists(select*from p where not exists(select *from spj where p.pno = spj.pno and j.jno = spj.jno))3.查询至少选修了’1’号和’2’号课程的学生学号, 用带EXISTS谓词的子查询或自身连接查询实现。
(1)select sno from sc where sno in(select sno from sc where cno='1') and cno='2'(2)select sno from sc where cno='1'intersect select sno from sc where cno='2'(3) select sno from sc sc1 where exists(select*from sc sc2 where sc1.sno = sc2.sno and o ='1'and o ='2')附加题:查询至少用了供应商S1所供应的所有零件的工程号JNO,用带EXISTS谓词的子查询实现。
实现SQLServer数据库中的视图和查询

2.视图
视图看上去同表似乎一模一样,具有一组命名的 字段和数据项,但它其实是一个虚拟的表,在物理上 并不实际存在。视图是由查询数据库表产生的,它限 制了用户能看到和修改的数据。视图一旦定义后,就 可以和基本表一样被查询、被删除,也可以在一个视 图基础上再定义新的视图。 视图兼有表和查询的特点:与查询相类似的是, 视图可以用来从一个或多个相关联的表或视图中提取 有用信息;与表相类似的是,视图可以用来更新其中 的信息,并将更新结果永久保存在磁盘上。我们可以 用视图使数据暂时从数据库中分离成为游离数据,以 便在主系统之外收集和修改数据。
3、使用DROP VIEW删除视图 删除视图的语法格式如下。 DROP VIEW 视图名1,…,视图名n 使用该语句一次可以删除多个视图。
§4 通过视图访问数据 使用视图管理表中的数据包括插入、更新 和删除三种操作,在操作时要注意以下几点: 修改视图中的数据时,可以对基于两个以 上基表或视图的视图进行修改,但是不能同时 影响两个或者多个基表,每次修改都只能影响 一个基表。 不能修改那些通过计算得到的列,例如年龄 和平均分等。 若在创建视图时定义了 WITH CHECK OPTION选项,那么使用视图修改基表中的数 据时,必须保证修改后的数据满足定义视图的 限制条件。
二、视图的优缺点
当对通过视图看到的数据进行修改时,相应 的基本表的数据也要发生变化,同时,若基本表 的数据发生变化,则这种变化也可以自动地反映 到视图中。 视图有很多优点,主要表现在: 1、视点集中 视图集中即是使用户只关心它感兴趣的某些 特定数据和他们所负责的特定任务。这样通过只 允许用户看到视图中所定义的数据而不是视图引 用表中的数据而提高了数据的安全性。
SQL Server视图概述

SQL Server视图概述摘要:本文介绍了视图的定义、视图的使用和视图的作用。
视图是关系数据库中提供给用户以多角度观察数据库中数据的非常重要的机制。
视图是一个查询结果集和表的结构类似,但它是一个虚表,数据的物理存放位置仍在基本表中。
关键词:视图,视图定义,视图使用引言视图是由基于一个或多个表或其他视图上的一个查询所定义的虚拟表,视图仅仅保存该查询的具体定义,而不包含任何数据。
视图也是一个表,有表名,表中包含若干列,各个列有列名。
视图与CREATE TABLE语句所建立的表具有本质的区别,CREATE TABLE语句所建立的表和表中的数据是实实在在存储在磁盘上的,通常称为基本表。
视图仅仅是一些SQL查询语句的集合,不需要像基本表那样在数据库中占据物理空间。
视图提供了一种访问基本表数据的方法,可以按照不同的要求从数据表中提取数据。
数据库用户访问视图时,数据库系统会自动执行该视图中包含的查询语句,同时返回查询结果。
一、定义视图创建视图时需要注意以下几点:只能在当前数据库中创建视图,且视图名称必须惟一,不可以和基本表同名。
不能将规则和默认值绑定在视图上。
定义视图的查询语句不能使用ORDER BY 子句和DISTINCT短语,如果需要排序,则在视图定义后,对视图查询时再进行排序。
创建视图的SQL语句为CREATE VIEW语句,其基本语法格式为:CREATE VIEW []AS说明:1.指定视图的名称。
2.指定在视图中包含的列名,可以省略。
如果省略,则视图的列名与SELECT子句中的列名相同。
有两种情况视图列名不可以省略:视图由多个表连接得到,在不同的表中存在同名列,则需指定列名;当视图的列名为表达式或库函数的计算结果时,而不是单纯的属性名时,则需指明列名。
例1 创建计算机系读者的视图,视图名为ST1。
CREATE VIEW ST1ASSELECT *FROM ReaderDetail WHERE ReaderDep=’计算机系’说明:视图创建后,只在数据字典中存放视图的定义,而其中的子查询SELECT 语句并不执行。
SQL Server数据库教程-视图

查询结果如图5所示。
SQL Server数据库教程
•
2 查询视图
【例4】 查询通信专业学生的学号、姓名、课程名。
USE stsc SELECT stno, stname, cname FROM st_comm 该语句对st_comm视图进行查询,查询结果如图6所示。
SQL Server数据库教程
•
4 修改视图定义和重命名视图
4.1修改视图定义
1. 使用图形界面方式修改视图定义 【 例 10】 使 用 图 形 界 面 方 式 修 改 例 1 创 建 的 视 图 st_comm,以降序显示成绩。 (1)启动SQL Server Management Studio,在对象资源 管理器中,展开“数据库”节点,选中“stsc”数据库,展开 该数据库节点,展开“视图”,选择“dbo. st_comm”,单击 鼠标右键,在弹出的快捷菜单中选择“设计”命令。 (2)进入“视图设计器”窗口,如图13所示,可以查 看和修改视图结构,其操和创建视图的类似。
SQL Server数据库教程
•
2 查询视图
使用SELECT语句对sc_avg视图进行查 询:
USE stsc SELECT * FROM sc_avg
查询结果如图7所示。
SQL Server数据库教程
•
3 更新视图
3.1 可更新视图
【例6】 在stsc数据库中,以student为基表,创建专业 为计算机的可更新视图st_cp。
语法格式:
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ] [ WITH <view_attribute>[,…n ] ] AS select_statement [ WITH CHECK OPTION ]
SQL Server 数据库的查询和视图

4.1.1 选择查询结果输出列
(1)SUM和AVG。 SUM和AVG分别用于求表达式中所有值项的总和与平均值,格式为: SUM /AVG ( [ ALL | DISTINCT ] 表达式 ) 其中,“表达式”可以是常量、列、函数或表达式,其数据类型只能是int、 smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney。 【例4.8】 求所有课程的总学分和选修101课程的学生的平均成绩。 T-SQL命令如下,执行结果如图4.6所示。 SELECT SUM(学分) AS '总学分' FROM kcb SELECT AVG(成绩) AS '计算机基础平均成绩' FROM cjb WHERE 课程号 = '101'
4.1.2 选择查询条件:WHERE子句
2.模式匹配 LIKE谓词用于指出字符串是否与指定的字符串相匹配,返回逻辑值TRUE或 FALSE。格式为: 表达式 [ NOT ] LIKE 模式串 [ ESCAPE 转义符 ] 说明:
(1)表达式:一般为字符串表达式,在查询语句中可以是列名。 (2)模式串:可以使用通配符,表4.2列出了LIKE谓词可以使用的通配符及其说明。 (3)转义符:应为有效的SQL Server字符,没有默认值,且必须为单个字符。当模式串 中含有与通配符相同的字符时,应通过该字符前的转义符指明其为模式串中的一个匹配字符。 使用ESCAPE可指定转义符。 (4)NOT LIKE:使用NOT LIKE与LIKE的作用相反。
4.1.1 选择查询结果输出列
4.替换查询结果中的数据 在对表进行查询时,有时希望对所查询的某些列得到的数据进行变换。 要替换查询结果中的数据,则可使用CASE表达式,格式为: CASE WHEN 条件1 THEN 表达式1 WHEN 条件2 THEN 表达式2 …… ELSE 表达式 END
SQL_Server实用教程(第三版)实验4_数据库的查询和视图

实验四数据库的查询和视图T4.1 数据库的查询1.目的与要求(1)掌握select语句的基本语法;(2)掌握子查询的表示(3)掌握连接查询的表示(4)掌握select语句的group by子句的作用和使用方法(5)掌握select语句的order by子句的作用和使用方法2 实验准备(1)了解SELECT语句的基本语法格式;(2)了解SELECT语句的执行方法;(3)了解子查询的表示方法;(4)了解连接查询的表示;(5)了解SELECT语句的GROUPBY子句的作用和使用方法;(6)了解SELECT语句的ORDERBY子句的作用;3实验内容SELECT语句的基本使用。
①对于实验2给出的数据库表结构,查询每个雇员的所有数据。
新建一个查询,在查询分析器中输入如下语句并执行:USEYGGLGOSELECT *FROM Employees【思考与练习】用SELECT语句查询Departments和Salary表中所有的数据信息。
用SELECT语句查询Employees表中每个雇员的地址和电话。
新建一个查询,在查询分析器中输入如下语句并执行:Use YGGLGOSELECT Address PhoneNumberFROM Employees【思考与练习】a.用SELECT语句查询Deparments和Salary表的一列或若干列。
b.查询Employees表中的部门号和性别,要求使用DISTINCT消除重复行。
c.查询EmployeeID为000001的雇员的地址和电话。
Use YGGLGOSELECT Address PhoneNumberFROM EmployeesWHERE EmployeeID=’000001’【思考与练习】a.查询月收入高于2000元的员工号码。
b.查询1970年以后出生的员工的姓名和住址。
c.查询所有财务部的员工的号码和姓名。
查询Employees表中女雇员的地址和电话,使用AS子句将结果中各列的标题分别指定为地址、电话。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.选择一个表中指定的列 可选择一个表中的部分列,各列名之间要以逗号分隔。 【例4.2】 查询xsb表中计算机专业学生的学号、姓名和总学分。 T-SQL命令如下: SELECT 学号, 姓名, 总学分 FROM xsb WHERE 专业 = '计算机'
4.1.1 选择查询结果输出列
3.定义列别名 当希望查询结果中的列使用自己选择的列标题时,可以AS更改列标题名,该列 标题称为该列的别名。 【例4.3】 查询xsb表中计算机系同学的学号、姓名和总学分,查询结果中各列 的标题分别指定为number、name和mark。 T-SQL命令如下: SELECT 学号 AS number, 姓名 AS name, 总学分 AS mark FROM xsb WHERE 专业= '计算机' 执行结果如图4.2所示。
4.1.1 选择查询结果输出列
图4.6 执行结果
4.1.1 选择查询结果输出列
(2)MAX和MIN。 MAX和MIN分别用于求表达式中所有值项的最大值与最小值,语法格式为: MAX / MIN ( [ ALL | DISTINCT ] 表达式 ) 其中,“表达式”可以是常量、列、函数或表达式,其数据类型可以是数字、字 符和时间日期类型。 【例4.9】 求选修101课程的学生的最高分和最低分。
【例4.4】 查询xsb表中计算机系各同学的学号、姓名和总学分,对其总学分按 以下规则进行替换,列标题更改为“等级”。 若总学分为空值,则替换为“尚未选课”; 若总学分小于50,则替换为“不及格”; 若总学分在50与52之间,则替换为“合格”; 若总学分大于52,则替换为“优秀”。 T-SQL命令如下: SELECT 学号, 姓名, 等级= CASE WHEN 总学分 IS NULL THEN '尚未选课' WHEN 总学分 < 50 THEN '不及格' WHEN 总学分 >=50 and 总学分<=52 THEN '合格' ELSE '优秀' END FROM xsb WHERE 专业= '计算机'
通 配 符 % _(下画线) [] [^] 代表倒数 代表单个字符 指定范围(如[a-f]、[0-9])或集合(如[abcdef])中的任何单个字符 指定不属于范围(如 [^a-f]、[^0-9])或集合(如[^abcdef])的任何单个字符 说 明
4.1.2 选择查询条件:WHERE子句
【例4.12】 查询xsb表中姓“王”且单名的学生情况。 T-SQL命令如下,执行结果如图4.9所示。 SELECT * FROM xsb WHERE 姓名 LIKE '王_ '
4.1.1 选择查询结果输出列
7.限制结果集返回行数 如果查询结果集的行数非常多,那么可以使用TOP选项限制其返回的行数。格式 为: [ TOP 表达式 [ PERCENT ] [ WITH TIES ] ] 其中,“表达式”可以是指定数目或百分比数目的行。若带PERCENT关键字, 则以表达式值作为返回结果集百分数。 【例4.7】 对pxscj数据库的xsb表选择姓名、专业和总学分,返回结果集的前6 行。 T-SQL命令如下: SELECT TOP 6 姓名,专业,总学分 FROM xsb
4.1.1 选择查询结果输出列
1.选择所有列 使用“*”表示选择一个表或视图中的所有列。 【例4.1】 查询pxscj数据库中xsb表的所有记录。 T-SQL命令如下: USE pxscj SELECT * FROM xsb
4.1.1 选择查询结果输出列
执行结果如图4.1所示。
4.1.1 选择查询结果输出列
4.1.2 选择查询条件:WHERE子句
【例4.13】 查询xsb表中学号倒数第5个数字为9,且倒数第1个数在1~5之间 的学生学号、姓名及专业。 T-SQL命令如下,执行结果如图4.10所示。 SELECT 学号,姓名,专业 FROM xsb WHERE 学号 LIKE '%9_ _ _[1-5]'
4.1.2 选择查询条件:WHERE子句
1.表达式比较 比较运算符用于比较两个表达式值,共有9个,分别是 =(等于)、<(小于)、 <=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)、!< (不小于)、!>(不大于)。比较运算的格式为: 表达式1 {比较运算符} 表达式2 其中,“表达式”是除text、ntext和image以外类型的表达式。 【例4.11】 查询xsb表中通信工程专业总学分大于等于42的同学的情况。 T-SQL命令如下: SELECT * FROM xsb WHERE 专业= '通信工程' AND 总学分 >= 42
T-SQL命令如下,执行结果如图4.7所示。
SELECT MAX(成绩) AS '计算机基础最高分' , MIN(成绩) AS '计算机基础最低分' FROM cjb WHERE 课程号 = '101'
4.1.1 选择查询结果输出列
(3)COUNT。 COUNT用于统计组中满足条件的行数或总行数,格式为: COUNT ( { [ ALL | DISTINCT ] 表达式 } | * ) 其中,“表达式”的数据类型是除text、image或ntext之外的任何类型。 【例4.10】 求学生的总数、专业个数和总学分在50分以上的人数。 T-SQL命令如下,执行结果如图4.8所示。 SELECT COUNT(*) AS '学生总数' , COUNT(DISTINCT 专业) AS '专业个数' FROM xsb ; GO SELECT COUNT(总学分) AS '总学分>50分人数' FROM xsb WHERE 总学分>50 ; GO
4.1.1 选择查询结果输出列
(1)SUM和AVG。 SUM和AVG分别用于求表达式中所有值项的总和与平均值,格式为: SUM /AVG ( [ ALL | DISTINCT ] 表达式 ) 其中,“表达式”可以是常量、列、函数或表达式,其数据类型只能是int、 smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney。 【例4.8】 求所有课程的总学分和选修101课程的学生的平均成绩。 T-SQL命令如下,执行结果如图4.6所示。 SELECT SUM(学分) AS '总学分' FROM kcb SELECT AVG(成绩) AS '计算机基础平均成绩' FROM cjb WHERE 课程号 = '101'
4.1.1 选择查询结果输出列
4.替换查询结果中的数据 在对表进行查询时,有时希望对所查询的某些列得到的数据进行变换。 要替换查询结果中ห้องสมุดไป่ตู้数据,则可使用CASE表达式,格式为: CASE WHEN 条件1 THEN 表达式1 WHEN 条件2 THEN 表达式2 …… ELSE 表达式 END
4.1.1 选择查询结果输出列
4.1.1 选择查询结果输出列
8.聚合函数 聚合函数常常用于对一组值进行计算,然后返回单个值。通常与GROUP BY子 句一起使用。如果一个SELECT语句中有一个GROUP BY子句,则这个聚合函数对 所有列起作用;如果没有,则SELECT语句只产生一行作为结果。SQL Server所提 供的聚合函数列于表4.1中。
4.1.1 选择查询结果输出列
也可以使用“列别名=表达式”更改列标题。例如: SELECT number = 学号, name = 姓名, mark = 总学分 FROM xsb WHERE 专业= '计算机' 当自定义的列标题中含有空格时,必须使用引号将标题括起来。例如: SELECT 'Student number ' = 学号,姓名 AS 'Student name', mark = 总学分 FROM xsb WHERE 专业= '计算机'
第4章 数据库的查询和视图
4.1 数据库的查询
4.2 视
图
4.1 数据库的查询
下面介绍SELECT语句,它是T-SQL的核心。语法主体格式如下: SELECT <输出列> /*指定查询结果输出列*/ [ INTO 新表 ] /*指定查询结果存入新表*/ [ FROM { <表源> } [ , ... ] ] /*指定查询源:表或视图*/ [ WHERE <条件> ] /*指定查询条件*/ [GROUP BY <分组条件> ] /*指定查询结果分组条件*/ [ HAVING <分组统计条件>] /*指定查询结果分组统计条件*/ [ ORDER BY <排序顺序>] /*指定查询结果排序顺序*/
4.1.1 选择查询结果输出列