在报表开发实践中,因为查询逻辑复制,经常会用到NOT EXIST这种操作,有时候,结果是对的,但是查询效率却不尽如人意。
重新认识NOT EXIST :
在MySQL中,"NOT EXIST"通常用于查询操作,它是"EXIST"关键字的反面,用于检查一个子查询是否不返回任何行。
"NOT EXIST"通常在"SELECT", "INSERT" 或 "UPDATE"语句中使用,它可以用来检查主表中的一行是否不存在于子查询结果中。
1.查询一个表中的数据,但在另一个表中不存在。如查询没有子表数据的主表数据。
SELECT *
FROM tableA
WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE tableA.id = tableB.id);
2.将不存在与第二张表的数据插入到指定表中
INSERT INTO tableA (column1, column2)
SELECT column1, column2
FROM tableB
WHERE NOT EXISTS (SELECT 1 FROM tableC WHERE tableC.id = tableB.id);
3.更新操作
UPDATE tableA
SET tableA.column1 = '1'
WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE tableA.id = tableB.id);
注意:在使用"NOT EXIST"时,子查询应尽可能高效,因为它可能会导致全表扫描。如果可能,最好使用JOIN或其他方法替代"NOT EXIST",以提高查询效率。
NOT EXIST的一些替代方案:
MySQL中使用NOT EXISTS
进行子查询优化时,可以考虑以下几种方法:
-
使用
LEFT JOIN
代替NOT EXISTS
,并在WHERE
子句中加上对左连接结果为NULL的判断。 -
对于简单的查询,可以考虑使用
NOT IN
代替NOT EXISTS
。 -
对于返回结果集较大的子查询,可以考虑先将子查询的结果集临时保存到一个临时表中,然后再对这个临时表进行查询。
NOT IN 替代
SELECT a.*
FROM table1 a
WHERE a.id NOT IN (SELECT b.id FROM table2 b);
LEFT JOIN 替代
SELECT a.*
FROM table1 a
LEFT JOIN table2 b ON a.id = b.id
WHERE b.id IS NULL;
实践中,若子查询较为复杂LEFT JOIN 方式更高效