: 조회된 행이 몇번째 행인지 부여해주는 것 즉, 조회된 순서대로 순번을 매긴다.
✔️ROWNUM을 사용한 곳에 ORDER BY를 사용할 수 없다. ORDER BY를 사용해야 한다면 서브쿼리 안에 사용할 것!
--[rownum] 월급이 높은 순으로 사번, 이름, 월급을 상위 5명만 출력
select rownum,empno,ename,sal
from (select empno,ename,sal
from emp
order by sal desc) -- ❗ select,from 2번 쓴다. (이중 서브쿼리)
where rownum<=5;
-- 월급이 높은 순으로 사번, 이름, 월급을 상위 3번~5번 사람들 출력
select rownum,ee.* --테이블명.*
from (select rownum,e.* -- = ins_rownum,empno,ename,sal
from (select rownum ins_rownum,empno,ename,sal
from emp order by sal desc)e)ee -- ❗ select,from 3번 쓴다. (3중 서브쿼리)
where ins_rownum between 3 and 5;
---
* e 참고
select rownum,e.* -- = ins_rownum,empno,ename
from (select rownum as ins_rownum,empno,ename from emp order by ename asc)e;
---- 이중 서브쿼리
select rownum,ins_rownum,empno,ename
from
(select rownum as ins_rownum,empno,ename
from emp order by ename asc)
where rownum<=3;
-- 3중 서브쿼리
select *
from(select rownum as sel_rownum,empno,ename
from (select rownum as ins_rownum,empno,ename
from emp order by ename asc))
where sel_rownum between 4 and 8;
exists(서브쿼리) 데이터가 한 건이라도 있으면 true, 없으면 false.
데이터량이 많을 때 exists 사용하는 것이 성능에 좋다.
--1) 조인
select e.ename, d.dname from emp e, dept d
where e.deptno = d.deptno;
--2) 서브쿼리
select e.ename, e.deptno from emp e
where e.deptno in (select deptno from dept);
--3) exists
select e.ename, e.deptno from emp e
where exists (select deptno from dept d where e.deptno=d.deptno);
in과 exists는 같은 결과가 조회된다. in은 서브쿼리 결과를 모두 수행하고, exists는 일치하는 결과가 있으면 더 이상 수행하지 않는다.