当前位置: 代码迷 >> 综合 >> 【数据库系统】第七讲 SQL语言的复杂查询与视图
  详细解决方案

【数据库系统】第七讲 SQL语言的复杂查询与视图

热度:53   发布时间:2024-01-27 05:16:59.0

7.1 (NOT)IN子查询

1、子查询

现实中,很多情况需要进行下述条件的判断

  • 集合成员资格:某一元素是否是某一集合的成员
  • 集合之间的比较:某一集合是否包含另一个集合等
  • 集合基数的测试:测试集合是否为空;测试集合是否存在重复元组

子查询:出现在Where自居中的Select语句被称为子查询,子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合
三种类型的子查询:(NOT) IN-子查询;θ-Some/ θ-All子查询;(NOT) EXISTS子查询

2、IN与NOT IN谓词子查询

(NOT) IN子查询
基本语法:表达式 [not] in (子查询)
语法中,表达式的最简单形式就是列数或常数
语义:判断某一表达式的值是否在子查询的结果中


3、非相关子查询

4、相关子查询

内层查询需要依赖外层查询的某些参量作为限定条件才能进行的子查询
外层向内层传递的参量需要使用外层的表名或表别名来限定

注意:相关子查询只能由外层向内层传递参数,而不能反之;这也称为变量的作用域原则

7.2 θ Some与θ All子查询

1、θ Some与θ All谓词子查询

基本语法:表达式 θ some(子查询)
表达式 θ all(子查询)
语法中,θ是比较运算符:<,>,>=,<=,=,<>
语义:将表达式的值与子查询的结果进行比较

  • 如果表达式的值至少与子查询结果的某一个值相比较满足 θ关系,则 “表达式 θ some (子查询)” 的结果便为真;
  • 如果表达式的值与子查询结果的所有值相比较都满足θ关系,则“表达式 θ all (子查询)”的结果便为真



2、注意事项

在SQL标准中,也有θ any谓词,但由于其语义的模糊性:any,“任一”是 指所有呢?还是指某一个?不清楚,所以被θ some替代以求更明晰。
如下两种表达方式含义是相同的:
表达式 = some (子查询)
表达式 in (子查询)

以下两种表达方式含义是不同的:
表达式 not in (子查询)
表达式 <> some (子查询)
而与not in等级的是
表达式 <> all (子查询)

7.3 (NOT) EXISTS子查询

1、EXISTS 与NOT EXISTS谓词子查询

基本语法:[not] Exists (子查询)
语义:子查询结果中有无元组存在




7.4 结果计算与聚集计算

1、结果计算

Select-From-Where语句中,Select自居后面不仅可是列名,而且可是一些计算表达式或聚集函数,表明在投影的同时进行一些运算

2、应用聚集函数进行统计计算

SQL提供了五个作用在简单列值集合上的内置聚集函数agfunc,分别是COUNT、SUM、AVG、MAX、MIN

7.5 分组查询与分组过滤

1、分组查询

分组:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的 聚集运算。
分组的基本语法:

2、分组查询示例

3、分组过滤

聚集函数是不允许用于Where子句中的:Where子句是对每一元组进行条件过滤,而不是对集合进行条件过滤
分组过滤:若要对集合(即分组)进行条件过滤,即满足条件的结合/分组留下,不满足条件的集合/分组剔除
Having子句,又称分组过滤子句。需要有Group by子句支持,换句话说,没有Group by子句,便不能有Having子句

4、分组过滤示例


5、分组过滤条件与WHERE条件的对比

7.6 SQL语言实现关系代数操作

1、并交差的处理

SQL语言:并运算UNION,交运算INTERSECT,差运算EXPECT
基本语法形式:子查询{ Union [ALL] |Intersect [ALL]|Except [ALL] 子查询}
通常情况下自动删除重复元组:不带ALL。若要保留重复的元组,则要带ALL






UNION运算符是Entry-SQL92的一部分
INTERSECT、EXCEPT运算符是Full-SQL92的一部分
它们都是Core-SQL99的一部分,但有些DBMS并不支持这些 运算,使用时要注意

2、空值的处理

空值是其值不知道、不确定、不存在的值
数据中有了空值,会影响很多方面,如影响聚集函数运算的正确性,不能参与算数、比较或逻辑运算等
以前,很多DBMS将空值按默认值处理,如字符串类型则以空格来表示,而如数值类型则以0来表示,这也将会引起统计、计算上的不正确性。
在SQL标准中和许多现流行的DBMS中,空值被用一种特殊的符号Null来标记,使用特殊的空值检测函数来获得某列的值是否为空值。
空值检测:is [not] null
测试指定列的值是否为空值
示例:找出年龄值为空的学生姓名
Select Sname From Student Where Sage is null
注意:上例条件不能写为Where Sage = null;空值是不能进行运算的
除is [not] null之外,控制不满足任何查找条件
如果null参与算数运算,则该算数表达式的值为null
如果null参与比较预算,则结果可以视为false
如果null参与聚集运算,则除count(*)之外其他聚集函数都忽略null

3、内连接、外连接

关系代数运算中,有连接运算,又分为θ连接和外连接
标准SQL语言中连接运算通常是采用

相当于
SQL的高级语法中引入了内连接和外连接运算,具体形式:

上例的连接运算由两部分构成:连接类型和连接条件

  • 连接中使用nature:出现在结果关系的两个链接关系的元组在公共属性是取值相等,且公共属性只出现一次
  • 连接中使用on <连接条件>:出现在结果关系中的两个连接关系的元组取值满足连接条件,且公共属性出现两次
  • 连接中使用using (Col1, Col2, …, Coln) :(Col1, Col2, …, Coln)是两个连接关系的公共属性的子集,元组在(Col1, Col2, …, Coln)上取值相等,且(Col1,Col2, …, Coln)只出现一次

Inner Join

Outer Join

7.7 SQL-SELECT小结

1、基本框架

2、完整语法

3、扩展

面向对象/对象关系数据的查询SQL→OQL
基本的SQL:另一SELECT-FROM-WHERE只能出现在WHERE子句
新标准:引入对象概念,可以在能使用聚集(collection)的任何位置使用SELECT-FROM-WEHRE

  • FROM子句中使用
  • SELECT子句中使用
  • WHERE子句中使用
    (本课程不要求对新标准SQL的掌握)

7.8 SQL视图

1、SQL-视图的概念和结构


SQL数据库结构
基本表是实际存储于存储文件中的表,基本表的数据是需要存储的
视图在SQL中值存储其由基本表导出视图所需要的公式,即由基本表产生视图的映像信息,其数据并不存储,而是在运行过程中动态产生与维护的
对视图数据的更改最终要反映在对基本表的更改上

2、SQL-视图的定义

视图需要“先定义,再使用”
create view view_name [(列名[,列名] …)] as子查询[with check option]
如果视图的属性名缺省,则默认为子查询结果中的属性名;也可以显式指明其所拥有的列名
with check option指明当对视图进行insert,update,delete时,要检查进行insert/update/delete的元组是否满足视图定义中子查询中定义的条件表达式

3、SQL视图的使用

4、SQL视图的更新


SQL视图更新的可执行性

  • 如果视图的select目标列包含聚集函数,则不能更新
  • 如果视图的select子句使用了unique或distinct,则不能更新
  • 如果视图中包括了group by从句,则不能更新
  • 如果视图中包括经算是表达式计算出的列,则不能更新
  • 如果视图是由单个表的列构成,但并没有包括主键,则不能更新

对于单一Table子集构成的视图,即如果视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主键,则可以更新

5、SQL视图的撤销

已经定义的视图也可以撤销
撤销视图:Drop View view_name
不仅视图可以撤消,基本表、数据库等都可以撤销:Drop Table 表名

小结