SQL 쿼리는 여러 연산자들로 구성될 때, 정해진 우선순위에 따라 실행됩니다. SQLD 시험에서는 이 우선순위를 정확히 이해하여 복잡한 WHERE
절의 결과를 예측하는 문제가 자주 출제됩니다.
( )
*
, /
> +
, -
=
, >
, <
등IS NULL
, IS NOT NULL
, LIKE
, IN
, BETWEEN
NOT
AND
OR
UNION
, UNION ALL
, INTERSECT
, MINUS
( )
→ *
, /
→ +
, -
10 + 20 * 3
은 20 * 3
이 먼저 계산되어 70
이 됩니다. (10 + 20) * 3
은 30 * 3
이 되어 90
이 됩니다.IN
vs =
: IN
은 다중 비교, =
는 단일 비교입니다. WHERE sal = (SELECT ...)
에서 서브쿼리 결과가 여러 개이면 오류가 발생합니다.NULL
비교 (★★★★★): NULL
은 '값이 없다'는 특수한 상태이므로, **IS NULL
또는 IS NOT NULL
**로만 비교해야 합니다. WHERE column = NULL
은 항상 UNKNOWN
을 반환하여 원하는 결과를 얻을 수 없습니다.NOT
> AND
> OR
A AND B OR C
는 (A AND B) OR C
와 동일한 순서로 실행됩니다. AND
가 OR
보다 우선순위가 높기 때문입니다.UNION
, UNION ALL
, INTERSECT
, MINUS
는 동일한 우선순위를 가집니다.UNION
vs UNION ALL
: UNION
은 중복을 제거하지만, UNION ALL
은 중복을 그대로 유지합니다.WHERE
절: WHERE
절에 여러 연산자가 있을 때, 연산자 우선순위를 명확히 파악하는 것이 중요합니다.( )
**를 사용해야 합니다.NOT IN
의 NULL
함정 (★★★★★): WHERE column NOT IN (1, 2, NULL)
과 같이 NOT IN
서브쿼리나 리스트에 NULL
이 포함되어 있으면, 전체 조건이 UNKNOWN
이 되어 아무런 행도 반환되지 않습니다.산
비
논
집
순서 (산술
→ 비교
→ 논리
→ 집합
)논리
: NOT
AND
OR
순으로 실행.비교
: IN
, LIKE
, **IS NULL
**은 일반 비교보다 후순위.1. 다음 쿼리의 실행 순서와 결과에 대한 설명으로 옳은 것은?
SELECT *
FROM Employees
WHERE salary > 3000 AND dept_id = 10 OR job_id = 'IT_PROG';
A. (salary > 3000) AND (dept_id = 10 OR job_id = 'IT_PROG')
B. (salary > 3000 AND dept_id = 10) OR (job_id = 'IT_PROG')
C. (salary > 3000 OR job_id = 'IT_PROG') AND (dept_id = 10)
2. 다음 중 NULL
이 포함된 Employees
테이블에서 phone
번호가 없는 직원을 찾기 위한 쿼리로 올바른 것은?
A. SELECT * FROM Employees WHERE phone = NULL;
B. SELECT * FROM Employees WHERE phone IS NULL;
C. SELECT * FROM Employees WHERE phone <> NULL;
D. SELECT * FROM Employees WHERE phone IS NOT NULL;
3. 다음 쿼리 실행 결과로 반환되는 행의 개수는?
(단, dept_id
는 10, 20, 30이고 30
번 부서에는 NULL
인 직원이 1명 있다.)
SELECT * FROM Employees WHERE dept_id NOT IN (10, NULL);
A. 0개
B. 1개
C. 2개
D. 3개
AND
가 OR
보다 우선순위가 높으므로 AND
조건이 먼저 실행됩니다.NULL
값과의 비교는 IS NULL
또는 IS NOT NULL
연산자만 사용해야 합니다. =
나 <>
와 같은 일반 비교 연산자는 NULL
에 대해 UNKNOWN
을 반환합니다.NOT IN
리스트에 NULL
이 포함되어 있으므로, 전체 조건이 UNKNOWN
이 되어 어떤 행도 반환되지 않습니다.