实验七视图及SQL数据更新语句一、实验目的1.掌握视图的概念;2.熟练掌握视图的生成及操作语句;3.熟练掌握SQL数据更新语句;二、实验内容给定一个练习数据库和相应的练习题,要求上机完成,并验证结果实验基础知识提要视图是一个虚拟表,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。
定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。
创建视图的基本语句为:CREATE VIEW view_name [ ( column [ ,...n ] ) ]ASselect_statement[ WITH CHECK OPTION ]view_name是视图的名称。
视图名称必须符合标识符规则。
可以选择是否指定视图所有者名称。
column是视图中的列名。
只有在下列情况下,才必须命名CREATE VIEW 中的列:当列是从算术表达式、函数或常量派生的,两个或更多的列可能会具有相同的名称(通常是因为联接),视图中的某列被赋予了不同于派生来源列的名称。
还可以在SELECT 语句中指派列名。
如果未指定column,则视图列将获得与SELECT 语句中的列相同的名称。
select_statement是定义视图的SELECT 语句。
该语句可以使用多个表或其它视图。
若要从创建视图的SELECT 子句所引用的对象中选择,必须具有适当的权限。
WITH CHECK OPTION强制视图上执行的所有数据修改语句都必须符合由select_statement 设置的准则。
通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到修改的数据。
三、实验步骤构建数据表作为实验数据内容(数据表同实验六,参考实验六实验步骤)运行SQL SERVER服务管理器,确认数据库服务器开始运行。
打开查询分析器,选择刚才恢复的数据库exampleDB,输入SQL指令,获得运行结果。
任务:完成以下SQL数据更新语句(1)创建视图V_SupplyCount,显示供应商编号,以及该供应商供应的产品的品种数(非CategoryID),该视图包含两个字段:SupplierID、ProductCount。
create view V_SupplyCount(SupplierID,ProductCount)asselect SupplierID,count(ProductID)from productsgroup by SupplierID(2)创建视图V_OrderCount,显示顾客编号,顾客所下订单的产品总金额(金额=单价×数量×折扣),该视图包含两个字段:CustomerID,TotalFee。
create view V_OrderCount(CustomerID,TotalFee)asselect CustomerID,sum(UnitPrice*Quantity*Discount)from orders,orderdetailswhere orders.OrderID=orderdetails.OrderIDgroup by CustomerID(3)通过视图V_SupplyCount,查出供应产品的品种数最少的供应商编号和供应商名称。
select SupplierID,CompanyNamefrom Supplierswhere SupplierID in(select SupplierIDfrom V_SupplyCountwhere ProductCount=(select min(ProductCount)from V_SupplyCount))(4)通过视图V_OrderCount,查出所下订单的产品总金额最多的顾客编号和地址。
select CustomerID,Addressfrom Customerswhere CustomerID in(select CustomerIDfrom V_OrderCountwhere TotalFee=(select max(TotalFee)from V_OrderCount))(5)再Region表中,添加一个新的地区:地区编号为5,地区描述为Central insert into Region values(5,'Central')(6)将Suppliers表中的所有国家为法国的供应商信息内容添加到OldSuppliers中create table OldSuppliers(SupplierID int NOT NULL primary key,CompanyName varchar(50) ,ContactName varchar(50) ,ContactTitle varchar(50) ,Address varchar(60) ,City varchar(50) ,Region varchar(50) ,PostalCode varchar(50) ,Country varchar(50) ,Phone varchar(50) ,Fax varchar(50) ,HomePage varchar(50))insert into OldSuppliersselect * from Suppliers where Country='France'(7)将所有由职员Fuller(LastName)签订的订单运费降低10%update Ordersset Freight=Freight*0.9where EmployeeID=(select EmployeeIDfrom Employeeswhere LastName='Fuller')(8)将所有美国顾客购买的订单单价调高20%update Orderdetailsset UnitPrice=UnitPrice*1.2where OrderID in(select distinct Orderdetails.OrderIDfrom Orderdetails,Orders,Customerswhere Orderdetails.OrderID=Orders.OrderID andOrders.CustomerID=Customers.CustomerID andCustomers.Country='USA')(9)将订货数量最多的产品的单价上调5元update Productsset UnitPrice=UnitPrice+5where ProductID in(select ProductIDfrom Orderdetailsgroup by ProductIDhaving sum(Quantity)>=ALL(select sum(Quantity)from Orderdetailsgroup by ProductID))(10)删除订单个数最少的职员的信息delete from Employeeswhere EmployeeID in(select EmployeeIDfrom Ordersgroup by EmployeeIDhaving count(OrderID)<=ALL(select count(OrderID)from Ordersgroup by EmployeeID))(11)删除所有没有下订单的顾客信息delete from Customerswhere not exists(select *from Orderswhere Customers.CustomerID=Orders.CustomerID)四. 实验结果与分析(上交实验报告)分析思考问题:1. 分析在什么情况下需要使用视图,并简述其目的;筛选用户表中需要的数据,但不对原用户表进行插入,更新,删除等修改操作时,建立视图可以使查找工作更方便,更有针对性,也不易受无关数据项干扰,用户表数据量越大以及需要查找数据量较大的情况下,使用视图就更方便,且是查找结果输出表格化,便于观察。
2. 分析是否可以使用视图进行数据更新删除,和对基础表进行更新删除有哪些异同点;您可以通过视图修改基础基表的数据,修改方式与通过 UPDATE、INSERT 和 DELETE 语句修改表中数据的方式一样。
但是,以下限制应用于更新视图,但不应用于表:任何修改(包括 UPDA TE、INSERT 和 DELETE 语句)都只能引用一个基表的列。
视图中被修改的列必须直接引用表列中的基础数据。
它们不能通过其他方式派生,例如通过:聚合函数(A VG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、V AR 和 V ARP)。
计算,不能通过表达式并使用列计算出其他列。
使用集合运算符(UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT)形成的列得出的计算结果不可更新。
正在修改的列不受 GROUP BY、HA VING 或 DISTINCT 子句的影响。
五.讨论、心得。