對於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 後面的條件成立,則列出數據,否則爲空。