6.子查询
更为复杂的子查询
1、子查询
【知识点介绍】
学习到现在,我们已经使用WHERE进行了很多简单的查询,一个条件、多个条件的查询都处理过了。
那么什么是子查询?不妨把子查询理解成嵌套结构,即包含在查询中的查询。
子查询通常会使用到IN、ALL等关键字,除了IN,后者内容我们会在接下来的章节里进行介绍。
例如我们要查询学生表中学生ID、姓名和学分,满足学分大于25的条件,就可以使用子查询了:
SELECT ID,SName,Credit FROM Student WHERE Credit IN (SELECT Credit FROM Student WHERE Credit > 25);
当然这个例子只是为了举例说明子查询,实际操作并无意义,子查询在多表查询中会更实用。
这也也体现了子查询执行效率的问题,实践中我们建议大家适当的使用子查询。
此外,SQL里并没有缩进要求,举例中缩进是为了划分语句块,让语句更易读、逻辑更清晰,好习惯需要慢慢养成哦。
2、ALL\SOME\ANY
【知识点介绍】
ALL可以把列的值与某集合里的全部值进行比较,如果全部比较的结果都匹配才返回TRUE。
ANY或者SOME,含义类似IN,只要匹配到一个值,就返回TRUE。
但ANY与IN是有不同的,ANY只能用于子查询,而IN可以直接匹配列表,而不需要通过子查询来进行匹配。
比如我们要查找学分为28或30分的学生,ANY只能这样写:
WHERE Credit = ANY (SELECT Credit FROM Student WHERE (Credit = 30) OR (Credit = 28));
而用IN就可以直接这么写:
WHERE Credit IN (28,30);
【实例】
以查询学生表中,满足学分大于25的学生条件为例,使用ALL来达到我们的查询目的。
对学分列的所有低于25学分的项进行比较匹配,都满足条件才返回TRUE。
SELECT * FROM Student WHERE Credit > ALL -- Creidt应满足匹配ALL中的所有值 (SELECT Credit FROM Student WHERE Credit <= 25);
3、小结
【知识点介绍】
1.子查询可以用在FROM语句中,也可以用在WHERE语句中,它实际上是嵌套在一些SQL语句中的SELECT子语句;
2.之前我们也讲到过,子查询在使用的时候是需要用括号来包括的,并且结合缩进与换行以保持其语句的可读性;
3.子查询是从里向外进行执行的;
4.一般情况下,子查询里不允许排序,即不能使用ORDER BY。
7.连接
表与表的连接
1、表的连接
【知识点介绍】
在学习连接前,机器人创建了一个新的表Listudent,这个表是Literature专业的学生信息,包含了学号ID、学院学号LID、姓名SName、性别Sex、班级Class、学分Credit、出生地Birthplace这些学生信息。
【实例】
SQL里连接(JOIN)是一个强大的功能,它能让两个或多个表结合起来,并可以通过主键和外键使它们的产生联系。
PS:在多表查询的时候,我们建议以 表名.列名 方式来指明具体的列。
查看SQL语句,点击运行,查看Student表和Listudent表是如何进行连接查询
SELECT Student.ID,Student.SName,Listudent.Class FROM Student,Listudent WHERE Student.ID = Listudent.ID;
2、INNER JOIN
【知识点介绍】
INNER JOIN关键字同样可以把两个表给连接起来,并获取其中的行数据,要求至少存在一个匹配项。
它的语法如下:
SELECT 列,列, FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
【实例】
使用INNER JOIN连接2个表,并查询满足学分高于20的学生信息。
SELECT Student.ID,Student.SName,Student.Credit,Listudent.Class FROM student INNER JOIN Listudent -- 两张表进行INNER JOIN ON Student.ID = Listudent.ID WHERE Listudent.Credit > 20; -- 学分判断条件
3、RIGHT\LEFT JOIN
【知识点介绍】
RIGHT JOIN连接表,并从右表中返回所有行的数据,无视左表是否有匹配的值;
LEFT JOIN连接表,并从左表中返回所有行的数据,无视右边是否有匹配的值。
它们的语法规则如下:
SELECT 列,列, FROM 表1 RIGHT\LEFT JOIN 表2 ON 表1.列 = 表2.列;
【实例】
Student RIGHT JOIN ON Listudent 将会返回后表的所有内容,
而
Student LEFT JOIN ON Listudent 则会返回前表的所有内容。
分别运行两个查询,查看RIGHT JOIN与LEFT JOIN返回的数据的区别。
查询1:
SELECT * FROM student RIGHT JOIN Listudent ON Student.ID = Listudent.ID;
查询2:
SELECT * FROM student LEFT JOIN Listudent ON Student.ID = Listudent.ID;
4、小结
SQL中还有一种FULL JOIN(全连接),只要存在匹配,则返回该行的数据。我们可以把它理解成RIGHT JOIN和LEFT JOIN的结合版。可惜的是,目前MySQL、Access、Oracle等数据库软件不支持该语法。
此外人们通常把INNER JOIN、RIGHT\LEFT JOIN、FULL JOIN这些连接方法称为外连接;
而直接在两个表内进行条件匹配的连接,比如本节的第一个知识点中通过Student.ID = Listudent.ID在两个表内直接进行连接匹配,这种方法被称为内连接或者自然连接。
8.组合查询
组合查询合作共赢
1、什么是复合查询
【知识点介绍】
组合查询也叫并查询、复合查询、联合查询,是用来合并两个或多个SELECT语句的查询,不同的数据库软件里组合查询的内容会略有不同,组合查询可以把多个查询的结果组合成一个结果集。
通常在SQL我们会用到UNION、UNION ALL、EXCEPT等关键字组合多个SELECT语句来进行查询。
2、UNION
【知识点介绍】
UNION是组合查询里重要的一个关键字,它可以把两个或多个SELECT语句组合起来,不包括重复的记录。
使用UNION时我们要注意一点:
每个SELECT语句里选择的列的数量、数据类型、顺序必须相同。
UNION的使用语法如下:
SELECT 表1.列1,表1.列2 FROM 表1 WHERE[子句] UNION SELECT 表2.列1,表2.列2 FROM 表2 WHERE[子句];
【实例】
使用UNION对Student表和Listudent表的ID和SName进行组合查询。
每个SELECT语句中选择查询的列的数量、数据类型、顺序要一一对应相同。
SELECT student.ID,student.SName FROM student UNION SELECT listudent.ID,listudent.SName FROM listudent;
3、UNION ALL
【知识点介绍】
UNION ALL与UNION不同的是,UNION ALL 返回的结果是包含重复记录的,而UNION返回的结果是不重复的。
UNION ALL的使用语法和UNION一致,只是关键字多加了ALL:
SELECT 表1.列1,表1.列2 FROM 表1 WHERE[子句] UNION ALL SELECT 表2.列1,表2.列2 FROM 表2 WHERE[子句];
【实例】
使用UNION ALL,查看它与UNION的返回结果有什么不同。
在UNION之后添加关键字ALL,看看它的结果是否包含了两个表中重复的记录。
SELECT student.ID,student.SName FROM student UNION ALL SELECT listudent.ID,listudent.SName FROM listudent;
4、INTERSECT\EXCEPT
【知识点介绍】
INTERSECT是交集的意思,使用INTERSECT关键字可以组合两个SELECT语句,但只返回第一个SELECT语句中与第二个SELECT语句里一样的记录,使用语法等同于UNION。
EXCEPT关键字与INTERSECT不同,它组合两个SELECT语句,返回的是第一个SELECT语句中有,但第二个SELECT语句里没有的记录。
目前MySQL5.0并不支持INTERSECT和EXCEPT,而Oracle和SQL Server是支持的。
4、组合查询里使用ORDER BY
【知识点介绍】
ORDER BY可以在组合查询里使用,但它只能对最后的查询结果进行排序,我们不能在组合查询的子语句中使用ORDER BY。
在对最后结果进行排序的时候,我们不能指定某个列来进行排序,而只能用数字或别名来定义排序规则。
【实例】
查询两个表中学分低于25分的部分学生信息,对其结果进行排序。
对最后的结果进行排序,其排序规则需要通过数字或别名来引用。
SELECT student.ID,student.SName,student.Credit FROM student WHERE student.Credit < 25 UNION SELECT listudent.ID,listudent.SName,listudent.Credit FROM listudent WHERE listudent.Credit < 25 ORDER BY 1; -- 使用ORDER BY并引用数字对结果进行排序
5、组合查询里使用GROUP BY
【知识点介绍】
GROUP BY也是用来排序,它可以对最终的结果进行排序,但还可以使用在组合查询的每一个子句中,
【实例】
使用GROUP BY对每个子语句都进行分数的排序
GROUP BY可以使用在每个SELECT语句中。
SELECT student.ID,student.SName,student.Credit FROM student WHERE student.Credit < 25 GROUP BY Credit DESC -- 分数从高到低 UNION SELECT listudent.ID,listudent.SName,listudent.Credit FROM listudent WHERE listudent.Credit < 25 GROUP BY Credit; -- 分数从低到高
小结
1、小结
【知识点介绍】
使用组合查询可极大地简化复杂的SQL子句, 简化从多个表中检索查询的工作。
本章我们除了组合查询,还学习了单查询、查询操作符、子查询、表的连接查询。我们要理清每个知识的用法、逻辑,这对我们以后的实践操作是有很大帮助的。
或许你会问JOIN和UNION有什么区别?
首先,它们的语法有很大的区别,UNION对每个SELECT语句查询选择都是有规定的,它们的作用也有很大的区别;
此次,从过程上来讲,JOIN是两张或多种表连接后,对符合匹配条件的记录生成一个新的记录集合,而UNION则是先对各自的表进行记录,再合并记录形成新的记录集合。
下文待续。。。。。。
欢迎大家前往访问我们的官网:
http://www.datanew.com/datanew/homepage
http://www.lechuangzhe.com/homepage
相关推荐
1. 子查询:在SQL查询中嵌套另一个查询,用于获取满足特定条件的数据。 2. 分组与聚合函数:GROUP BY用于对数据进行分组,COUNT、SUM、AVG、MAX和MIN等聚合函数用于计算分组后的统计信息。 3. 视图(View):虚拟表...
本教程将带你逐步深入SQL的世界,从基础到进阶,帮助你轻松自学。 一、SQL简史与数据库历史 SQL的历史可以追溯到1970年代,由IBM的研究员Raymond Boyce和Donald Chamberlin共同设计,当时称为SEQUEL(Structured ...
3. **查询优化**:避免全表扫描,合理使用JOIN、子查询、GROUP BY等操作,减少锁定和I/O操作。使用EXPLAIN分析SQL执行计划,确保查询效率。 4. **存储引擎选择**:InnoDB是MySQL的默认存储引擎,支持事务处理和行级...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
wrf转mp4播放器1.1.1
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
国网台区终端最新规范
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
GSDML-V2.33-LEUZE-AMS3048i-20170622.xml
微信小程序项目课程设计,包含LW+ppt
微信小程序项目课程设计,包含LW+ppt
终端运行进度条脚本
幼儿园预防肺结核教育培训课件资料
python,python相关资源
《基于YOLOv8的智慧校园电动车充电桩状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
deepseek 临床之理性软肋.pdf
SM2258XT量产工具(包含16种程序),固态硬盘量产工具使用
RecyclerView.zip
水务大脑让水务运营更智能(23页)
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。