서브쿼리는 하나의 SQL문 안에 중첩된 또 다른 SQL문입니다. 특히 SELECT
절에서 서브쿼리를 사용하여 각 컬럼에 독립적인 값을 할당하는 방식은 SQLD 시험에 자주 출제되는 핵심 개념입니다.
유형 | 설명 | 사용 연산자 |
---|---|---|
스칼라 서브쿼리 | SELECT 절에서 단 하나의 값을 반환. | 단일 값 |
단일 행 서브쿼리 | WHERE , HAVING 절에서 단 하나의 행을 반환. | = , > , < |
다중 행 서브쿼리 | WHERE , HAVING 절에서 여러 행을 반환. | IN , ANY , ALL |
다중 열 서브쿼리 | WHERE 절에서 여러 컬럼을 반환. | (col1, col2) 형태 |
SELECT
절에 적용되는 서브쿼리 (스칼라 서브쿼리)핵심: SELECT
절에 사용되는 서브쿼리는 각 컬럼에 독립적으로 값을 반환합니다.
특징:
NULL
을 반환하고, 여러 행이면 오류가 발생합니다.예시:
SELECT
e.name,
(SELECT dept_name FROM Department d WHERE d.dept_id = e.dept_id) as dept_name,
(SELECT MAX(salary) FROM Employee) as max_salary
FROM Employee e;
dept_name
컬럼은 각 행의 dept_id
에 따라 다른 부서명을 반환합니다. (상관 서브쿼리)max_salary
컬럼은 모든 행에 동일한 최대 급여 값을 반환합니다. (일반 서브쿼리)SELECT
절 서브쿼리 = 스칼라 서브쿼리: SELECT
절의 서브쿼리는 항상 **하나의 값(스칼라)**을 반환해야 한다는 점을 기억하세요.단일 행 서브쿼리
가 여러 행을 반환하거나, 스칼라 서브쿼리
가 여러 행을 반환하면 오류가 발생합니다.IN
, ANY
, ALL
은 다중 행 서브쿼리와 함께 사용된다는 것을 명심해야 합니다.SELECT
절: "각 컬럼마다 하나씩, 스칼라처럼!"WHERE
=
: "비교 대상이 하나만 있을 때!"WHERE IN
: "비교 대상이 여러 개 있을 때!"1. 다음 쿼리의 실행 결과는?
SELECT
(SELECT COUNT(*) FROM Students WHERE grade = 1),
(SELECT COUNT(*) FROM Students WHERE grade = 2)
FROM DUAL;
A. 1학년 학생 수와 2학년 학생 수가 각각 다른 컬럼에 출력된다.
B. 1학년 학생 수만 출력된다.
C. 2학년 학생 수만 출력된다.
D. 에러가 발생한다.
2. 다음 중 서브쿼리 결과가 여러 행일 때 WHERE
절에서 사용할 수 있는 연산자는?
A. =
B. >
C. ANY
D. <>
3. 스칼라 서브쿼리에 대한 설명으로 가장 옳지 않은 것은?
A. 반드시 하나의 컬럼과 하나의 행을 반환해야 한다.
B. SELECT
절에서 각 행마다 독립적으로 값을 반환한다.
C. 서브쿼리 결과가 없을 경우 NULL
이 반환된다.
D. WHERE
절에서만 사용할 수 있다.
SELECT
절의 서브쿼리는 스칼라 서브쿼리로, 각각의 서브쿼리가 독립적인 값을 반환하여 별도의 컬럼에 출력됩니다.=
나 >
같은 단일 행 연산자는 서브쿼리 결과가 여러 행일 때 오류를 발생시킵니다. ANY
, ALL
, IN
은 다중 행 서브쿼리와 함께 사용됩니다.SELECT
절에서 사용되며, WHERE
, GROUP BY
, ORDER BY
등 다양한 절에서 활용될 수 있습니다. WHERE
절에서만 사용된다는 설명은 틀렸습니다.