【MySQL】IN 的学习,以及和 EXISTS的区别

1、 EXISTS 的语法

语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。
说明: EXISTS (包括 NOT EXISTS) 子句的返回值是一个 BOOL 值。 EXISTS 内部有一个子查询语句 (SELECT ... FROM...), 我将其称为 EXIST 的内查询语句。其内查询语句返回一个结果集。 EXISTS 子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

2、IN () 和 EXISTS () 语句内部工作原理

2.1 IN () 语句内部工作原理

2.2 EXISTS () 语句内部工作原理

2.3 各自适用场景

  • 当 A 表数据与 B 表数据一样大时,in 与 exists 效率差不多,可任选一个使用。
  • 通常情况下采用 exists 要比 in 效率高,因为 IN 不走索引。但要看实际情况具体使用:
    • IN 适合于外表大而内表小的情况;
    • EXISTS 适合于外表小而内表大的情况。

3、如何使用

3.1 使 IN () 和 EXISTS () 有相同作用

很多时候用 exists 代替 in 是一个好的选择:

select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)

4、参考

  1. in 和 exist 区别 - lick4050312 的专栏 - CSDN 博客
    注:特别清晰,包括 IN 和 EXISTS 的区别,各自适用场景,以及 EXISTS 字段的详细解析。
  2. SQL 中 EXISTS 的用法 - Dsw - 博客园
    注:具体语法和用法说的很详细。
  3. SQL查询中in和exists的区别分析 - 简书
    注:具体语句执行内部原理,很详细。
  4. sql 中 exists,not exists 的用法 - 飞翔 - 方向 积累 沉淀 - 博客园

原文地址:https://www.cnblogs.com/buwuliao/p/11712169.html

时间: 2024-10-30 01:31:06

【MySQL】IN 的学习,以及和 EXISTS的区别的相关文章

Mysql(个人学习笔记20170321-20170328)

Mysql(个人学习笔记20170321-20170328) 数据库定义:按数据结构组织,存储,管理数据的仓库 常见数据库:Mysql,Oracle,Sql server 数据库由二维表组成,表格由若干记录,每条记录由若干字段组成 理解为Excel的话 列为字段,行为记录 设计数据库步骤 1,确定功能列表 2,确定可见数据参数类型 常用类型有 Int 整数型 Float 小数 Varchar(长度) char(长度) 字符串 (赋值需要单引号) 区别:varchar 长度可变,不足位数自动取消,

MYSQL视图的学习笔记

MYSQL视图的学习笔记,学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具   1.       视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表.视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据. 在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的

mysql 存储过程简单学习

转载自:http://blog.chinaunix.net/uid-23302288-id-3785111.html ■存储过程Stored Procedure 存储过程就是保存一系列SQL命令的集合,将这些sql命令有组织的形成一个小程序,这样会实现很复杂的处理 SQL基本是一个命令一个命令执行,虽然可以通过连接.子查询等实现些高级的处理,但局限性是显而易见的 ■存储过程的优势 1.提高执行性能(存储过程事先完成了解析.编译的处理,执行时能减轻数据库负担) 2.可减轻网络负担(比起多次传递SQ

linux下mysql数据库的学习

转载博客:http://freedomljtt.blog.163.com/blog/static/72294949201210145441701/ ubuntu12.04 卸载和安装mysql 卸载mysql 第一步 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server 3 sudo apt-get autoremove mysql-server 4 sudo apt-get r

mysql常用命令学习

1.\c取消当前准备执行的sql语句. mysql> select user,host,password from mysql.user;\c +--------+-----------+----------+ | user   | host      | password | +--------+-----------+----------+ | root   | localhost |          | | root   | mytest2   |          | | root  

MySQL Innodb 架构学习

一.MySQL后台线程   1.Master Thread 核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘.例如脏页的刷新,插入缓冲的合并,undo 页的回收等. 1)每秒一次的操作: 日志缓冲刷新到磁盘,即使该事务还没有提交.该操作总是会发生,这个就是为了再大的事务,提交时间都很短. 当IO压力很小时(1s内发生的IO次数小于5% innodb_io_capacity)合并5% innodb_io_capacity 的插入缓冲. 当脏页比例大于 innodb_max_dirty_pages

mysql 触发器的学习1

mysql> #接下来学习触发器的概念mysql> #触发器是由事件来触发某个操作的,包括insert update delete语句mysql> #触发器的基本形式:mysql> #create trigger 触发器名 before|after 触发事件 on 表名 for each row 执行语句mysql> #如果需要执行多条语句则使用 begin …… end 不同语句之间用“:”分号分割mysql> #所以使用多行执行语句时,一定要用到的是 delimit

MYSQL数据库基础学习笔记

一.mysql的安装与初始化: 安装mysql命令: yum install -y mysql-server mysql mysql-devel 初始化: service mysqld start   //第一次启动mysqld服务会自动初始化: 创建用户并初始化密码: mysqladmin -u root passwd '密码' 登陆mysql: mysql -u root -p 退出mysql: quit.exit 设置mysqld服务自启动: chkconfig mysqld on mys

MySQL查询计划学习

以select_type为线索: 1) SIMPLE:简单的SELECT,不实用UNION或者子查询 mysql> explain select * from t2; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | r