【数据库】SQL经典面试题 - 数据库查询 - 子查询应用二
2024-08-25 01:03:38
上节课我们通过子查询,完成了查询的最高分学生的需求,今天我们来学习子查询的分类,以及通过子查询来完成工作中经常遇到一些个性化需求。
子查询概念:
一个SELECT语句嵌套在另一个SELECT语句中,子查询也叫做内部查询,而包含子查询的语句又称为外部查询或主查询,子查询自身可以包含一个或多个子查询,一个查询语句中可以嵌套任意数量的子查询
子查询可分类:
非相关子查询:独立于外部查询,子查询只执行一次,执行完将结果传递给外部查询相关子查询:依赖于外部查询的数据,外部查询每执行一次,子查询就执行一次
面试题:
还是这道数据库面试题柠檬班第30期学生要毕业了,他们的成绩存放在下表中,写出以下的SQL语句
题目一:查询最新的一条记录
Order by 方式:
降序排列然后得到我们最新的一条记录,这是我们常写的一种方式
SELECT * FROM tb_lemon_grade ORDER BY id DESC LIMIT 1;
子查询方式:
但查询最新一条记录,也可以这么去思考:查看id值最大(id是自动增长的,最新表示id值最大)的记录,所以可以这么去写查询
SELECT * FROM tb_lemon_grade WHERE id = ( SELECT max(id) FROM tb_lemon_grade);
其中子查询SELECT max(id) FROM tb_lemon_grade查询的是记录表中最大的一个id,在整个查询中,只会查询一遍,这种就是非相关子查询,执行完毕后,会将值传递给外部查询。
题目二:查询Linux成绩高于平均分的所有同学
子查询方式:
SELECT * FROM tb_lemon_grade WHERE Linux > ( SELECT avg(Linux) FROM tb_lemon_grade );
上面子查询SELECT avg(Linux) FROM tb_lemon_grade也是非相关子查询,语句只会执行一遍
关联查询方式:
这个题目我们可以使用两个表的关联查询得到结果
SELECT t1.* FROM tb_lemon_grade t1,(SELECT avg(Linux) avgLinux FROM tb_lemon_grade) t2
where t1.Linux>t2.avgLinux;
题目三:查询每个班级Linux成绩高于本班Linux平均分的所有同学:
子查询方式
SELECT * FROM tb_lemon_grade t1
WHERE t1.Linux >(
SELECT avg(t2.Linux) FROM tb_lemon_grade t2
WHERE t1.class_name = t2.class_name
);
我们来分析下这个题目,查询每个班级Linux成绩高于本班Linux平均分的所有同学,而每个班的Linux平均分不同,所以我们采用相关子查询,语句中的这个子查询依赖于外部的查询( 子查询中的t1.class_name = t2.class_name就是外部的表),外部查询每执行一次,子查询就执行一次。
分组的方式写子查询:
SELECT * FROM tb_lemon_grade t1
WHERE t1.Linux > (
SELECT avg(t2.Linux) FROM tb_lemon_grade t2
GROUP BY t2.class_name
HAVING t1.class_name = t2.class_name );
关联查询方式:
通过分组查询出每个班的最高分,再与原表进行等值连接查询,得到最后结果。
SELECT * FROM tb_lemon_grade t1, (
SELECT avg(Linux) avgLinux, class_name
FROM tb_lemon_grade
GROUP BY class_name
) t2
WHERE t1.class_name = t2.class_name
AND t1.Linux>t2.avgLinux;
最新文章
- java使用Executor(执行器)管理线程
- Gnu/Linux的学习探索
- C# DateTime和String转换
- MVC – 4.mvc初体验(1)
- oracle 的安装脚本
- Rails--default_scope
- 刀哥多线程之一次性代码gcd-11-once
- emplace_back与push_back的区别
- vc中调用Com组件的方法详解
- DateTime.Now的一些用法
- androidStudio 中 gradle 常用功能
- web离线应用--dom storage
- fiddler安装 与 https
- 第25月第8天 100-Days-Of-ML-Code
- 新装的Delphi XE10 空白的安卓程序编译报错 F1027 Unit not found: 'System.pas'
- BFS+二进制状态压缩 hdu-1429
- mac os x lipo 工具
- oracle 学习blogs
- C#.NET常见问题(FAQ)-如何把文本复制粘贴到文本框的光标位置
- linux 上安裝lnmp
热门文章
- [转帖]紧急预警:Globelmposter3.0变种来袭,多行业中招
- <;script>;document.write(location.href)<;/script>;
- Petr and Permutations CodeForces - 987E(逆序对)
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
- BZOJ 1208 宠物收养所 | 平衡树模板题
- Monitor WMIExportsToC++Use DiskCleanup bypass UAC
- vim 折叠的用法
- [Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法(转)
- 理解 OAuth 2.0
- 解题:SHOI 2012 回家的路