일반적인 SQL 연산 우선 순위
(RDBMS에 따라 약간의 차이는 있을 수 있음)
1. 괄호
2. 산술연산 (단항 부호 > 곱셈,나눗셈,나머지구하 > 덧셈,뺄셈)
3. 비교연산 (>=, between, In, Like, ISNULL)
4. 논리연산 (NOT > AND > OR)
1. 괄호
SELECT 2 + 3 * 4; -- 결과: 14 (괄호가 없어서 곱셈 먼저)
SELECT (2 + 3) * 4; -- 결과: 20 (괄호가 있는 덧셈 먼저)
2. 산술 연산
우선 순위 | 연산자 | 설명 | 예시 |
1 | -, + (단항) | 단일 값의 부호 | -a, +a |
2 | *, /, % | 곱셈, 나눗셈, 나머지 | a * b, b / c, a % b |
3 | +, - (이항) | 덧셈, 뺄셈 | a + b, a - c |
3. 비교 연산
우선 순위 | 연산자 | 설명 | 예시 |
- | =, !=, <>, <, >, <=, >= | 기본 부등호 | price >= 10000 |
- | BETWEEN ... AND ... | 범위 포함 여부 | price BETWEEN 5000 AND 10000 |
- | IN (...) | 목록 포함 여부 | category IN ('Book', 'Toy') |
- | LIKE, NOT LIKE | 문자열 패턴 비교 | name LIKE 'A%' |
- | IS NULL, IS NOT NULL | NULL 여부 판단 | discount IS NULL |
SQL에서 비교 연산자를 연달아 연속 사용하는 경우는 없다. ex. price > 100 < 200 (❌)
=> 대부분 문법 오류 or 의도와 다른 잘못된 결과
대부분 문법 오류이지만, 일부 DBMS에서는 허용하기도 한다. 예를 들어 MySQL에서는 아래 쿼리가 오류없이 실행된다.
SELECT 5 > 3 < 10; -- 결과: TRUE (MySQL)
이유는 아래와 같은 과정으로 계산이 되기 때문이다.
[step 1] 5 > 3 → TRUE : MySQL 에서는 TRUE 를 1로 취급
[step 2] 1 < 10 → TRUE
그러므로 만약 여러 조건을 의도적으로 비교하려면? AND, OR, BETWEEN 등 사용하여 명확히 표현하는 것이 좋다.
4. 논리 연산
우선 순위 | 연산자 | 설명 | 예시 |
1 | NOT | 조건의 반대값: 부정 (1 → 0, 0 → 1) | NOT is_active |
2 | AND | 둘 다 참일 때만 참 | age > 20 AND gender = 'F' |
3 | OR | 둘 중 하나만 참이어도 참 | price < 100 OR calorie < 50 |
[예시] NOT 우선 순위
-- 상태가 'sold'가 아니고, 가격이 5000 이상인 상품
-- NOT가 먼저 실행됨
SELECT * FROM products
WHERE NOT status = 'sold' AND price >= 5000;
-- 해석: (NOT (status = 'sold')) AND (price >= 5000)
[예시] AND vs. OR 우선 순위
-- 조건: 1) 가격이 10000원 이상이고 2) 할인 상품이거나 3) 배송비가 무료인 경우
-- AS-IS
-- 괄호 없으면: AND 먼저 실행됨
SELECT * FROM products
WHERE price >= 10000 AND is_discounted = 1 OR shipping_fee = 0;
-- 해석: (price >= 10000 AND is_discounted = 1) OR (shipping_fee = 0)
-- TO-BE
-- 명확하게 괄호 사용
SELECT * FROM products
WHERE price >= 10000 AND (is_discounted = 1 OR shipping_fee = 0);
요약
더보기
✔️ 일반 연산 우선 순위: 산술 → 비교 → 논리
✔️ 복잡한 경우, 괄호 ( ) 를 사용하여 항상 명확하게 순서를 통제하는 게 안전하고 가독성도 좋음.
'데이터 처리 도구 > SQL' 카테고리의 다른 글
[MySQL] 집합 연산(2): INTERSECT, EXCEPT (0) | 2024.08.06 |
---|---|
[MySQL] WITH절 사용하여 CTE 생성하기 (0) | 2024.07.28 |
[MySQL] 정규표현식 함수 (Regular Expressions) (0) | 2024.07.11 |
정규 표현식(Regular Expression) (0) | 2024.03.20 |
[MySQL] 집합 연산(1): UNION, UNION ALL 사용하여 조회 결과 결합하기 (0) | 2022.09.07 |