首页 > 数据库 >零基础MySQL IN与EXISTS笔记总结

零基础MySQL IN与EXISTS笔记总结

来源:互联网 2026-07-25 08:48:09

MySQL中IN和EXISTS用于子查询过滤。IN判断值是否在列表中,EXISTS判断子查询是否存在关联行。以学生成绩表为例,两者均可查出有成绩的学生,而NOTEXISTS则查出无成绩者。实际应用中,IN适合子查询结果集较小,EXISTS则更高效于大结果集。

适合刚接触子查询的MySQL初学者。本文通过同一套「学生/成绩」示例,详细讲解INEXISTS的用法与区别,帮助零基础用户快速掌握SQL子查询过滤技巧。

零基础MySQL IN与EXISTS笔记总结

长期稳定更新的攒劲资源: >>>点此立即查看<<<

一、IN与EXISTS的核心作用

在MySQL中,INEXISTS常与子查询搭配,用于数据过滤。简单来说,就是先查看另一组数据,再决定当前表中的哪些行需要保留。

以下是直观理解:

关键字通俗解释
IN左边的值,是否在右边的列表中?
EXISTS对于当前行,括号内的子查询能否至少返回一行?

二、准备示例数据

学生表 students

student_idname
1小明
2小红
3小刚

成绩表 scores

score_idstudent_idsubjectscore
1011语文90
1021数学85
1032语文92

结论:小明、小红有成绩;小刚没有成绩

三、IN:判断值是否在列表中

3.1 固定值列表

SELECT * FROM students WHERE student_id IN (1, 2, 5);

含义:查询学号为1、2或5的学生。

  • 如果在列表中 → 条件为真,保留该行
  • 如果不在 → 条件为假,排除该行

3.2 列表来自子查询

需求:找出有成绩的学生

SELECT * FROM students WHERE student_id IN (SELECT student_id FROM scores);

执行逻辑:

  1. 先执行子查询:从 scores 获取所有 student_id,例如 (1, 1, 2),去重后相当于列表 (1, 2)
  2. 再扫描 students:判断每个学生的学号是否在列表中
  3. 在列表中的学生被保留

逐步分析:

学生student_id在列表中?结果
小明1保留
小红2保留
小刚3排除

查询结果:

student_idname
1小明
2小红

四、EXISTS:检查是否存在关联行

同样需求:找出有成绩的学生

SELECT * FROM students s WHERE EXISTS (SELECT 1 FROM scores sc WHERE sc.student_id = s.student_id);

4.1 理解方式

对于外层每一行学生,执行一次内层子查询:

  • 如果内层查询至少返回一行 → EXISTS 为真 → 保留该学生
  • 如果内层查询返回零行 → 为假 → 排除该学生

注意:SELECT 1 只是占位符,EXISTS 只关心是否有行存在,不关心具体值。

4.2 逐步执行

小明(id=1)

  • 成绩表中是否有 student_id = 1 的记录?有 → 保留

小红(id=2)

  • 是否有 student_id = 2 的记录?有 → 保留

小刚(id=3)

  • 是否有 student_id = 3 的记录?没有 → 排除

结果与上面 IN 相同:小明、小红。

五、NOT EXISTS:找出没有成绩的学生

SELECT * FROM students s WHERE NOT EXISTS (SELECT 1 FROM scores sc WHERE sc.student_id = s.student_id);
学生是否有成绩NOT EXISTS结果是否保留?
小明
小红
小刚

结果:

student_idname
3小刚

也可以使用 NOT IN 实现:

SELECT * FROM students WHERE student_id NOT IN (SELECT student_id FROM scores);

在干净数据中,结果同样是小刚。

注意:NOT IN 的子查询结果如果包含 NULL,会导致意外行为;许多场景更推荐使用 NOT EXISTS。初学者先了解这个差异即可。

六、IN与EXISTS的选择(入门视角)

多数业务中,两者可以写出等价结果,但思考角度不同:

INEXISTS
思考方式先有一份值列表,判断是否在其中对当前行询问:是否存在匹配行
直观写法id IN (1,2,3)id IN (子查询)EXISTS (带关联条件的子查询)
适用场景列表较短,语义明确为“属于集合”语义明确为“是否存在关联数据”

关于性能:具体取决于数据量、索引和优化器,不要死记“永远谁更快”。入门阶段,优先保证写对、读得懂

七、与外键约束的关系(可选了解)

  • 外键约束:插入数据时禁止指向不存在的学生
  • IN / EXISTS:查询时筛选“是否存在关联成绩”等

外键是写入时的约束,而IN/EXISTS是查询时的过滤手段,两者共同帮助理解“表与表如何关联”。

八、一句话总结

IN:值是否在列表中。

EXISTS:对于当前行,子查询是否至少存在一行。

NOT EXISTS:对于当前行,是否不存在关联行。

以“找出有成绩的学生”为例:

  • IN:学号是否出现在成绩表的学号列表中
  • EXISTS:该学生在成绩表中能否找到记录

结果相同,但思考角度不同。

九、练习

  1. IN 查询有成绩的学生(默写一遍)。
  2. EXISTS 再写一遍。
  3. NOT EXISTS 查询没有成绩的学生。

能不看笔记写出正确SQL,这部分内容就掌握了。

笔记整理自零基础学习过程,示例表为 students / scores。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。