Mysql之IN 和 Exists 用法

1.基本用法

  IN:后面的子查询 是返回结果集的,换句话说执行次序和Exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.

Exists:后面的子查询被称做相关子查询, 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是 "select   1 "的原因,当然也可以select任何东西) 其运行方式是先运行主查询一次。再去子查询里查询与其对应的结果,如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询。

2.运行过程

Exists执行顺序如下: 
  1.首先执行一次外部查询 
  2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。 
  3.使用子查询的结果来确定外部查询的结果集。(如果外部查询返回100行,SQL   就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询 优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。)

IN的执行过程如下:

  1.首先运行子查询,获取子结果集

  2.主查询再去结果集里去找符合要求的字段列表,.符合要求的输出,反之则不输出。

3.区别

3.1 IN和Exists

 IN是把外表和内表作hash 连接,而Exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为Exists比IN效率高的说法是不准确的。

如果查询的两个表大小相当,那么用IN和Exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用Exists,子查询表小的用IN

例如:表A(小表),表B(大表):

  select from where cc in (select cc from B)

效率低,用到了A表上cc列的索引;

  select from where exists(select cc from where cc=A.cc) 

效率高,用到了B表上cc列的索引。

相反的:

  select from where cc in (select cc from A)

效率高,用到了B表上cc列的索引;

  select from where exists(select cc from where cc=B.cc)

效率低,用到了A表上cc列的索引。

3.2 not IN not Exists

  not IN not Exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not Exists都比not IN要快。

3.3 in 与 = 的区别

  select name from student where name in (‘A‘,‘S‘,‘D‘,‘F‘);

  select name from student where name=‘A‘ or name=‘S‘ or name=‘D‘ or name=‘F‘

的结果是相同的。

时间: 2024-07-28 12:50:56

Mysql之IN 和 Exists 用法的相关文章

msql数据库in和exists用法比较

exists:用法:select * from table1 where exists (select * from table2 where table1.id = table2.id )返回table1中和table2中id相同的记录(双重循环)结果和in语法一样,思想不一样,in:select * from table1 where id in (select id from table2 ) 2者思路不一样:exists:先获得每一条table1的数据,然后获得id字段,去table2表

MySQL: ON DUPLICATE KEY UPDATE 用法

使用该语法可在插入记录的时候先判断记录是否存在,如果不存在则插入,否则更新,很方便,无需执行两条SQL 这个语句知识mysql中,而标准sql语句中是没有的. INSERT INTO .. ON DUPLICATE KEY更新多行记录 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并

oracle中的exists 和not exists 用法详解

oracle中的exists 和not exists 用法详解 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>

php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:  代码如下 复制代码 mysql> SELECT SQL_CA

SQL中if exists用法细节

用if exists建表[转] 1 判断数据库是否存在 Sql代码 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名]  if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] 2 判断表是否存在 Sql代码 if exists (select * from sysobjects w

Mysql 中的CASE WHEN 用法

在SELECT语句查询中可以使用CASE WHEN对查询出来的结果,进行一个类似于if else的判断. 具体的用法 1. SELECT a.website_id, b.customer_name, a.website_enddate, c.member_name, d.websitetype_id,            CASE                 WHEN d.websitetype_id=1 THEN 400                WHEN d.websitetype

oracle中的exists 和not exists 用法详解(转)

有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高. exists 用法:

oracle中的exists 和not exists 用法 in与exists语句的效率问题

博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源(  in与exists语句的效率问题):http://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html (一) exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1    A1 2

mysql sum() 求和函数的用法

查询在record表中 name=? 的 money 加起来的值使用聚和函数 sum() 求和select sum(money) from record t where t.name = ?另外:count() 求记录数avg() 求平均值 mysql sum() 求和函数的用法 SUM函数的语法是: 代码如下 复制代码 SELECT SUM(expression )FROM tablesWHERE predicates; 表达式可以是一个数值字段或公式. 简单的例子 例如,你可能想知道合并全体