数据库系统概论 学习笔记(三)第三部分

三、嵌套查詢
          將一個查詢塊嵌套在另一個查詢塊的Where子句或Having短語的條件中的查詢稱之為嵌套查詢。
          注意:子查詢的Select語句中不能用Order by子句。
          嵌套查詢的求解方法為由裡向外處理,即每個子查詢在其上級查詢處理之前處理,子查詢的結果用於建立父查詢的查找條件。
1、集合成員資格的確認:
          连接词in和not in用来判断一个元素是否在某个集合中。例如:

-- 查詢與劉備有相同權限的人員姓名
   select E.Ename from Employees E where Eid in (
select Eid from Authority A where Pid In (
select Pid from authority B where Eid = (
select Eid from Employees where Ename = ' 劉務 ' )))

-- 查詢部門為“蜀”和“吳”以外的人員資料
   select * from Employees
  
where Edept not in ("蜀", "吳")


2、集合的比較:
          ⑴ "至少比一个…"的集合比较运算符还有:<some、<=some、>some、>=some、=some和<>some。在这里=some等价于in;
⑵ "比所有都…"的集合比较运算符有:<all、<=all、>all、>=all、=all和<>all。在这里 <>all 等价于not in。

-- 查詢平均年齡最大的部門名稱
     select Edept from Employees
    
Group by Edept
    
Having avg (Eage) >=all ( select avg (Eage) from Employees Group by Edept)


3、集合基數的測試
          ⑴ 测试一个子查询的结果是否有元组,即测试其是否为空关系。使用关键词exists和not exists,還有exists或Not exists的子查詢不返回任何數據,只返回“True”或“Flase”;
⑵ 测试一个子查询的结果是否有重复元组。使用关键词unique和not unique。

-- 查詢賦予了代號為frmsys990子程序權限的人員姓名:
   select Ename from Employees E where exists (
select * from Authority A where A.Eid = E.Eid and pid = ' frmsys990 ' )


四、集合查詢
          涉及多個Select查詢語句的查詢。標准SQL主要是Union操作。
          注意:Union操作會自動去掉重復的元組,參加Union操作的各結果表的列數必須相同,對應的數據類型也必須相同。

-- 查詢部門“蜀”的職員資料及查詢年齡大於30歲的職員資料
   select * from Employees where Edept = ' '
  
Union
  
select * from Employees Where Eage > 30

-- 等價於
   select * from Employees where Edept = ' ' and Eage > 30


3.5      視圖
          视图是从一个或几个基本表或其他视图导出的表定义。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图。
          使用视图有以下作用:
1、视图能够简化用户的操作;
2、视图能使用户以多种角度看待同一数据;
3、视图对重构数据库提供了一定程度的逻辑独立性;
4、视图能够对机密数据提供安全保护。
由于视图是不实际存储数据的虚表,因此对视图的更新(INSERT、DELETE、UPDATE)最终要转换为对基本表的更新。具體的更新與各DBMS的定義有關。

3.5.1      定義視圖
          格式:Create View <視圖名>[(<列名1>[,<列名2>]...)] AS <子查詢> [With Check Option]
          說明:1、子查詢是任意複雜的Select語句,但通常不允許含有Order by和Distinct短語。
            2、With Check Option表示對視圖進行更新操作時需要滿足子查詢中的條件表達式。
             3、組成視圖的列名可以省略,但有三種情況是不能省略的。(1)某個目標列不是單純的屬性名;(2)多表連接時選擇了多個相同的列名;(3)需要為某列取用更合適的名字。

-- 建立部門為“蜀”的職員資料視圖
   Create View V_Employees
  
As
  
select Eid,Ename,Eage from Employees where Edept = ' '

-- 刪除上面建立的視圖
   Drop View V_Employees


3.5.2      查詢視圖
          視圖可以像表一樣被查詢。DBMS執行視圖查詢前,會首先檢查表與視圖是否存在,存在的時候會取出視圖的定義,把用戶的查詢與定義的子查詢結合起來,轉換成對表的查詢,然後才執行修正後的查詢。

-- 在視圖中查詢年齡在30歲以上的職員姓名
   select Ename from V_Employees where Eage > 30


3.5.3      更新視圖
基本操作與表的一樣,但存在一些約束,並且不是每一個DBMS都允許對視圖更新。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值