1.In子查询:
SELECT a.*
FROM table_a a
WHERE a.id IN (SELECT b.id FROM table_b b WHERE b.status = 'active');
这种子查询一般用inner join 进行优化,因为in要求查询两张表中的共有结果集:
优化为:
SELECT a.*
FROM table_a a
INNER JOIN table_b b ON a.id = b.id
WHERE b.status = 'active';
2.exist子查询:这个子查询其实和in是类似的,也是要求a在b中存在的数据集
SELECT a.*
FROM table_a a
WHERE EXISTS (SELECT 1 FROM table_b b WHERE b.id = a.id AND b.status = 'active');
优化为:
SELECT a.*
FROM table_a a
INNER JOIN table_b b ON a.id = b.id AND b.status = 'active';
3.not exist子查询可以用left join 或者right join优化:
SELECT a.*
FROM table_a a
WHERE NOT EXISTS (SELECT 1 FROM table_b b WHERE b.id = a.id AND b.status = 'active');
要求查询a结果集不存在与b中数据,可以利用left join的特性:查询关联表中的数据,即使被关联表中数据不匹配,其中如果查询字段如果有被关联表中的字段,那么不匹配的字段值就为null;可以利用这个特性优化
SELECT a.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id AND b.status = 'active'
WHERE b.id IS NULL;
这个·结果集要求b.id为null,其实就是查询的和被关联表中不匹配的数据