数据库sql语句的exists和in的区别

性能变化的关键:

#1 执行的先后顺序

谁是驱动表,谁先执行查询,谁后执行查询

#2 执行过程

exists的优点是:只要存在就返回了,这样的话很有可能不需要扫描整个表。

in需要扫描完整个表,并返回结果。

所以,在字表比较小的情况下,扫描全表和部分表基本没有差别;但在大表情况下,exists就会有优势。

看这两个语句:

--子查询会执行完全关联,并返回所有符合条件的city_id

select * from areas where id in   (select city_id from deals where deals.city_id = areas.id);

--子查询的关联其实是一样的,但子查询只要查到一个结果,就返回了,所以效率还是比较高些的

select * from areas where exists (select null     from deals where deals.city_id = areas.id);

#3 字表查询的结果

exists判断子查询的结果是不是存在,但查到什么结果,什么字段,并不关心;

in      需要子查询查得的结果给主查询使用

对于inexists的性能区别:
   如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
   其实我们区分inexists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,

如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了

另外IN时不对NULL进行处理。

注意:NOT EXISTS与 NOT IN不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。

对于not in和 not exists的性能区别:
    not in只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
   如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
NOT IN在基于成本的应用中较好

时间: 2024-10-07 02:51:24

数据库sql语句的exists和in的区别的相关文章

SQL语句中exists和in的区别

转自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/article/details/4476333 表展示 查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 一.确定给定的值是否与子查询或列表中的值相匹配.in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.所以相对内表

mysql数据库sql语句调优 、

mysql数据库sql语句调优 . 索引设计原则: 索引列一般为where子句中的列或连接字句中的列 尽量不对基数小的列做索引,如性别列 尽可能使用短索引:如果对字符列索引尽量指定最小长度. (short Keys are better,Integer best) create index cityname on city(city(10)); 复合索引前缀特性,索引的顺序很重要. key(a,b,c)联合索引: 可以走索引的组合:key(a),key(a,b ),key(a,b,c) 下列索引

使用MySQL数据库 SQL语句

1.查看当前服务器数据库中有哪些库? SHOW   DATABASES;   ###查看有哪些库 2.查看当前使用的库有哪些表? USE +要查询的库名 SHOW   TABLES; ###查询库中有哪些表 3.查看标的结构? USE  +要使用的库名 DESCRIBE  +表名 ###查看表结构 4.创建新的库? CREATE   DATABASE +表名  ###创建库 5.创建新的表 CREATE   TABLE +表名 (字段1名称   类型 ,字段2名称   类型,...)  ###创

SQL语句中SUM与COUNT的区别

SUM是对符合条件的记录的数值列求和 COUNT 是对查询中符合条件的结果(或记录)的个数 例如: 表fruit id     name    price 1     apple     3.00 2     pear       4.00 select count(price) from fruit; ----执行之后结果为:2  (表示有2条记录) select  sum(price) from fruit;---执行之后结果为:7:00(表示各记录price字段之和为7.00) SQL语句

有用的数据库SQL语句

查看数据库的SQL 1.查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size      from dba_tablespaces t, dba_data_files d      where t.tablespace_name = d.tablespace_name      group by t.tablespace_name; 2.查看表空间物理文件的名称及大小 select tablesp

学生选课系统数据库SQL语句考试题

一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用SQL语句创建四个表并完成相关题目. 表1-1数据库的表结构  表(一)Student (学生表) 属性名 数据类型 可否为空 含 义 Sno Char(3) 否 学号(主码) Sname Char(8) 否 学生姓名 Ssex Char(2) 否

Oracle数据库SQL语句书写注意

1.养成良好的变成习惯语句1:select * From tb_shiyq;语句2:select   * from tb_shiyq;这三个语句乍一看是一样的,但是高速缓存是不认的,是全字符匹配的,索引在高速缓存里会存储三条不同的语句,说到这里,又引出一个习惯,就是要保持良好的编程习惯,这个很重要 2.FROM子句后面的表顺序有讲究   ①ORACLE在解析sql语句的时候对FROM子句后面的表名是从右往左解析的,是先扫描最右边的表,然后在扫描左边的表,然后用左边的表匹配数据,匹配成功后就合并.

数据库 SQL语句优化

温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统

数据库—SQL语句

下列语句部分是Mssql语句,不可以在access中使用. SQL分类:   DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)   DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)   DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 CREATE DATABASE database-name   2.说明:删除数据库 drop database dbname