select * from Tf_fdctze t1
where EXISTS (select id from Tf_fdctze t2 where t2.id ='33' and t1.id=t2.id)
exists 判断条件 子查询为true时才会执行查询,
但是切记
与 in
没有绝对的快慢 主要还是看你写的子查询里面sql语句的水平
select * from t where id in(select id from t2 where id ='22' )
子查询返回的记录同时 外围也是查到,类似于for循环 同步
例: 查到了 第5条。 子查询也是第5条,
all 关键字
查询出工资比部门30全部员工工资都高的人
select * from where sal > all( select sal from emp where detp ='30')
上述效率比较高
all 是所有的都必须符合 每比较一次 all都会全部查询一次
select * from where sal >all( select sal from emp where detp ='30')
查询出工资比部门30任意一个工资高的人select * from emp where sal > (select min(sal) from emp where delt ='30')
any 是任意的意思,
select * from emp where sal > any(select sal from emp where delt ='30')
统计每个部门的信息和人数
select d.*(select count(1) from emp s where s.id = d.id ) from dept d
统计每个部门工资在 500-100。1000-3000 3000-5000的人数
select d.*,
(select count(*) from emp e where e.deptno = d.deptno and sal >500 and sal <= 1000) ' 500-1000',
..
from dept d
count(*) 与 count(1) 区别 本质上没有区别,* 与 1 * 是查询所有的列 而 1 是查询非空。如果有空是跳过的
内联子查询
rownum 是 oracle 对结果集加的一个伪劣通常用来排序时。使用
select e.*,rownum from emp e
select e.*,rownum from (select * from emp )e
----------------------------------------------------------------------------------------
rownum是针对结果集来的 他在order by执行顺序之前,所以rownum 会乱掉
select e.*,rownum from emp order by sal -- 此时rownum会乱掉。但是 上面例子外的 rownum却不会乱掉
----------------------------------------------------------------------------------------
(rownum 必须从1 开始。。)
select e.* rownum from (select * rownum from emp order by sal ) e where rownum <=5
查询出在6到10之间的
select * from (select e.* rownum rf from (select * from emp ) e where e.rownum <=10) e2
where e2.rf > 5