MySQL 中的 IN 和 EXISTS零基础笔记总结

 更新时间:2026年07月24日 10:11:32   作者:会编程的土豆  
在MySQL中,IN和EXISTS都用于子查询,但它们的‌执行逻辑‌、‌适用场景‌和‌对NULL值的处理‌有显著区别,本文介绍MySQL中的IN和EXISTS实例详解,感兴趣的朋友一起看看吧

适合刚接触子查询的同学。用同一套「学生 / 成绩」例子,把 INEXISTS 讲清楚。

一、它们是干什么的

在 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小刚

也可以写成:

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:对当前行,子查询是否至少存在一行。
NOT EXISTS:对当前行,是否不存在关联行。

同一道「有成绩的学生」:

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

结果可以一样,想问题的角度不同。

九、练习

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

能不看笔记写出来,这部分就算过关了。

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

到此这篇关于MySQL 中的 IN 和 EXISTS(零基础笔记)的文章就介绍到这了,更多相关mysql in和exists内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 5.7.23 winx64解压版安装教程

    mysql 5.7.23 winx64解压版安装教程

    这篇文章主要为大家详细介绍了mysql 5.7.23 winx64解压版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • MySQL 临时表使用和创建

    MySQL 临时表使用和创建

    本文介绍了MySQL临时表的概念、使用方法以及注意事项,临时表是一种仅在当前会话中存在的表,适用于存储临时数据、优化查询性能和简化数据操作,通过创建、插入数据、查询数据以及更新和删除数据等操作,可以实现临时表的使用,感兴趣的朋友一起看看吧
    2025-03-03
  • 快速理解MySQL中主键与外键的实例教程

    快速理解MySQL中主键与外键的实例教程

    这篇文章主要介绍了MySQL中主键与外键的区别和联系,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Navicat Premium如何导入SQL文件的方法步骤

    Navicat Premium如何导入SQL文件的方法步骤

    这篇文章主要介绍了Navicat Premium如何导入SQL文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mysql 8.0.12 安装配置图文教程

    mysql 8.0.12 安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.12 安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • MySQL表锁问题及解决方案深度解析

    MySQL表锁问题及解决方案深度解析

    在mysql数据库中,锁表是保证数据一致性的重要机制,但不当使用会导致阻塞甚至死锁,这篇文章主要介绍了MySQL表锁问题及解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-07-07
  • MySQL Online DDL原理及使用详解

    MySQL Online DDL原理及使用详解

    本文介绍了MySQL Online DDL的发展历史,包括各个版本的改进,重点讲解了Copy和Inplace算法,以及OnlineDDL过程中的锁策略,还分析了DDL操作的需求、MySQL5.7和8.0的功能特点,以及使用限制和注意事项,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • CentOS7卸载MySQL5.7的方法步骤

    CentOS7卸载MySQL5.7的方法步骤

    这篇文章主要介绍了CentOS7卸载MySQL5.7的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Windows8下mysql 5.6.15 安装配置方法图文教程

    Windows8下mysql 5.6.15 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows8下mysql 5.6.15 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 抽取oracle数据到mysql数据库的实现过程

    抽取oracle数据到mysql数据库的实现过程

    今天小编就为大家分享一篇关于抽取oracle数据到mysql数据库的实现过程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论