概述
Ø 概念:子查询返回的值,与父查询的每一行的值都相关。这种子查询叫做~。
Ø 判断相关子查询的方法:子查询不能脱离父查询而独立运行。
Ø 理解的要点:父查询返回N行,子查询就分别执行N次。
计算列子查询
示例:查询各班有多少人。
select c_id,c_name,
(select count(*) from t_stu s where s.c_id=c.c_id) as 人数
from t_class c;
其中:
父查询是:select c_id,c_name from t_class c
子查询是:select count(*) from t_stu s where s.c_id=c.c_id
父查询返回:
c_id c_name
1 一班
2 二班
3 三班
父查询返回3行,子查询就必须分别执行3次:
c_id c_name
1 一班 select count(*) from t_stu s where s.c_id=1 返回4
2 二班 select count(*) from t_stu s where s.c_id=2 返回2
3 三班 select count(*) from t_stu s where s.c_id=3 返回0
可以看到,子查询的返回值(4,2,0)分别与父查询的值(1,2,3)是息息相关的。即:
select c_id,c_name,
(select count(*) from t_stu s where s.c_id=c.c_id) as 人数
from t_class c;
返回:
c_id c_name 人数
1 一班 4
2 二班 2
3 三班 0
exists子查询
查询哪些班上没有人,最简单的方法是:
select * from t_class c
where c_id not in (select distinct c_id from t_stu s)
它的意思是如果一个班级编号,不在学生表的班级编号中,就证明这个班上没有学生。
但是运行效率很低,其中之一就是not in用不到索引,所以在实际工作中,这种查询“不存在”的情况,往往要用not exists来代替。“not exists与not in”的区别必须掌握,这也是面试常问的问题之一。
用not exists替代的代码是:
select * from t_class c
where not exists
(select * from t_stu s where s.c_id=c.c_id)
注意:使用exists是唯一where后面不需要指定字段的情况。
理解的要点仍然是:父查询返回N行,子查询就分别执行N次。
父查询“select * from t_class c”返回:
c_id c_name
1 一班
2 二班
3 三班
父查询返回3行,子查询分别执行3次:
c_id c_name
1 一班 select * c_id from t_stu s where s.c_id=1
2 二班 select * c_id from t_stu s where s.c_id=2
3 三班 select * c_id from t_stu s where s.c_id=3
执行“select * c_id from t_stu s where s.c_id=1”,返回4行数据。这证明exists为true,而not exists为false。所以1班有人,而要的是没有人的班级,即1班不满足条件,不显示。
同理:执行“select * c_id from t_stu s where s.c_id=2”,也不满足条件,不显示。
当执行“select * c_id from t_stu s where s.c_id=3”时,返回0行数据,这证明满足not exists的条件,所以3班就显示出来了。
重点,exists的高效的原因之一:
子查询只要找到任何一条满足条件的数据,即可证明exists为true,不会查询所有满足条件的记录,这大大提高的查询的效率。
例如:上面1班有4行数据,但exists只会找到任何一个1班学生,就证明1班不满足条件了,马上就会接着判断下一个班。
exists的高效的原因之二:
子查询返回的数据没有任何限制,因为只要证明有数据返回就可以了,而无须关心是什么数据。所以上面的查询经常也写为:
select * from t_class c
where not exists
(select ‘x’ from t_stu s where s.c_id=c.c_id)
注意:子查询返回的数据不再是“*”,而是“x”。
这表示,如果有一行数据返回,则必有一个“x”返回,这是计算列的相关知识。用“x”代表分配char(1),是最节约内存的做法。
exists的高效的原因之三:exists子查询用的是相等比较,如“where s.c_id=c.c_id”,如果在子查询上建立相应的索引(如t_stu表的c_id字段有创建索引,索引名称任意),则用自动用到该索引,从而大大提高效率。
分享到:
相关推荐
内容概要:本文详细介绍了LabVIEW控件的设计与实现,尤其是一些由经验丰富的老工程师精心打造的控件。LabVIEW是一款图形化编程语言,广泛应用于数据采集、仪器控制和工业自动化领域。文中通过具体实例展示了如何利用LabVIEW创建美观且功能强大的控件,如滑动条、波形图、金属质感旋钮、动态波形图表以及智能选项卡等。作者强调了LabVIEW控件在灵活性和美观度方面的优势,并分享了许多实用的技术细节和优化方法。 适合人群:具有一定编程基础并希望深入了解LabVIEW控件设计的开发者和技术爱好者。 使用场景及目标:适用于需要进行高效的数据展示和交互设计的应用场景,如工业控制系统、实验室设备操作界面等。目标是帮助用户掌握LabVIEW控件的高级特性,提高开发效率和用户体验。 其他说明:文章不仅提供了具体的代码示例,还探讨了控件美学背后的设计理念和技术实现,鼓励读者探索更多可能性。
Delphi 12.3控件之unidac_10.4.0_d27pro.exe
11.盛趣自闭面(还是自己太菜).txt
58面经面试过程和题目.txt
电大操作系统课后习题解答
人工智能技术与应用演讲【61页PPT】
chromedriver-mac-arm64-135.0.7049.41.zip
内容概要:本文详细介绍了QPSK(四相移键控)调制方法及其在瑞利信道和高斯白噪声信道下的误码率(BER)性能分析。首先展示了QPSK星座图的绘制方法,接着构建了一个简化的QPSK发射机模型,用于将二进制比特流映射到相应的星座点。随后,分别实现了两种信道模型:高斯白噪声信道(AWGN)和瑞利信道,并解释了它们的工作原理以及如何向传输信号添加噪声。文中还提供了详细的误码率测试脚本,通过大量随机比特进行仿真,最终得到了不同信噪比条件下的误码率曲线。此外,作者还讨论了QPSK与其他调制方式如BPSK、16QAM之间的性能差异,强调了频谱效率与抗噪能力之间的权衡关系。 适合人群:对无线通信系统感兴趣的科研人员、研究生以及从事通信工程领域的工程师。 使用场景及目标:①帮助读者理解QPSK的基本原理及其在不同信道环境中的行为特性;②提供实用的Python代码片段,便于快速搭建仿真环境并验证理论结果;③探讨各种调制方式的选择依据,指导实际应用中的优化决策。 其他说明:文中多次提到‘骚操作’,意指一些巧妙但非传统的编程技巧,有助于提高代码执行效率或简化复杂度。同时提醒读者注意仿真过程中可能出现的问题,如
新建 Microsoft Word 文档 (9).docx
计算机科学与技术- 软件开发工具 培训资料
bitcount统计每个元素中设置的位数 B = bitcount(A) Counts the number '1' bits in each element B = bitcount(A, bitValue) "bitValue" = 1 = default = counts the occurance of '1' if bitValue = 0; counts the number '0' The total bits to verify is [8,16,32,or 64] based on the maximal value of A B = bitcount(A, bitValue, maxBits) the total # of bits to examine
MOM生产运营管理平台解决方案【35页PPT】
deli-数码录音电话机-HCD6238(28)P-TSD-使用说明书
Java项目基于ssm框架的课程设计,包含LW+ppt
Delphi 12.3控件之Tsilang 7.5.0.0 D12.7z
ios+UIButton分类+UIButton+UIButton图片文字位置
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载
Java项目基于ssm框架的课程设计,包含LW+ppt
Delphi 12.3控件之TextEditorPro64.7z
尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块 文章使用的资源,防止gitee资源丢失