用SQL语句操作Oracle数据库--数据查询详解(下篇)

news2024/11/25 7:51:14

数据查询是数据库的核心操作。上一篇文章我们介绍了单表查询操作,本文将继续介绍另一种重要的查询类型—[ 多表查询 ](涉及多个表的数据查询)。

本文我们将使用以下三个表来进行查询操作:

TABLE1:
S(学生基本信息表)

在这里插入图片描述
TABLE2:
C(课程表)
在这里插入图片描述
TABLE3:
SC(学生选修课程信息表)
在这里插入图片描述


1.连接查询

连接查询是数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合连接查询等等。

关系代数相关知识引入:

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。关系代数按运算符的不同可分为 传统的集合运算专门的关系运算两类。专门的关系运算包括 选择投影除运算 连接 等。
连接(join)也称为 θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。连接运算中有两种最为常用的连接,一种是等值连接(equijoin)、另一种是自然连接(natural join)。θ为“=”的连接运算为等值连接。它是从关系R与S的笛卡尔积中选取A、B属性值相等的那些元组。自然连接是特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中将重复的属性列去掉。
我们可以知道,在数据库中的一张二维表其实也是一个关系,所以上述专门的关系运算概念与法则同样适用于二维表之间。


①等值连接查询与非等值连接查询:

连接查询的WHERE子句中用来连接两个表的条件称为 连接条件(连接谓词),一般格式如下:
TABLE1.COLUMN1 比较运算符 TABLE2.CLOUMN2
其中的比较运算符主要有六种:=、>、<、<=、>=、!=(<>)等等
连接谓词亦可以使用以下形式:
TABLE1.cloumn1 BETWEEN TABLE2.cloumn2 AND TABLE2.cloumn3
当连接运算符为“=”时,就叫做 等值连接,否则使用其它运算符时就叫做 非等值连接连接谓词中的列名就叫做 连接字段。注意:连接条件中的各连接字段类型必须是可比的,名字可以不相同。


SELECT S.*, SC
FROM S,SC
WHERE S.sno = SC.sno;

查询结果如下:
在这里插入图片描述
上述例子中,我们等值连接查询了每个学生与其选修的课程信息。关系数据库管理系统在执行该连接查询操作时的一种可能的过程是:首先在S表中找到第一个元组,然后从头开始扫描SC表,如果找到与S表中的第一个元组的SNO值相等的SC中的元组,就将其与S表中的第一个元组连接起来,组成结果表中的第一个元组,并以此类推,直到S表中的元组全部处理完为止。这其实 是 嵌套循环链接算法 的基本思想。
在S表与SC表中的sno是连接字段,从输出的结果不难看出表中有相同的两个属性列,过我们可以使用自然连接来将重复的属性列去掉:

SELECT S.*,CNO,GRADE
FROM S, SC
WHERE SC.SNO = S.SNO;

查询结果如下:
在这里插入图片描述


例1:
查询选修3号课程且成绩在80分以上的学生的姓名和学号

SELECT S.SNO,SNMAE
FROM S,SC
WHERE S.SNO = SC,SNO AND CNO = '2' AND GRADE > 80;

查询结果如下:
在这里插入图片描述
对于此类问题,我们还有一种使执行过程更为高效的查询方法,那就是中间表法,我们先从SC表种找出cno=‘2’ 并且grade>80的元组组成一个中间表,取名为SM表,再和S表中满足连接的元组进行连接得到相同的最终结果。

SELECT S.SNO,SNAME
FROM S,(SELECT SNO FROM SC 
		WHERE CNO = '3' AND GRADE>80 ) SM
WHERE S.SNO = SM.SNO;

在这里插入图片描述


②自身连接查询:
连接操作不仅可以在不同的表间进行,亦可以是一个表与自身进行连接,称为表的 自身连接
例2:
查询一门课的间接先修课(先修课的先修课)

SELECT first.Cno,second.Cpno
FROM C first, C second
WHERE first.Cpno = second.Cno;

查询结果如下:
在这里插入图片描述
上述示例中,我们对C表进行了自身连接查询,为了便于区分我们分别为C表取了别名即first、second。由显示的结果我们可以发现有的课程没有间接先修课,但任然显示在了表中,故我们可进一步添加条件对查询结果,进行修改使之不显示;

SELECT first.Cno,second.Cpno
FROM C first, C second
WHERE first.Cpno = second.Cno AND second.Cpno IS NOT NULL;

优化后的查询结果如下:
在这里插入图片描述


③外连接:
在通常的连接操作中,只有满足连接条件的元组才会作为结果输出,如:在查询选修了课程的学生的学号时,由于S表中有些学生没有选修课程,,在SC表中没有相应的元组,导致S表中这些元组在连接时被舍弃了,这些舍弃的元组称为[ 悬浮元组 ]。外链接可分为<左外连接>和< 右外连接>
经过细细思考,我们不难发现,之所以会出现这种舍弃现象,其本质原因在于,进行查询时,我们选取的【基准表】(参照表)不同,类比于物理学中的【参考系】,当我们选取的参考系不同时,我们对于某一物体运动状态的描述一般是不同的。但选定的参考系始终是处于静止状态的。
外连接操作的一般格式如下(以S表和SC表举例):
S left/right outer join SC on (join conditions);
说明:left表示左外连接(以左边的表为基准),right表示右外连接(以右边的表为基准),join conditions表示进行外连接的连接条件。

#S左外连接SC:
SELECT S.*,SC.CNO,GRADE
FROM S LEFT OUTER JOIN SC ON(S.SNO = SC.SNO);
#S右外连接SC:
SELECT S.*,SC.CNO,GRADE
FROM S RIGHT OUTER JOIN SC ON(S.SNO = SC.SNO);

查询结果如下:在这里插入图片描述
由显示结果我们可以看出,进行左连接时(以S表为基准),SC表中没有的元组任然显示出来;
进行右链接查询时(以SC表为基准),SC表中没有的元组被舍弃。


2.嵌套查询

在SQL语句中,一个SELECT---FROM---WHERE语句成为一个查询块。讲一个查询块嵌入到另一个查询块的WHERE子句或HAVING短语的条件中的查询称为<嵌套查询(nested query)>。在外层的查询块称为<外层查询(父查询)>,嵌在内层的查询块称为<内层查询(子查询)>。嵌套查询使用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。以层层潜逃的方式来构造程序正是SQL中“ 结构化 ”的含义所在。
[注意]:子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序]。


①带有谓词IN的子查询:
在嵌套查询中,子查询的结果往往是一个集合(或者说也是一张二维表),因此,谓词IN在嵌套查询中较为常用。
例1:
查询与李勇在同一个系的学生。

SELECT *FROM S
WHERE Sdept IN(
	SELECT Sdept FROM S
	WHERE Sname = '李勇');

查询结果如下:
在这里插入图片描述

例2:
查询选修了课程名为“数学”的学生学号与姓名。

#方法一:嵌套查询
SELECT S.SNO, SNAME FROM S
     WHERE SNO IN (
     		SELECT SNO FROM SC
     		WHERE CNO IN (
     			SELECT CNO FROM C
     			WHERE CNAME LIKE '数学'));
#方法二:使用连接查询
 SELECT S.SNO,SNAME
    FROM S,SC,C
    WHERE S.SNO = SC.SNO AND SC.CNO = C.CNO AND CNAME = '数学';

查询结果如下:
在这里插入图片描述
在这里插入图片描述
有些嵌套查询可以使用连接运算代替,所以在实际应用中,能够用连接运算表达的查询我们一般尽可能采用连接运算。在上面的两个例中,子查询的查询条件不依赖于父查询,称为 <不相关子查询>。


②带有比较运算符的子查询:
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当确切知道内层查询返回的是单个值时,可用“>”、“<”等比较运算符连接。
事实上,我们所说的含有谓词IN的子查询其实也属于带有比较运算符的子查询的范畴。因为当内查询的结果是单个值时,可以用=代替IN
例1:
查询每个学生的单科分值超过其选修的所有课程的平均分的课程号,课程名。

 SELECT X.SNO, X.CNO
    FROM SC X
    WHERE GRADE>(SELECT AVG(GRADE) FROM SC Y
     			 WHERE X.SNO = Y.SNO);

查询结果如下:
在这里插入图片描述
本例中的子查询条件依赖于父查询,所以这类查询叫做 <相关子查询>。求解相关子查询不能向求解相关父查询那样一次将查询求解出来,然后去求解父查询。由于内层查询与外层查询相关联,因此必须反复求值。


③带有ANY(有的系统用SOMEALL谓词的子查询:

子查询返回单值时可以使用比较运算符,但返回多值时要用ANYALL谓词修饰符。而使用ANYALL谓词时则必须同时使用比较运算符。如:> ANY表示大于查询结果中的某一个值,> ALL则表示大于查询结果中的所有(任意)值。
例1:
查询非计算机院中比计算机院所有学生年龄都小的学生的姓名及年龄。

#方法一:直接法
SELECT SNAME,SAGE
     FROM S
     WHERE SAGE < ALL(
     		SELECT SAGE
     		FROM S
     		WHERE SDEPT LIKE 'CS'
     		)AND SDEPT <>'CS';
 #方法二:(间接法)等价转换
  SELECT SNAME,SAGE
   FROM S
   WHERE SAGE<(SELECT MIN(SAGE) FROM S 
     		   WHERE SDEPT='CS')AND SDEPT <> 'CS';

查询结果如下;
在这里插入图片描述
在这里插入图片描述
小结:
实际上,博主认为,带有ANY(有的系统用SOME或ALL谓词的子查询,可以说分别对应数学中不等式的存在性恒成立与问题,因此,可以用聚集函数中的最值函数进行等价转换。事实上,用聚集函数实现子查询的效率通常比用ANYALL的查询效率要高。
ANYALL等价转换的聚集函数:

=<>或!=<<=>>=
ANYIN<MAX<=MAX>MIN>=MIN
ALLNOT IN<MIN<=MIN>MAX>=MAX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven环境搭建及配置

文章目录一、系统要求二、安装步骤1.JDK检查2.下载Maven3.配置Maven环境变量4.检查配置一、系统要求 项目要求JDKMaven 3.3 要求 JDK 1.7或以上Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上磁盘Maven 自身安装需要大约 10 MB 空间。除此之外&#xff0c;…

​破除“内卷”,什么才是高阶智能座舱更优方案?

下一代智能座舱雏形已现。 从多屏互动到舱内全场景交互&#xff0c;从中控娱乐快速延伸到更多元化的车内娱乐平台&#xff1b;越来越多元化功能集中上车&#xff0c;座舱空间的营造&#xff08;包括氛围灯、香氛等&#xff09;以及AR技术的应用等等&#xff0c;开始深刻影响着…

活动目录密码策略管理

员工使用的密码可以决定或破坏组织中的数据安全性。但是&#xff0c;知道员工通常不遵循良好的密码卫生习惯也就不足为奇了。从在本机工具&#xff08;如 Windows Active Directory 组策略&#xff09;中设置弱密码和通用密码到宽松的密码策略规则&#xff0c;有几个因素对密码…

基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发(一)总体设计

2.1 功能要求及性能指标 2.1.1 功能要求 &#xff08;1&#xff09;具备方位和俯仰两轴运动的能力&#xff1b; &#xff08;2&#xff09;方位轴可实现预置、周扫和扇扫功能&#xff1b; &#xff08;3&#xff09;俯仰轴可实现预置功能。 2.1.2 性能指标 &#xff08;1&#…

【英语】大学英语CET考试,听力题答题技巧笔记(3-4)与技巧总结

文章目录听力技巧课3&#xff08;长选项关键词&#xff09;听力技巧课4&#xff08;所有划关键词的方法&#xff0c;真题带练&#xff09;听力技巧总结&#xff08;1-4&#xff09;听力技巧课1&2&#xff1a;地址 听力技巧课3&#xff08;长选项关键词&#xff09; 上课老…

JWT 认证机制

Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端按口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 JWT (英文全称: JSON Web Token)是目前最流行的跨域认…

LeetCode算法小抄--二叉搜索树

LeetCode算法小抄--二叉搜索树二叉搜索树(BST)寻找第 K 小的元素[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problems/kth-smallest-element-in-a-bst/)二叉搜索树的转化[538. 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/…

AI提效工具|借助chatgpt快速读论文,快速总结、归纳、索引相似文章

目前新论文层出不穷&#xff0c;“快速阅读论文”成为研究者们一个必备能力。本文简单记录了近期出现的两个借助chatgpt来帮助我们快速读论文的“神器”&#xff0c;帮助大家快速上手应用&#xff0c;迅速提升论文阅读速度。 此外&#xff0c;本人也会定期更新记录一些类似的“…

酷开科技携手蓝凌数字化OA,释放数字生产力

疫情虽已落幕&#xff0c;但协同办公理念却逐步升级&#xff0c;伴随企业进入到以数字办公为基础的新周期。以提升管理效率为目的的协同办公在人工智能、大数据等技术的加持下&#xff0c;快速步入赋能办公、提升办公效率的自律型协作模式。 数字化时代&#xff0c;时间、空间…

涨点技巧:IOU篇---Yolov8引入WIoU,SIoU,EIoU,α-IoU,不同数据集验证能涨点

1.IOU介绍 IoU其实是Intersection over Union的简称,也叫‘交并比’。IoU在目标检测以及语义分割中,都有着至关重要的作用。 首先,我们先来了解一下IoU的定义: 我们可以把IoU的值定为为两个图形面积的交集和并集的比值,如下图所示: 1.1 Yolov8自带IOU方法 GIoU, DIoU,…

[测试猿课堂]接口自动化软件测试Requests模块从0到精通 一篇搞定

Requests模块是Python中一个非常流行的第三方库&#xff0c;用于处理HTTP请求。在接口自动化测试中&#xff0c;Requests模块可用于模拟发送HTTP请求并检查响应数据&#xff0c;以验证API的功能和性能。以下是与Requests模块相关的一些知识点&#xff0c;这些知识点都是从事接口…

【Python_Scrapy学习笔记(七)】基于Scrapy框架实现数据持久化

基于 Scrapy框架实现数据持久化 前言 本文中介绍 如何基于 Scrapy 框架实现数据持久化&#xff0c;包括 Scrapy 数据持久化到 MySQL 数据库、MangoDB数据库和本地 csv 文件、json 文件。 正文 1、Scrapy数据持久化到MySQL数据库 在 settings.py 中定义 MySQL 相关变量 # 定…

cuda-gdb 基础使用指南

cuda-gdb 基础使用指南 本文的cuda-gdb的简单入门指导&#xff0c;主要的参考是官方文档.但是原文是英文,又找了腾讯家的文档翻译机器,可惜水平着实一般.如果在使用过程中有更细的要求,可以看文档,本文最后贴出原文的目录,可以自己按图索骥,看看有没有其他的需求. 入门要求 …

GDOUCTF2023 Reverse题解

文章目录题目附件Check_Your_LuckTEA基本逻辑:show函数setKey函数encode函数(tea算法):judge函数解题脚本doublegamesnakefun迷宫关键循环题目附件 链接&#xff1a;https://pan.baidu.com/s/1W0GisS4R-rHYHK4Bu167_g?pwdnw4c Check_Your_Luck 可以看到五条方程,根据方程可…

Flutter开发日常练习-小猫咪杂货店

贴三张效果图 1.欢迎页面 2.商品展示列表 3.购物车页面 因为数据是本地的所以创建本地数据 final List _shopItems [["ZaoShui.", "25.00", "assets/8b10de68e58cfef6bd5f22e5321537.jpg", Colors.green],["ZaoQi.", "25.0…

Unity --- 枪类与子弹类的设计初探 与 Physics Material

1.类的设计方法 --- 首先将不同的对象相同的行为和方法做到一个类A中&#xff0c;然后再给每个对象各创建一个类&#xff0c;并且都继承大类A&#xff0c;同时在自己的类中创建自己独有的方法或者属性 1.一般子弹的射击都是用射线检测的方式去做的 --- 用碰撞器会出现我们不想要…

STM32-高级定时器输出比较模式实验

比较输出功能&#xff1a;定时器通过对预设的比较值与定时器特定寄存器的值做比较之后&#xff0c;并依据相应的输出模式从而实现各类输出&#xff0c;如PWM输出、电平翻转、单脉冲模式等。一般来说&#xff0c;STM32的通用定时器和高级定时器都具有比较输出功能&#xff0c;不…

使用putty在云服务器上安装jdk

在云服务器上安装jdk的步骤&#xff1a; 1. 登录到云服务器&#xff0c;打开putty终端&#xff0c;并使用root账户登录。 2. 在终端中输入以下命令&#xff0c;更新软件包列表&#xff1a; sudo apt-get update 3. 安装OpenJDK 8&#xff0c;请在终端中输入以下命令&#…

leetcode-1041. 困于环中的机器人

leetcode-1041. 困于环中的机器人1. 算法题目2 . 实现思路3. 参考代码1. 算法题目 题目如下&#xff1a; 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的…

Level_2(2)题目整理

文章目录L2-022 重排链表&#xff08;模拟❗&#xff09;L2-023 图着色问题L2-024 部落(并查集)L2-025 分而治之&#xff08;与 L2-023差不多&#xff0c;邻接表遍历&#xff09;L2-026 小字辈&#xff08;求树的深度&#xff09;L2-027 名人堂与代金券(&#x1f4a1;处理&…