数据查询 单表查询 连接查询 嵌套查询 集合查询.

Slides:



Advertisements
Similar presentations
第 3 章 关系数据库语言 SQL 2.DML 3.DCL( 第四部分) 4 。嵌入式使用 、 DML: 插入 / 修改 / 删除记录 n DML Insert :插入记录 Delete :删除记录 Update :修改记录 Select :查询记录.
Advertisements

计算机软件技术基础计算机软件技术基础 数据库系统( 3 ). 第 2 页 4.3 关系数据库语言 SQL 关系数据库 SQL ( Structured Query Language )语言是关系 数据库的标准语言,对关系模型的发展和商用 DBMS 的研制起 着重要的作用。 SQL 发展历史  1986.
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
SQL的简单查询.
第三章 关系数据库语言SQL 3.1 SQL的特征 3.2 SQL的数据定义 3.3 SQL的数据查询 3.4 SQL的数据更新
数据库系统概论 华中科技大学能源与动力工程学院
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
数据库及应用 授课教师:岳静 教学网站: Tel:
厦门大学计算机科学系本科生课程 《数据库系统原理》 第3章 关系数据库标准语言SQL (2016版) 林子雨 厦门大学计算机科学系
第3章 关系数据库标准语言.
An Introduction to Database System
第2讲 Transact-SQL语言.
数据库原理 Database Principles 第三章 关系数据库标准语言SQL(续1).
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
数据库应用技术 SQL Server 2005.
An Introduction to Database System An Introduction to Database System
An Introduction to Database System
数据库技术 实践.
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
第三章 关系数据库标准语言SQL (8-10学时)
Chap 11 SQL基本查詢指令.
Access数据库程序设计 总复习.
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
使用SQL Server Management Studio 进行数据查询与维护
软件设计师培训.
计算机应用基础 上海大学计算中心.
第3章 数据库语言SQL 3.1 SQL语言概况 3.2 SQL数据定义语言 3.3 SQL数据查询语言 3.4 SQL数据操纵语言
常用逻辑用语复习 知识网络 常用逻辑用语 命题及其关系 简单的逻辑联结词 全称量词与存在量词 四种命题 充分条件与必要条件 量词 全称量词 存在量词 含有一个量词的否定 或 且 非或 并集 交集 补集 运算.
常用逻辑用语复习课 李娟.
第三章 关系数据库标准语言SQL 3.1 SQL的特征 3.2 SQL的数据定义 3.3 SQL的数据查询 3.4 SQL的数据更新
数据库原理 Database Principles 第五章 数据库完整性 Database Principles.
请写出下列查询语句并给出结果 1、列出student表中所有记录的sname、sex和class列。
第四章 关系系统及其查询优化 这一章包括两个内容,一是关系系统(关系数据库系统的简称),二是关系系统的查询优化。第一部分讨论关系系统的定义和分类;第二部分讨论关系系统中查询优化的概念、查询优化的基本原理和技术。
数据库技术 第二章 关系数据库 中国科学技术大学网络学院 阚卫华.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
数据库技术 第三章 关系数据库标准语言SQL 中国科学技术大学网络学院 阚卫华.
汤 娜 中山大学计算机科学系 数 据 库 基 础 第三章 SQL语言 汤 娜 中山大学计算机科学系
第4章 SQL语言基础及数据库定义 4.1 基本概念 4.2 SQL Server 提供的主要数据类型 4.3 数据定义.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
An Introduction to Database System An Introduction to Database System
第4章 数据的查询与更新 4.1 SQL查询语句格式 4.2 简单查询 4.3 统计查询 4.4 连接查询 4.5 嵌套查询
实验 2:MS Access QBE Query使用
第3章 创建数据库 重点内容: 创建数据库和表 列约束 创建索引 修改数据库和表 删除数据库和表.
国家“十一五”规划教材 数据库原理与应用教程.
国家“十一五”规划教材 数据库原理与应用教程(第3版).
SQL SERVER 一些经典语句 1.
SPARQL若干问题的解释 刘颖颖
An Introduction to Database System An Introduction to Database System
An Introduction to Database System
在PL/SQL中使用SQL SQL基本命令分类语句 SQL语句可以分为六类
第二章 Java语言基础.
Thanks for the Slides from Renmin U
網路遊戲版 幸福農場168號.
数据库技术.
第二章 关系数据库 2.1 关系数据库的基本概念 2.2 关系模型及其描述 2.3 关系代数 2.4 关系演算 本章小结.
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
SQL查询语句 蔡海洋.
VB与Access数据库的连接.
第九节 赋值运算符和赋值表达式.
国家“十一五”规划教材 数据库原理与应用教程(第3版).
学习目标 1、limit的作用 2、实例操作.
学习目标 1、了解基本运算符 2、运算符优先级.
第十一章 查询.
主讲教师 欧阳丹彤 吉林大学计算机科学与技术学院
VB与Access数据库的连接.
关系数据库 第2章 关系数据结构 关系定义 关系性质 关系模式 关系的完整性 实体完整性 参照完整性 用户定义完整性 关系代数 关系演算
关系数据库标准语言SQL 第3章 SQL概述 数据定义 查询 更新 视图 数据控制 嵌入式SQL 2019/12/6 数据库原理.
Presentation transcript:

数据查询 单表查询 连接查询 嵌套查询 集合查询

嵌套查询概述 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询

嵌套查询 SELECT Sname /*外层查询/父查询*/ FROM Student WHERE Sno IN (SELECT Sno /*内层查询/子查询*/ FROM SC WHERE Cno= ' 2 ');

嵌套查询 子查询的限制 不能使用ORDER BY子句 层层嵌套方式反映了SQL语言的结构化 有些嵌套查询可以用连接运算替代

嵌套查询分类 不相关子查询 子查询的查询条件不依赖于父查询 相关子查询 子查询的查询条件依赖于父查询

嵌套查询求解方法 不相关子查询 是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

嵌套查询求解方法(续) 相关子查询 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表; 然后再取外层表的下一个元组; 重复这一过程,直至外层表全部检查完为止。

嵌套查询 一、带有IN谓词的子查询 二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

一、带有IN谓词的子查询 此查询要求可以分步来完成 [例43] 查询与“刘晨”在同一个系学习的学生。 ① 确定“刘晨”所在系名 [例43] 查询与“刘晨”在同一个系学习的学生。 此查询要求可以分步来完成 ① 确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname= ' 刘晨 '; 结果为: ‘CS’

带有IN谓词的子查询(续) ② 查找所有在CS系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= ' CS '; 结果为: Sno Sname Sdept 200215121 李勇 CS 200215122 刘晨

带有IN谓词的子查询(续) 将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept WHERE Sname= ‘ 刘晨 ’); 此查询为不相关子查询。

带有IN谓词的子查询(续) 用自身连接完成[例43]查询要求 SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.Sdept AND S2.Sname = '刘晨';

带有IN谓词的子查询(续) [例44]查询选修了课程名为“信息系统”的学生学号和姓名 SELECT Sno,Sname ③ 最后在Student关系中 FROM Student 取出Sno和Sname WHERE Sno IN (SELECT Sno ② 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERE Cno IN (SELECT Cno ① 首先在Course关系中找出 FROM Course “信息系统”的课程号,为3号 WHERE Cname= ‘信息系统’ ) ); 注意一致性

带有IN谓词的子查询(续) 用连接查询实现[例44] SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname=‘信息系统’;

嵌套查询 一、带有IN谓词的子查询 二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

二、带有比较运算符的子查询 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。 与ANY或ALL谓词配合使用

带有比较运算符的子查询(续) 例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例43]可以用 = 代替IN : SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = (SELECT Sdept WHERE Sname= ‘刘晨’);

带有比较运算符的子查询(续) 子查询一定要跟在比较符之后 错误的例子: SELECT Sno,Sname,Sdept FROM Student WHERE ( SELECT Sdept FROM Student WHERE Sname= ‘ 刘晨 ’ ) = Sdept;

带有比较运算符的子查询(续) SELECT Sno, Cno [例45]找出每个学生超过他选修课程平均成绩的课程号。 FROM SC x WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno); 相关子查询

带有比较运算符的子查询(续) 可能的执行过程: 1. 从外层查询中取出SC的一个元组x,将元组x的Sno值(200615121)传送给内层查询。 SELECT AVG(Grade) FROM SC y WHERE y.Sno='200615121'; 2. 执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询: SELECT Sno, Cno FROM SC x WHERE Grade >=88;

带有比较运算符的子查询(续) 3. 执行这个查询,得到 (200615121,1) 4.外层查询取出下一个元组重复做上述1至3步骤,直到外层的SC元组全部处理完毕。结果为: (200615122,2)

嵌套查询 一、带有IN谓词的子查询 二、 带有比较运算符的子查询 三、 带有ANY或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

三、带有ANY或ALL谓词的子查询 谓词语义 ANY:任意一个值 ALL:所有值

带有ANY或ALL谓词的子查询 需要配合使用比较运算符 > ANY 大于子查询结果中的某个值

带有ANY或ALL谓词的子查询 [例46] 查询其他系中比计算机系某一学生年龄小的学生姓名和年龄 SELECT Sname,Sage [例46] 查询其他系中比计算机系某一学生年龄小的学生姓名和年龄 SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage WHERE Sdept= ' CS ') AND Sdept <> ‘CS ' ; /*父查询块中的条件 */

带有ANY或ALL谓词的子查询 结果: 执行过程: 1.RDBMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19) 2. 处理父查询,找所有不是CS系且年龄小于20或19的学生 Sname Sage 王敏 18 张立 19

带有ANY或ALL谓词的子查询 用聚集函数实现[例46] SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MAX(Sage) FROM Student WHERE Sdept= ‘CS ') AND Sdept <> ' CS ’; 用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数

带有ANY或ALL谓词的子查询 [例47] 查询其他系中比计算机系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词 [例47] 查询其他系中比计算机系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词 SELECT Sname,Sage FROM Student WHERE Sage < ALL (SELECT Sage WHERE Sdept= ' CS ') AND Sdept <> ' CS ’;

带有ANY或ALL谓词的子查询 方法二:用聚集函数 SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MIN(Sage) WHERE Sdept= ' CS ') AND Sdept <>' CS ’;

ANY(或SOME),ALL谓词与聚集函数、IN谓词的等价转换关系 带有ANY或ALL谓词的子查询 ANY(或SOME),ALL谓词与聚集函数、IN谓词的等价转换关系   = <>或!= < <= > >= ANY IN -- <MAX <=MAX >MIN >= MIN ALL NOT IN <MIN <= MIN >MAX >= MAX

嵌套查询 一、带有IN谓词的子查询 二、 带有比较运算符的子查询 三、 带有ANY(SOME)或ALL谓词的子查询 四、 带有EXISTS谓词的子查询

四、带有EXISTS谓词的子查询 1. EXISTS谓词 存在量词 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真值 若内层查询结果为空,则外层的WHERE子句返回假值 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义 2. NOT EXISTS谓词 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的WHERE子句返回真值

带有EXISTS谓词的子查询(续) [例48]查询所有选修了1号课程的学生姓名。 用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ‘ 1 ’);

带有EXISTS谓词的子查询(续) 思路分析: 本查询涉及Student和SC关系 在Student中依次取每个元组的Sno值,用此值去检查SC关系 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= '1',则取此Student.Sname送入结果关系

带有EXISTS谓词的子查询(续) 用连接运算 SELECT Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno= '1';

带有EXISTS谓词的子查询(续) [例49] 查询没有选修1号课程的学生姓名。 SELECT Sname FROM Student [例49] 查询没有选修1号课程的学生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno=‘1’); 此例用连接运算难于实现

带有EXISTS谓词的子查询(续) 3. 不同形式的查询间的替换 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询 都能用带EXISTS谓词的子查询等价替换。

带有EXISTS谓词的子查询(续) 例[50]:[例43]查询与“刘晨”在同一个系学习的学生。 可以用带EXISTS谓词的子查询替换: SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS   (SELECT * FROM Student S2 WHERE S2.Sdept = S1.Sdept AND S2.Sname = ‘刘晨’);

带有EXISTS谓词的子查询(续) 4. 相关子查询的效率 例44:不相关子查询的效率高于相关子查询的效率

带有EXISTS谓词的子查询(续) 相关子查询的效率可能高于连接查询 例[51]:查询选修了课程的学生姓名 法一: SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno);

带有EXISTS谓词的子查询(续) 法二: SELECT Sname FROM Student,SC WHERE Student.Sno=SC.Sno;

带有EXISTS谓词的子查询(续) 法三: SELECT Sname FROM Student WHERE sno in (SELECT distinct sno FROM SC);

带有EXISTS谓词的子查询(续) (x)P ≡  ( x( P)) 5. 用EXISTS/NOT EXISTS实现全称量词(难点) SQL语言中没有全称量词 (For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词: (x)P ≡  ( x( P))

带有EXISTS谓词的子查询(续) [例52]查询选修了全部课程的学生姓名。 FROM Student WHERE NOT EXISTS SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno));

带有EXISTS谓词的子查询(续) 6. 用EXISTS/NOT EXISTS实现逻辑蕴函(难点) p  q ≡  p∨q SQL语言中没有蕴函(Implication)逻辑运算 可以利用谓词演算将逻辑蕴函谓词等价转换为: p  q ≡  p∨q

带有EXISTS谓词的子查询(续) [例53]查询至少选修了学生200615122选修的全部课程的学生号码。 解题思路: 用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要200615122学生选修了课程y,则x也选修了y。 形式化表示: 用p表示谓词 “学生200615122选修了课程y” 用q表示谓词 “学生x选修了课程y” 则上述查询为: (y) p  q

带有EXISTS谓词的子查询(续) 等价变换: (y)p  q ≡  (y ((p  q )) 变换后语义:不存在这样的课程y,学生200615122选修了y,而学生x没有选。

带有EXISTS谓词的子查询(续) SELECT DISTINCT Sno 用NOT EXISTS谓词表示: FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = ' 200615122 ' AND NOT EXISTS FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));

思考题 查询选修了计算机系开设的全部课程的学生。