반응형
💡 문제
다음 SQL문 중에서 다른 결과를 반환하는 것은 무엇일까요?
-- 1번
SELECT * FROM TBL WHERE V1 = 'A' AND V2 IN ('T1', 'T2', 'T3');
-- 2번
SELECT * FROM TBL WHERE V1 = 'A' AND V2 = 'T1' OR V2 = 'T2' OR V2 = 'T3';
-- 3번
SELECT * FROM TBL WHERE (V1, V2) IN (('A', 'T1'), ('A', 'T2'), ('A', 'T3'));
-- 4번
SELECT * FROM TBL WHERE V1 = 'A' AND (V2 = 'T1' OR V2 = 'T2' OR V2 = 'T3');
📌 핵심 개념 요약
1. SQL 논리 연산자 우선순위
- NOT > AND > OR
- 괄호가 없으면 AND가 먼저 계산됨!
2. 튜플 비교 (row value constructor)
- (컬럼1, 컬럼2) IN ((값1, 값2), ...) 형식
- 컬럼 쌍이 정확히 매칭될 때만 TRUE
📊 각 쿼리 분석
✅ 1번
SELECT * FROM TBL WHERE V1 = 'A' AND V2 IN ('T1', 'T2', 'T3');
- V1 = 'A'이면서, V2가 T1, T2, T3 중 하나일 때만 조회
- ✅ 조건이 명확함
- 정상적으로 필터링된 결과
❌ 2번 (정답)
SELECT * FROM TBL WHERE V1 = 'A' AND V2 = 'T1' OR V2 = 'T2' OR V2 = 'T3';
- 괄호 없음! 그래서 아래처럼 해석됨👇
(V1 = 'A' AND V2 = 'T1') OR V2 = 'T2' OR V2 = 'T3'
👉 이렇게 되면?
- V1='A'이고 V2='T1' → ✅
- 하지만 V2='T2' 또는 V2='T3'인 행은 V1이 무엇이든 조회됨! → ❌
- 즉 결과가 달라짐
✅ 3번
SELECT * FROM TBL WHERE (V1, V2) IN (('A', 'T1'), ('A', 'T2'), ('A', 'T3'));
- (V1, V2) 쌍이 (‘A’, ‘T1’), (‘A’, ‘T2’), (‘A’, ‘T3’) 중 하나일 때만 조회
- 1번 쿼리와 논리적으로 완전 동일한 결과
- 튜플 비교 방식의 간결한 표현
✅ 4번
SELECT * FROM TBL WHERE V1 = 'A' AND (V2 = 'T1' OR V2 = 'T2' OR V2 = 'T3');
- 괄호로 OR 조건을 묶었기 때문에
V1 = 'A' AND V2 IN ('T1', 'T2', 'T3')
와 동일한 의미입니다.
SQL에서는 AND가 OR보다 우선순위가 높기 때문에, 괄호가 없으면 해석이 달라질 수 있습니다.
위의 2번 쿼리는 V1='A' 조건이 일부 OR 조건에만 적용되므로 불필요한 레코드까지 조회됩니다.
정확한 조건식 표현을 위해 괄호로 논리 구조를 명확히 하는 것이 중요합니다!
🧠 꿀팁 암기
🎯 논리 연산자 우선순위: NOT > AND > OR
🎯 괄호 없이 쓰면 예기치 않은 결과 가능성 있음
🎯 튜플 비교는 깔끔하고 안전한 대안!
반응형
'자격증 > SQLD' 카테고리의 다른 글
[SQLD/자격증] 본질식별자와 인조식별자란? (0) | 2025.05.25 |
---|---|
SQL NOT EXISTS 문법의 핵심 이해! - NULL이 포함된 조건 비교 주의점 (0) | 2025.05.24 |
도메인(Domain) 이란? (0) | 2025.05.24 |
ROW_NUMBER() 함수 완벽 정복 (1) | 2025.05.19 |
단일행 함수 vs 다중행 함수 쉽게 이해하기 (0) | 2025.05.17 |