서브쿼리: 스칼라·인라인 뷰·상관 서브쿼리, DB별 차이
5. 자주 하는 실수 (Tip)
실수 1: 스칼라 서브쿼리 자리에 여러 행이 나올 조건을 빼먹는다
WHERE dept = '개발' 을 서브쿼리 안에 안 넣고 바깥에만 넣으면, 서브쿼리는 전체 부서를 대상으로 실행되어 여러 행을 반환합니다. 서브쿼리 안의 조건과 바깥 조건을 같이 맞춰야 합니다.
실수 2: 인라인 뷰에 별칭을 안 붙인다
MySQL·MSSQL 은 파생 테이블 별칭이 없으면 오류가 납니다. Oracle 도 별칭이 없으면 컬럼을 가리킬 방법이 없어 사실상 못 씁니다. 인라인 뷰는 쓰는 순간 바로 별칭부터 정합니다.
실수 3: 상관 서브쿼리와 비상관 서브쿼리를 헷갈린다
바깥 쿼리 컬럼을 참조하면 상관, 안 하면 비상관입니다. 상관 서브쿼리는 바깥 행마다 다시 실행되므로 성능에 영향을 주고, 비상관은 한 번만 계산되어 상대적으로 가볍습니다. 실행 계획을 보기 전에 코드만 보고도 구분할 수 있어야 합니다.
실수 4: ROWNUM 을 정렬 전에 건다
SELECT * FROM emp WHERE ROWNUM <= 3 ORDER BY sal DESC 는 임의의 3행을 뽑은 뒤 정렬하는 것이라 "상위 3명"이 아닙니다. 반드시 정렬을 먼저 끝낸 인라인 뷰에 ROWNUM 조건을 겁니다.