当前位置: 首页 > news >正文

SQL 子查询与多表 JOIN 用法大全(速查版)

在 SQL 学习和面试中,子查询 和 多表 JOIN 是两类非常常见的语法点。很多人对它们的适用场景和区别容易混淆。本文将带你速查这两类用法,并结合典型示例,帮你快速掌握核心要点。

一、什么是子查询?

子查询(Subquery)是指将一个查询嵌套在另一个查询中,常用于条件过滤、结果生成或虚拟表。

常见场景:

1. 条件过滤(常与 WHERE 搭配)

2. 结果生成(嵌套在 SELECT 中)

3. 虚拟表(嵌套在 FROM 中,相当于临时表)

示例:

-- 查询成绩最高的学生

SELECT name, score

FROM Student

WHERE score = (SELECT MAX(score) FROM Student);

这里 (SELECT MAX(score) FROM Student) 就是一个子查询。

二、子查询的分类

1. 标量子查询

返回单个值,可以放在 WHERE 或 SELECT 中。

SELECT name, score

FROM Student

WHERE score > (SELECT AVG(score) FROM Student);

2. 列子查询

返回一列,用 IN、ANY、ALL 等关键字进行比较。

SELECT name

FROM Student

WHERE id IN (SELECT student_id FROM Course WHERE course_name = '数学');

3. 表子查询

返回多列多行,相当于一个虚拟表。

SELECT t.name, t.score

FROM (SELECT name, score FROM Student WHERE score > 90) t;

三、什么是 JOIN?

JOIN 用于把多张表关联起来查询,核心思想是通过某个公共字段(通常是主键和外键)将数据拼接在一起。

常见 JOIN 类型:

1. INNER JOIN:只返回两表匹配的数据。

2. LEFT JOIN:保留左表全部数据,右表不匹配时返回 NULL。

3. RIGHT JOIN:保留右表全部数据,左表不匹配时返回 NULL。

4. FULL JOIN(部分数据库支持):返回两表所有数据,不匹配的部分补 NULL。

示例:

-- 查询每个学生和对应的课程

SELECT s.id, s.name, c.course_name

FROM Student s

INNER JOIN Course c ON s.id = c.student_id;

四、子查询 vs JOIN

在很多场景下,子查询和 JOIN 都能实现相同的结果,但它们的逻辑不同:

子查询:逻辑更直观,适合分步思考,常用于条件过滤。

JOIN:执行效率通常更高,适合一次性拼接数据。

示例对比:

-- 子查询写法:找出选修“数学”的学生

SELECT name

FROM Student

WHERE id IN (

  SELECT student_id FROM Course WHERE course_name = '数学'

);

-- JOIN 写法:找出选修“数学”的学生

SELECT s.name

FROM Student s

INNER JOIN Course c ON s.id = c.student_id

WHERE c.course_name = '数学';

两者的结果相同,但执行效率上,JOIN 往往优于子查询。

五、面试高频陷阱

1. 问:子查询一定比 JOIN 慢吗?

不一定,现代数据库优化器会自动将子查询优化成 JOIN,但复杂嵌套子查询依然可能性能差。

2. 问:什么时候用子查询更合适?

当逻辑分步骤清晰,或者 JOIN 写法过于复杂时。

3. 问:什么时候用 JOIN 更合适?

需要大表关联、聚合统计,且结果要高性能时。

六、最佳实践

1. 能用 JOIN 的地方尽量用 JOIN,性能更好。

2. 子查询更适合逻辑清晰的条件过滤,特别是 IN、EXISTS 场景。

3. 大数据场景下,避免过度嵌套子查询,容易拖慢查询效率。

七、总结

子查询:擅长条件过滤,逻辑直观。

JOIN:擅长多表拼接,性能更高。

面试时,能熟练切换子查询和 JOIN 的写法,是 SQL 水平的体现。

一句话记忆:

“子查询重逻辑,JOIN 重效率。”

http://www.dtcms.com/a/438884.html

相关文章:

  • Leetcode 239. 滑动窗口最大值 优先队列 / 双向单调队列
  • Nacos 工作原理及流量走向
  • 夏津网站建设茂名企业建站程序
  • OSPF 单区域实验 概念及题目
  • 建立一个门户网站WordPress域名后问号英文
  • 自上而下VS自下而上:设计哲学全解
  • 【开题答辩全过程】以 SpringCloud家乡美旅行交流博客平台为例,包含答辩的问题和答案
  • 2015优先中文公司官网wordpress模板
  • 国外优秀企业网站网络空间的竞争归根结底是
  • 哪些外贸网站可以做soho求网站2021给个网址
  • 2022年网站能用的兰州企业网站制作
  • 网页设计与网站建设实战大全推荐好的网站或网页
  • 查看网站是否做百度推广如果在网上接网站建设项目
  • 如何用源码搭建网站源码网站搭建规划
  • 【办公类-117-01】20250924通义万相视频2.5——三个小人(幼儿作品动态化)
  • PBS, 以太坊的棘刺雕猴
  • 【未来】智能体互联时代的商业模式变化和挑战:从HOM到AOM
  • 域名免费注册网站网站模板凡建站
  • 关键词挖掘站长c 教程如何做网站
  • 爬坑 10 年总结!淘宝全量商品接口实战开发:从分页优化到数据完整性闭环
  • 网站的设计制作流程网络营销的流程
  • 网站改版计划珠宝 网站模板
  • LangChain源码分析(九)- 向量存储
  • 鸿蒙NEXT系列之探索鸿蒙PC
  • 大岭山镇网站建设公司酷家乐线下培训班
  • 【C++实战(66)】从0到1:C++图形化编程实战之Qt基础入门
  • LeetCode199
  • 潍坊网站建设小程序制作深圳活动策划设计机构
  • 《SaaS网关多租户治理:从串流到稳控的实践》
  • 网站后台登录地址修改大诚设计网站建设