in : 常用匹配多个定值中其中的一个,效率,子查询的记录数较少时可以 使用 in
in (1,2,3,4) 相当于or
where(结果集){
if(deptno =20){
print();
}
if(deptno =10){
print();
}
if(deptno =30){
print();
}
if(deptno =40){
print();
}
}
查询工资大于1500 且 and 含有佣金的人员姓名
select ename, sal
from emp
where (empno, sal) in (select empno, sal
from emp
where comm is not null
and sal > 1500)
in是把外表和内表做了hash连接,内表返回记录过多,会产生临时表,效率低
exists 子查询的条件为真,获取记录,在子查询的记录数较多时或者存在区间区间时 使用
exists (子查询存在记录)
可以理解while为一个循环,如下:
while(外层结果集){
boolean flag =false;
while(内层结果集){
if(条件满足){
flag =true;
break;
}
}
if(flag){
print(匹配结果);
}
}
求工资在500到1500之间,部门编号为20或者30的员工信息
select ename, empno, deptno, sal
from emp a
where exists (select 1
from emp b
where a.sal between 500 and 1500
and a.deptno in (20, 30)
and a.empno = b.empno)
这种查询时有区间的要求,用exists,in不适合