서브쿼리는 하나의 SQL 문장 안에 포함된 또 다른 SELECT 문을 의미합니다. SQLD 시험에서는 서브쿼리의 다양한 유형과 각 유형에 맞는 연산자 사용법, 그리고 성능 측면에서의 특징을 정확히 이해하는 것이 중요합니다.
SELECT 문.( )로 감싸야 합니다.Single-row Subquery)WHERE 절에서 =, > , <, >= , <= , <> 등 단일 비교 연산자를 사용합니다.ORA-01427 같은 오류가 발생합니다.Multi-row Subquery)IN, ANY, ALL, EXISTS 등 다중 행 비교 연산자를 사용해야 합니다.IN: 서브쿼리 결과 중 하나라도 일치하는지 확인.> ANY: 서브쿼리 결과 중 최솟값보다 큰지 확인.< ANY: 서브쿼리 결과 중 최댓값보다 작은지 확인.> ALL: 서브쿼리 결과 중 최댓값보다 큰지 확인.< ALL: 서브쿼리 결과 중 최솟값보다 작은지 확인.> 또는 = 같은 단일 비교 연산자를 사용하면 오류가 발생합니다.Scalar Subquery)SELECT 절이나 ORDER BY 절에서 사용됩니다.Inline View)FROM 절에서 사용되는 서브쿼리입니다.Correlated Subquery)EXISTS와 함께 자주 사용됩니다.IN, ANY, ALL, EXISTS는 다중행 서브쿼리에만 사용 가능. 단일 비교 연산자(=, >)는 단일 행에만 사용 가능.IN vs EXISTS: IN은 서브쿼리의 모든 결과를 메모리에 로드한 후 비교하지만, EXISTS는 조건을 만족하는 첫 번째 행이 발견되면 바로 종료되므로, 대용량 데이터에서는 EXISTS가 더 효율적일 수 있습니다.> ANY vs > ALL: ANY는 가장 작은 값보다 큰지, ALL은 가장 큰 값보다 큰지 비교합니다.=, >)IN, ANY, ALL, EXISTS)> ANY = Min 보다 크다.> ALL = Max 보다 크다.1. 다음 쿼리가 실행되었을 때 예상되는 오류는?
(단, 서브쿼리의 결과는 여러 건이다.)
SELECT * FROM Emp WHERE deptno = (SELECT deptno FROM Dept WHERE loc IN ('DALLAS', 'NEW YORK'));
A. 문법 오류
B. 결과가 0건인 경우
C. 단일행 서브쿼리가 여러 행을 반환하여 발생하는 오류
D. 다중행 서브쿼리가 단일 행을 반환하여 발생하는 오류
2. 다음 SQL문이 의미하는 바는?
SELECT * FROM Emp WHERE sal > ANY (SELECT sal FROM Emp WHERE job = 'SALESMAN');
A. SALESMAN의 평균 급여보다 많은 급여를 받는 사원
B. SALESMAN 중 가장 적은 급여를 받는 사원보다 많은 급여를 받는 사원
C. SALESMAN 중 가장 많은 급여를 받는 사원보다 많은 급여를 받는 사원
D. SALESMAN의 급여와 동일한 급여를 받는 사원
3. 다음 서브쿼리 유형과 그 특징이 올바르게 연결된 것은?
A. 스칼라 서브쿼리 - FROM 절에서 사용되는 임시 테이블
B. 인라인 뷰 - SELECT 절에서 사용되며 1행 1열만 반환
C. 상관 서브쿼리 - 메인 쿼리 한 행마다 반복적으로 실행
D. 다중 행 서브쿼리 - > 연산자와 함께 사용 가능
=라는 단일 비교 연산자를 사용했기 때문에 오류가 발생합니다.> ANY는 서브쿼리 결과의 최솟값보다 크다는 의미이므로, SALESMAN의 급여 중 가장 작은 값보다 큰 모든 급여를 반환합니다.>가 아닌 IN, ANY, ALL 등 다중 행 연산자를 사용해야 합니다. 상관 서브쿼리는 메인 쿼리와 연결되어 각 행마다 반복 실행되는 특징이 있습니다.