반응형

💡 문제

다음 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'이면서, V2T1, 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
🎯 괄호 없이 쓰면 예기치 않은 결과 가능성 있음
🎯 튜플 비교는 깔끔하고 안전한 대안!

반응형

+ Recent posts