Web Frontend/Database

[SQL] NOT, AND, OR 우선순위

코라채 2025. 3. 5. 16:24
728x90
반응형

SQL을 학습할 때 우선순위를 알고 있어야 SQL의 실행 흐름을 정확하게 파악할 수 있습니다.

1. NOT > 2. AND > 3. OR

다음 sql 문장 중 실행 결과가 다른 하나는?

1. SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR DEPTNO = 20 AND JOB = 'CLERK';
2. SELECT COUNT(*) FROM EMP WHERE (DEPTNO = 10 OR DEPTNO = 20) AND JOB = 'CLERK';
3. SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR (DEPTNO = 20 AND JOB = 'CLERK');
4. SELECT COUNT(*) FROM EMP WHERE (DEPTNO = 10 OR DEPTNO = 20 AND JOB = 'CLERK');

출처 : 홍쌤의 데이터랩 (https://hdatalab.co.kr/)

✅ 예제문제로 OR과 AND의 우선순위 기억하기

  1. AND 연산자가 OR보다 먼저 실행됨 ( 우선순위 나오~( N, A, O )라고 기억하기 )
    • DEPTNO = 20 AND JOB = 'CLERK'
    • 위 조건이 먼저 실행된 후, OR 조건이 평가됨
  2. 괄호 ( )를 사용하면 우선순위를 변경할 수 있음
    • (DEPTNO = 10 OR DEPTNO = 20) AND JOB = 'CLERK'
    • 먼저 OR 조건을 평가한 후, AND 조건을 적용

각 SQL 문의 실행 순서 분석

1️⃣ SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR DEPTNO = 20 AND JOB = 'CLERK';

  • 우선순위 적용
    AND가 OR보다 먼저 실행되므로, 아래와 같이 해석됨
    SELECT COUNT(*) FROM EMP 
    WHERE DEPTNO = 10 OR (DEPTNO = 20 AND JOB = 'CLERK');
    
  • 즉, 결과는
    • DEPTNO = 10 인 모든 직원
    • 또는 DEPTNO = 20 AND JOB = 'CLERK'인 직원만 포함됨

2️⃣ SELECT COUNT(*) FROM EMP WHERE (DEPTNO = 10 OR DEPTNO = 20) AND JOB = 'CLERK';

  • 우선순위 적용
    괄호 ( )가 있으므로 OR 먼저 실행됨
    SELECT COUNT(*) FROM EMP 
    WHERE JOB = 'CLERK' AND (DEPTNO = 10 OR DEPTNO = 20);
    
  • 즉, 결과는
    • DEPTNO가 10 또는 20인 직원 중에서
    • JOB = 'CLERK'인 직원만 포함됨

3️⃣ SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR (DEPTNO = 20 AND JOB = 'CLERK');

  • 우선순위 적용
    괄호 ( )가 있으므로 AND 먼저 실행됨
    SELECT COUNT(*) FROM EMP 
    WHERE DEPTNO = 10 OR (DEPTNO = 20 AND JOB = 'CLERK');
    
  • 1번과 동일한 의미의 SQL 문
    • DEPTNO = 10인 모든 직원
    • 또는 DEPTNO = 20 AND JOB = 'CLERK'인 직원 포함

4️⃣ SELECT COUNT(*) FROM EMP WHERE (DEPTNO = 10 OR DEPTNO = 20 AND JOB = 'CLERK');

  • 우선순위 적용
    괄호가 있긴 하지만 AND가 여전히 OR보다 우선 적용됨
    SELECT COUNT(*) FROM EMP 
    WHERE (DEPTNO = 10 OR (DEPTNO = 20 AND JOB = 'CLERK'));
    
  • 1번과 동일한 의미의 SQL 문
    • DEPTNO = 10인 모든 직원
    • 또는 DEPTNO = 20 AND JOB = 'CLERK'인 직원 포함

정답은?

정답은 2번!

  • 2번만 JOB = 'CLERK' 조건을 DEPTNO = 10 OR DEPTNO = 20에 적용함
  • 나머지는 DEPTNO = 10인 경우에는 JOB 조건을 확인하지 않음

💡 NOT, AND, OR 우선순위 정리

SQL을 사용하다 보면 여러 개의 조건을 결합해서 데이터를 조회하는 경우가 많습니다. AND와 OR을 함께 사용할 때, 연산자의 우선순위를 제대로 알고있지 않다면 예상과 다른 결과가 나올 수 있습니다.

1. SQL에서 AND와 OR의 우선순위

  1. NOT이 제일 먼저 그 다음이 AND, 마지막이 OR( 1. NOT 2. AND 3. OR )
    • NOT 연산이 항상 AND, OR보다 우선 적용됨
    • AND 연산이 항상 OR보다 우선 적용됨
  2. 괄호 ( )를 사용하면 우선순위를 변경할 수 있음

3. 괄호로 우선순위 조절하기

SQL에서 AND가 OR보다 우선 실행되므로, 원하는 결과를 얻기 위해 괄호 ( )를 사용해야 함

-- "부서가 10이거나 20인 사람 중에서 CLERK만 찾기"
SELECT * FROM EMP
WHERE (DEPTNO = 10 OR DEPTNO = 20) AND JOB = 'CLERK';

 

만약 괄호가 없으면?

-- "부서가 10인 사람 + (부서가 20이고 CLERK인 사람)"
SELECT * FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 20 AND JOB = 'CLERK';

 

마무리

✅ SQL에서 AND는 OR보다 우선순위가 높음
✅ 원하는 실행 순서를 만들려면 괄호 ( )를 사용해야 함
✅ 복잡한 WHERE 조건을 사용할 때 우선순위를 명확히 이해하면 오류를 방지할 수 있음

 

 

728x90
반응형