SQL에서 WHERE 절에 조건을 걸 때 자주 발생하는 두 가지 실수를 정리해보겠습니다.
OR 사용 시의 주의사항
다음과 같은 SQL문이 있다고 해봅시다.
SELECT *
FROM member
WHERE id = 1 OR id = 2;
이 쿼리는 id가 1이거나 2인 회원만 잘 조회됩니다.
하지만 간혹 이런 실수를 하기도 합니다.
SELECT *
FROM member
WHERE id = 1 OR 2;
이렇게 작성하면 결과가 어떻게 될까요?
👉 테이블의 모든 row가 출력됩니다
그 이유는, MySQL에서는 0은 FALSE, 0 이외의 숫자는 모두 TRUE로 인식하기 때문입니다.
즉, id = 1 OR 2는 곧
- (1) id = 1
- (2) 2 → TRUE
이렇게 해석되어 결국 WHERE id = 1 OR TRUE와 같아지고, 모든 row가 조건을 만족하게 됩니다.
✅ 정리: OR을 사용할 때는 반드시 컬럼명 = 값 형태를 정확히 써야 합니다.
AND와 OR의 우선순위
SQL에서는 AND가 OR보다 우선순위가 높습니다.
이 점을 모르고 작성하면 의도치 않은 결과가 나오기 쉽습니다.
예를 들어,
SELECT *
FROM member
WHERE gender = 'F' OR age < 30 AND height >= 180;
원래 의도:
- 성별이 여자이거나
- 나이가 30세 미만이면서 키가 180 이상인 회원
하지만 실제 실행 결과는,
- 성별이 여자이거나
- (나이가 30세 미만 AND 키가 180 이상인 회원)
으로 해석됩니다.
👉 이유: AND가 OR보다 우선순위가 높기 때문입니다.
해결 방법: 괄호 사용
우선순위를 억지로 기억할 필요는 없습니다.
그 대신, 내가 원하는 조건을 먼저 실행되도록 괄호(())를 써주면 됩니다.
SELECT *
FROM member
WHERE (gender = 'F' OR age < 30) AND height >= 180;
이렇게 작성하면 의도했던 대로 성별이 여자이거나 나이가 30세 미만인 회원 중 키가 180 이상인 경우만 조회됩니다.
정리
- WHERE id = 1 OR 2 → ❌ 잘못된 문법 (항상 TRUE → 모든 row 조회됨)
- AND는 OR보다 우선순위가 높음 → 괄호로 묶어서 원하는 조건을 명확히 해주기
- 습관적으로 조건 단위로 괄호를 씌우면 실수를 방지할 수 있고, 나중에 SQL문을 읽을 때도 훨씬 직관적임
'컴퓨터 과학 > 데이터 베이스' 카테고리의 다른 글
| MySQL COALESCE 함수 사용하기 (0) | 2025.08.17 |
|---|---|
| MySQL CAST() 함수 – 데이터 타입 변환하기 (2) | 2025.08.17 |
| MySQL 날짜 관련 함수 정리 (1) | 2025.08.17 |
| SQL IN 구문 알아보기 (1) | 2025.08.17 |
| SQL LIKE 구문 이해하기 (1) | 2025.08.17 |