数据库查询优化之用exists替换in,not exists替换not in
2017-11-06 16:59
615 查看
对于in和not要慎用,会导致全表扫描
用户表
CREATE TABLE USER(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);
插入数据
INSERT INTO USER VALUE(101,NOW(),'下单');
INSERT INTO USER VALUE(102,NOW(),'下单');
INSERT INTO USER VALUE(103,NOW(),'下单');
INSERT INTO USER VALUE(105,NOW(),'下单');
INSERT INTO USER VALUE(106,NOW(),'下单');
INSERT INTO USER VALUE(107,NOW(),'下单');
INSERT INTO USER VALUE(108,NOW(),'下单');
日活跃表
CREATE TABLE active(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);
INSERT INTO active VALUE(101,NOW(),'下单');
INSERT INTO active VALUE(102,NOW(),'下单');
INSERT INTO active VALUE(103,NOW(),'下单');
INSERT INTO active VALUE(105,NOW(),'下单');
INSERT INTO active VALUE(106,NOW(),'下单');
INSERT INTO active VALUE(107,NOW(),'下单');
INSERT INTO active VALUE(108,NOW(),'下单');
INSERT INTO active VALUE(998,NOW(),'下单');
INSERT INTO active VALUE(999,NOW(),'下单');
用户表是用户的信息,日活跃表包含老用户和新用户。
问题?
查询日活跃表中的新用户信息。
传统的not in查询
SELECT active.id,active.TIME FROM active WHERE id NOT IN(SELECT id FROM USER);
优化的sql,使用exists
SELECT active.id,active.TIME FROM active WHERE NOT EXISTS(SELECT id FROM USER WHERE user.id=active.id);
EXISTS在SQL中的作用是:检验查询是否返回数据。当 where 后面的条件成立,则列出数据,否则为空。
用户表
CREATE TABLE USER(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);
插入数据
INSERT INTO USER VALUE(101,NOW(),'下单');
INSERT INTO USER VALUE(102,NOW(),'下单');
INSERT INTO USER VALUE(103,NOW(),'下单');
INSERT INTO USER VALUE(105,NOW(),'下单');
INSERT INTO USER VALUE(106,NOW(),'下单');
INSERT INTO USER VALUE(107,NOW(),'下单');
INSERT INTO USER VALUE(108,NOW(),'下单');
日活跃表
CREATE TABLE active(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);
INSERT INTO active VALUE(101,NOW(),'下单');
INSERT INTO active VALUE(102,NOW(),'下单');
INSERT INTO active VALUE(103,NOW(),'下单');
INSERT INTO active VALUE(105,NOW(),'下单');
INSERT INTO active VALUE(106,NOW(),'下单');
INSERT INTO active VALUE(107,NOW(),'下单');
INSERT INTO active VALUE(108,NOW(),'下单');
INSERT INTO active VALUE(998,NOW(),'下单');
INSERT INTO active VALUE(999,NOW(),'下单');
用户表是用户的信息,日活跃表包含老用户和新用户。
问题?
查询日活跃表中的新用户信息。
传统的not in查询
SELECT active.id,active.TIME FROM active WHERE id NOT IN(SELECT id FROM USER);
优化的sql,使用exists
SELECT active.id,active.TIME FROM active WHERE NOT EXISTS(SELECT id FROM USER WHERE user.id=active.id);
EXISTS在SQL中的作用是:检验查询是否返回数据。当 where 后面的条件成立,则列出数据,否则为空。
相关文章推荐
- SQL优化查询提高查询效益之in、not in、between、like等条件讲述 数据库Sql,VFP,Access
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
- SQL查询中in、exists、not in、not exists的用法与区别
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- Sql语句优化之用exists、not exists替代in、not in
- in,not in,exists,not exists的区别及not exists 代替max查询效率更高
- SQL语句优化—in,not in,exists,not exists, left join...on
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- sql语句优化--用EXISTS替代IN、用NOT EXISTS替代NOT IN
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
- Not in ,in替换解决文字not EXISTS,EXISTS
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
- IN,NOT IN,EXISTS,NOT EXISTS的用法和差别
- in,not in,exists,not exists的区别
- oracle笔记(6)----exists 和not exists、in、not in
- in,exists和not exists ,not in与null的一些关系记载
- 编写高性能 SQL 之一:SQL中 IN,NOT IN,EXISTS,NOT EXISTS 的用法和差别
- in, not in, exists, not exists, join 改写
- mysql 查询优化 in 和 not in