IN语句
确定给定的值是否与子查询或列表中的值相匹配。
查询步骤
1.查询子查询的表;
1.将内表和外表做一个笛卡尔积;
1.按照条件进行筛选。
查询次数
只查询一次。
具体SQL语句
查询各个部门入职最晚的员工的信息。
SELECT
*
FROM
emp e
WHERE (e.deptno,e.hiredate)IN(
SELECT
deptno,MAX(hiredate)
FROM
emp
GROUP BY
deptno
);
EXISTS语句
指定一个子查询,检测行的存在。
查询步骤
遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
查询次数
次数与查询外表的长度相同。
具体SQL语句
查询各个部门入职最晚的员工的信息。
SELECT
*
FROM
emp e
WHERE NOT EXISTS(
SELECT
*
FROM
emp
WHERE
hiredate>e.`hiredate`
AND
deptno=e.`deptno`
);
IN与EXISTS的区别及运用场景
1. 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;
2. 如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists;
3. 如果是exists,那么以外层表为驱动表,先被访问;
4. 如果是IN,那么先执行子查询。