以下列sql为例:-- 查询有成绩的学生的姓名
-- 查询有成绩的学生的姓名
SELECT *
FROM student
WHERE student.sno IN(SELECT sno FROM score GROUP BY sno)
SELECT *
FROM student
WHERE EXISTS(SELECT score.sno
FROM score
WHERE student.sno=score.sno)
in关键字的执行顺序:
当使用in关键字进行查询的话:子表是驱动表,引擎先把子表的数据查询出来,然后将结果及和外表的数据做一个笛卡尔积,然后根据条件判断那些数据进行保留。
exists关键字的执行顺序:
当使用exists关键字进行查询的话:外表是驱动表,引擎先把外表数据查询出来,再对每条数据执行exists关键字后面的语句,判断数据是否保留,exists语句返回true的话保留,返回false的话去除。
所以:当外表数据量比较大且外表有索引,子表数据量比较小的时候,比较适合使用in关键字进行查询。
当外表数据量比较小,子表数据量比较大且有索引的情况下,比较适合使用exists关键字进行查询。