MySQL에서 AND와 OR의 우선순위
MySQL SELECT 쿼리에서는 OR 연산자보다 AND 연산자가 더 높은 우선순위를 가집니다. 즉, 조건식에 AND와 OR가 함께 사용되면 MySQL은 항상 AND 조건부터 먼저 평가합니다.
간단한 예제를 통해 MySQL이 AND 연산자에 어떻게 높은 우선순위를 부여하는지 확인해 보겠습니다.
예제 쿼리
mysql> select 0 AND 0 OR 1 as Result;
실행 결과는 다음과 같습니다.
+--------+
| Result |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
만약 OR의 우선순위가 더 높다면?
반대로 OR 연산자가 더 높은 우선순위를 가진다고 가정해 보면, 위 쿼리는 다음과 같이 해석될 것입니다.
select 0 AND (0 OR 1) as Result;
이 경우 계산 순서는 다음과 같습니다.
- 먼저 괄호 안의
0 OR 1을 계산하면 결과는 1 - 그다음
0 AND 1을 계산하면 결과는 0
하지만 실제 출력 결과는 1이므로, 이 가정은 성립하지 않습니다. 따라서 위 쿼리에서는 AND가 OR보다 먼저 평가되어 최종적으로 1이라는 결과가 나온 것입니다.
실제 평가 순서
MySQL의 실제 동작 방식대로 계산 과정을 살펴보면 다음과 같습니다.
select 0 AND 0 OR 1 as Result;
- 먼저 AND 연산자를 계산합니다.
0 AND 0의 결과는 0입니다. - 그다음 OR 연산자를 계산합니다.
0 OR 1의 결과는 1입니다.
이렇게 하면 실제 출력 결과인 1과 정확히 일치함을 확인할 수 있습니다.
실무 팁: 괄호로 의도를 명확하게
연산자 우선순위에 의존한 조건식은 코드를 읽기 어렵고 실수를 유발하기 쉽습니다. WHERE 절에서 여러 조건을 조합할 때는 괄호 ()를 사용해 평가 순서를 명시적으로 지정하는 것이 좋습니다.
-- 모호한 표현
SELECT * FROM users WHERE a = 1 AND b = 2 OR c = 3;
-- 명확한 표현
SELECT * FROM users WHERE (a = 1 AND b = 2) OR c = 3;
괄호를 활용하면 쿼리의 의도가 명확해지고, 우선순위 규칙을 잘못 이해해 발생하는 논리 오류를 예방할 수 있습니다.