对于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 后面的条件成立,则列出数据,否则为空。