EXISTS代替IN
注:当B表的数据集必须小于A表的数据集时,用in优于exists;
#使用IN
SELECT * FROM class_a WHERE id IN ( SELECT id FROM class_b);
#使用EXISTS
SELECT * FROM class_a A WHERE EXISTS (SELECT * FROM class_b B WHERE A.id = B.id);
#即
SELECT ... FROM TABLE WHERE EXISTS(subquery)
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。
提示
EXISTS(subquery)只返回TRUE或FALSE,因此子查询中的SELECT*也可以是SELECT 1或其他,官方说法是实际执行时会忽略SELECT清单,因此没有区别;
EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题;
EXISTS子查询往往也可以用条件表达式、其他子查询或者JOIN来替代,何种最优需要具体问题具体分析;