MySQL은 연산자 우선순위(operator precedence)를 따르며, 표현식을 평가할 때 우선순위가 높은 연산자부터 먼저 처리합니다. 아래는 MySQL의 연산자들을 우선순위 순서대로 나열한 목록으로, 같은 줄에 있는 연산자들은 서로 동일한 우선순위를 가집니다.
INTERVAL BINARY, COLLATE ! - (단항 마이너스), ~ (단항 비트 반전) ^ *, /, DIV, %, MOD -, + <<, >> & | =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN BETWEEN, CASE, WHEN, THEN, ELSE NOT &&, AND XOR ||, OR :=
목록에서 맨 위에 있는 연산자일수록 우선순위가 높고, 맨 아래에 있을수록 우선순위가 낮습니다. 예를 들어 산술 연산자(*, /, DIV, %, MOD)는 비교 연산자(=, >, < 등)보다 먼저 평가되며, 논리 연산자(AND, OR, NOT)는 대체로 가장 나중에 평가됩니다.
동일한 우선순위 연산자의 평가 순서
하나의 표현식 안에서 동일한 우선순위 수준의 연산자가 여러 개 등장하면, MySQL은 왼쪽에서 오른쪽 방향으로 차례대로 평가합니다. 따라서 같은 우선순위를 가진 연산자가 섞여 있을 때는 평가 순서도 결과에 영향을 줄 수 있습니다.
연산자 우선순위가 결과에 미치는 영향 예시
다음 예제는 연산자 우선순위가 실제 결과 집합에 어떤 영향을 주는지 보여줍니다.
mysql> SELECT 5+3/2-2; +---------+ | 5+3/2-2 | +---------+ | 4.5000 | +---------+ 1 row in set (0.00 sec)
위 계산에서 MySQL은 +(덧셈)나 -(뺄셈)보다 우선순위가 높은 /(나눗셈)을 먼저 평가합니다. 즉, 3/2 = 1.5000이 먼저 계산된 후, 5 + 1.5000 - 2 순서로 처리되어 최종 결과는 4.5000이 됩니다. 만약 덧셈과 뺄셈이 먼저 평가되었다면 (5+3)/2-2 = 2라는 전혀 다른 결과가 나왔을 것입니다.
주의 사항 및 활용 팁
이처럼 복잡한 산술식이나 WHERE 절의 조건식을 작성할 때는 연산자 우선순위를 항상 염두에 두어야 의도하지 않은 결과를 피할 수 있습니다. 특히 AND와 OR가 함께 사용되는 조건문에서는 우선순위 때문에 논리가 달라질 수 있으므로, 평가 순서를 명확히 하고 싶다면 괄호( )를 사용해 우선순위를 직접 지정하는 것이 가장 안전한 방법입니다.