NOT EXIST(mysql)
在报表开发实践中,因为查询逻辑复制,经常会用到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 方式更高效