쿼리가 실행되는 순서는 다음과 같다.
- from [어느 테이블에서?]
- where [조건]
- order by 혹은 group by etc..
- select [조회시 필요한 값]
사원 별로 급여를 많이 받는 사람 5명을 조회하라는 쿼리가 있다면, 음 ~ 사원 테이블에서 급여 많이 받는 순으로 정렬하고 rownum으로 5명 컷 하면 되겠지 하면서 다음과 같은 쿼리를 짜게 된다.
select empnm -- 사원명
,sal -- 급여
from emp -- 사원 테이블
where rownum <= 5
order by sal desc
이게 맞냐? ㅎ 글쓴이 역시 그랬지만 위에 순서를 보면 틀렸다는 걸 알 수 있다. 이렇게 쿼리를 짜버리면 급여 별로 내림차순 정렬을 하기전 테이블에 저장된 순서로 5명을 먼저 커트해버린다...
그렇다. 잘 못 짠 쿼리다. 그래서 항상 쿼리가 실행되는 순서를 기억하고 있어야 한다. 물론 다른 사람들은 잘 할 것이기 때문에 이 글을 읽지 않아도 되겠지만, 나같은 쿼알못은 이렇게라도 해놔야 기억할 것 같아 작성한다.
select v.empnm
,v.sal
from ( select empnm
,sal
from emp
order by sal desc
) v
where rownum <= 5
1) from절에 있는 서브 쿼리를 통해 사원 별 급여 리스트가 내림차순으로 정렬된 테이블 v에서
2) where절 조건을 통해 5명 이하만을
3) 사원명과 급여를 조회한다!
SQL 공부를 더 열심히 해야겠다.... :)