1.왜 서브쿼리를 쓰는가?
1.1 SELECT절의 순서를 바꾸기 위해 사용한다.
SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 1 AND 10
위의 SQL문을 최신 등록순으로 정렬한 결과를 상위 열명을 나타내기 위해선 다음과 같은 SQL문을 생각할 수 있다.
SELECT *
FROM MEMBER
ORDER BY REGDATE DESC
WHERE ROWNUM BETWEEN 1 AND 10
하지만 SQL문을 실행하면 오류가 생긴다. ORDER BY 절은 WHERE절 다음에 와야한다. 하지만 순서를 지키지 않았기 때문에 문제가 생긴다. 즉 쿼리 실행순서 오류다. SQL 실행순서에 따르면 위의 조건(최신 등록순으로 정렬한 결과를 상위 열명을 나타내기)를 만족하는 SQL문을 짤 수 없다. 그래서 서브쿼리를 활용한다.
SELECT *
FROM (SELECT * FROM MEMBER ORDER BY REGDATE DESC)
WHERE ROWNUM BETWEEN 1 AND 10
서브쿼리를 활용해 SQL문을 짜면 SQL실행순서에 위배되지 않고 실행할 수 있다.
1.2 WHERE절에 집계함수를 써야하는 경우
WHERE절은 집계함수(SUM,MIN,MAX,COUNT,AVG)를 쓸 수 없다. 하지만 서브쿼리를 활용하면 WHERE절에 집계함수를 쓴 것과 같은 효과를 볼 수 있다. 만약 평균나이 이상(30)인 회원을 출력하는 SQL문을 짠다고 가정해보자. 서브쿼리를 사용하지 않으면 다음과 같은 SQL문을 짤 것이다. WHERE절은 집혜함수를 쓸 수 없을 뿐더러 평균값은 매번 바뀌기 때문에 오류가 발생한다.
SELECT * FROM MEMBER
WHERE AVG(AGE) >= 30
하지만 여기에 서브 쿼리를 사용해준다면 똑같은 결과물을 나타내는 SQL문을 작성할 수 있다.
SELECT * FROM MEMBER
WHERE AGE >= (SELECT AVG(AGE) FROM MEMBER