안녕하세요, 오늘은 MYSQL 질의문에서 WHERE 1=1을 사용하는 이유에 대해서 알아보도록 하겠습니다. 다른 개발자가 개발한 프로젝트를 유지 보수하거나, 처음 개발자로 입문하여 선임들이 작성한 쿼리문을 보면 WHERE 1=1 조건문을 볼 수 있는데요, 어떤 이유로 사용하는지 한번 알아봅시다.
말그대로 WHERE 1=1은 조건문에서 항상 참을 의미합니다. 즉 특별히 의미가 있는 조건은 아닙니다.
WHERE 1 = 1
WHERE 2 = 2
WHERE 3 = 3
모두 같은 의미입니다.
쿼리의 조건을 동적으로 변경한다거나, SQL 작성 시 조건을 주석 처리하며 질의문을 변경할 수 있기 때문에 사용합니다. 예제를 통해 알아봅시다.
SELECT
userid
, phone
, address
FROM user
WHERE address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'
위와 같이 조건이 2개인 질의문이 있을 때 AND절의 phone번호가 010-1234-5678이 맞는지 우선적으로 확인하고 싶다면 WHERE 조건 address = 'ssd0908.tistory.com'을 주석 처리해야 하는데요,
SELECT
userid
, phone
, address
FROM user
-- WHERE address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'
위와 같이 WHERE 절을 주석 처리하고 쿼리를 실행한다면 오류가 발생하겠죠?
SELECT
userid
, phone
, address
FROM user
-- WHERE address = 'ssd0908.tistory.com'
WHERE phone = '010-1234-5678' -- AND 를 WHERE로 변경
아니면 AND를 WHERE로 잠시 변경했다가 조건을 맞을 경우 다시 AND로 변경해야 하는 귀찮음이 발생하죠.
SELECT
userid
, phone
, address
FROM user
WHERE 1=1
AND address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'
자, 위와 같이 WHERE 1=1을 선언했을 경우 주석을 좀 더 쉽게 처리하면서 디버깅을 수월하게 할 수 있죠. 즉, 동적으로 SQL툴에서 쿼리를 작성할 때 유용한 방법이죠.
그렇다면, MYBATIS에서는 의미 없는 조건인 WHERE 1=1을 어떻게 처리할까요??
SELECT
*
FROM user
<where>
<if test="phone != null and phone != ''">
AND phone = '010-1234-5678'
</if>
<if test="address != null and address != ''">
AND address = 'ssd0908.tistory.com'
</if>
</where>
MYBATIS에 <where> 태그를 이용하여 처리할 수 있는데요, 위와 같이 질의 조건에 따라 동적쿼리의 생성여부가 결정되는데 조건태그(<if>)를 <where> 태그로 감싸서 생성을 한다면 MYBATIS에서 자동으로 질의조건에 따라 WHERE를 생성하거나 생략합니다. 즉, WHERE 1=1과 같은 처리를 하죠.
쿼리의 조건을 동적으로 변경하여 질의를 좀 더 효율적으로 할 수 있지만, 반대로 지양해야 할 요소도 분명히 존재합니다. SELECT문 이외에 데이터를 수정 및 삭제하는 쿼리에는 사용을 지양하는 것이 좋습니다. UPDATE, DELETE문에 WHERE 1=1을 사용했을 경우 조건이 없기 때문에 데이터가 변경 또는 삭제될 우려가 있기 때문입니다.
[MYSQL] 음수, 양수 반환 및 절대값(ABS) 변환하는 방법 (0) | 2022.05.14 |
---|---|
[MYSQL] 특정문자열 검색 LIKE 연산자 파헤치기 (0) | 2022.05.09 |
[MYSQL] MYSQL에서 NVL을 대체하는 함수 IFNULL (0) | 2022.05.03 |
[MYSQL] LIMIT OFFSET사용법 총정리 (0) | 2022.04.13 |
[MYSQL] 문자열 자르기 (SUBSTRING, LEFT, RIGHT함수) (0) | 2022.04.12 |