《数据库系统数据库系统讲义第3章 -3》由会员分享,可在线阅读,更多相关《数据库系统数据库系统讲义第3章 -3(26页珍藏版)》请在金锄头文库上搜索。
1、哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 数据库系统 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 第第3章章 SQL语言语言 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 内容回顾内容回顾 基本查询结构基本查询结构 Select列列名名 , 列列名名 From表名表名 , 表表名名 Where检索条件检索条件 Order by 排序方式排序方式 检索条件检索条件的新形式的新形式: 表达式表达式 + (not)in + 子查询子查询 表达式表达式 + some/all+ 子子查询查询 (not)exists + 子子查询查询
2、 相关相关子查询与非相关子查询子查询与非相关子查询 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 第第3章章 SQL语言语言 3.1 SQL语言概述语言概述 3.2 简单的简单的SQL-DDL/DML: 创建数据库创建数据库 3.3 SQL-DML之查询之查询Select - 基本的检索操作基本的检索操作 - 多表联合检索多表联合检索 - 子查询子查询 - 结果计算与聚集函数结果计算与聚集函数 - 分组查询与分组过滤分组查询与分组过滤 - 并、交、差的处理并、交、差的处理 - 内连接、外连接内连接、外连接 - 空值处理空值处理 - Select的完整语法的完整语法 哈尔滨
3、工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词 第第3种类型的子查询:种类型的子查询: Exists子查询。其基本语法为:子查询。其基本语法为: not Exists (子查询子查询) 语义:子查询结果中是否有元组。语义:子查询结果中是否有元组。 例如:检索选修了赵三老师主讲课程的所有同学的姓名例如:检索选修了赵三老师主讲课程的所有同学的姓名 Select DISTINCT Sname From Student Where exists ( Select * From SC, C
4、ourse, Teacher WhereSC.C# = Course.C# and SC. S# = Student.S# and Course.T# = Teacher.T# and Tname = 赵三赵三 ) ; Select DISTINCT Sname From Student, SC, Course, Teacher WhereSC.C# = Course.C# and SC.S# = Student.S# and Course.T# = Teacher.T# and Tname = 赵三赵三; 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-D
5、ML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 例如:列出没学过李明老师讲授任何一门课程的所有同学的姓名例如:列出没学过李明老师讲授任何一门课程的所有同学的姓名 Select Sname From Student Where not exists /不存在 ( Select * From Course, SC, Teacher/学过一门李明老师讲授过的课程 Where Tname=李明李明 and Course.T# =Teacher.T# and Course.C# = SC.C# and S# = Student.S# ); Select Sna
6、me From Student S, Course C, Teacher T WhereT.Tname 李明李明and C.C# = SC.C# and S.S# = C.S# and T.T# = C.T# 错误写法错误写法 not Exists的使用的使用 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 例如:列出选修了全部课程的同学姓名例如:列出选修了全部课程的同学姓名 查询学生查询学生A(学号为(学号为A)没学过的课程:)没学过的课程: Select C#
7、From Course Where not exists ( Select * From SC Where S#= A and C# = Course.C# ) ); 在在SQL中没有全称量词中没有全称量词 ,但是任何一个带有全称量词的谓词总可以转换为 ,但是任何一个带有全称量词的谓词总可以转换为 等价的带存在量词的谓词:等价的带存在量词的谓词:( )F()xxF 选择条件选择条件:任意一门课都学过:任意一门课都学过 选择条件选择条件:不存在不存在一门这个学生一门这个学生没学过没学过的课程的课程 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之
8、查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 例如:列出选修了全部课程的同学姓名例如:列出选修了全部课程的同学姓名 Select Sname From Student Where not exists ( Select * From Course Where not exists ( Select * From SC Where S#= Student.S# and C# = Course.C# ) ); A学生学了学生学了B课课 A学生没学过的课程学生没学过的课程 选择条件选择条件:任意一门课都学过:任意一门课都学过 选择条件选择条件:不存在不存在一门这个学
9、生一门这个学生没学过没学过的课程的课程 ()F()xxF 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 例如:列出学过例如:列出学过98030101号同学学过所有课程的同学的学号号同学学过所有课程的同学的学号 Select DISTINCT S# From SC Where not exists /不存在 ( Select * From SC SC1 Where SC1.S# = 98030101 /98030101号同学学过 and not exists /该同
10、学没学过 ( Select * From SC SC2 Where SC2.C# = SC1.C# and SC2.S# = SC.S# ) ); 选择条件选择条件:任意一门:任意一门98030101号同学学过的课程号同学学过的课程都学过都学过 选择条件选择条件:不存在不存在一门一门98030101号同学学过号同学学过但但这个学生这个学生没学过没学过的课程的课程 )()(qpxqpx 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 再例如:检索学过再例如:检索学过0
11、01号教师主讲的号教师主讲的所有所有课程的所有同学的姓名课程的所有同学的姓名 上述语句的等同于:不存在上述语句的等同于:不存在有一门有一门001号教师主讲的课程号教师主讲的课程该同学没学过该同学没学过 Select Sname From Student Where not exists /不存在 ( Select * From Course /有一门001教师主讲课程 Where Course.T# = 001 and not exists /该同学没学过 ( Select * From SC WhereS# = Student.S# and C# = Course.C# ) ); 哈尔滨工业
12、大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询之类型子查询之类型3:Exists谓词谓词(续续) 再例如:检索学过李明老师主讲的再例如:检索学过李明老师主讲的所有所有课程的同学姓名课程的同学姓名 Select Sname From Student Where not exists ( Select * From Course,Teacher where Course.T#=Teacher.T# and Tname = 李明李明 and not exists ( Select * From SC WhereS# = Stude
13、nt.S# and C# = Course.C# ) ); 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 基于派生表的查询基于派生表的查询 子查询也可以出现在子查询也可以出现在from子句中子句中 派生表派生表:from 子句中的子查询生成的临时表子句中的子查询生成的临时表 不指定属性列时,子查询不指定属性列时,子查询SELECT子句后的列名为其缺省属性子句后的列名为其缺省属性 如果子查询中有聚集函数,则必须要指定派生表的属性列如果子查询中有聚集函数,则必须要指定派生表的属性列 例:查询所有选修了例:查询所有选修了1号课
14、程的学生姓名号课程的学生姓名 Select Sname From student, ( Select S# From SCwhere C# = 001 ) as SC001 (Sno) where S# = Sno; 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询出现在子查询出现在Select子句中子句中 子查询也可以出现在子查询也可以出现在Select子句中子句中 例:查询学生的学号、姓名及对应的选课数量例:查询学生的学号、姓名及对应的选课数量 Select Student.S#, Student.Sname,
15、Count(*) From Student, SC Where Student.S# = SC.S# Group by Student.S#, Student.Sname; Select S#, Sname, (Select count(*) From SC Where SC.S#= Student.S#) From Student; 子查询作为计算列使用子查询作为计算列使用 子查询针对外部查询的每一行,返回唯一的值。子查询针对外部查询的每一行,返回唯一的值。 哈尔滨工业大学哈尔滨工业大学软件学院软件学院 数据库系统数据库系统 3.3 SQL-DML之查询之查询Select - 子查询子查询 (1)凡是嵌套在其他)凡是嵌套在其他SQL语句中的查