1. WHERE 1=1 참(true)을 의미
말그대로 WHERE 1=1은 조건문에서 항상 참을 의미합니다. 즉 특별히 의미가 있는 조건은 아닙니다.
WHERE 1 = 1
WHERE 2 = 2
WHERE 3 = 3
모두 같은 의미입니다.
2. 사용하는 이유
쿼리의 조건을 동적으로 변경한다거나, 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과 같은 처리를 하죠.
3. WHERE 1=1 주의사항
쿼리의 조건을 동적으로 변경하여 질의를 좀 더 효율적으로 할 수 있지만, 반대로 지양해야 할 요소도 분명히 존재합니다. SELECT문 이외에 데이터를 수정 및 삭제하는 쿼리에는 사용을 지양하는 것이 좋습니다. UPDATE, DELETE문에 WHERE 1=1을 사용했을 경우 조건이 없기 때문에 데이터가 변경 또는 삭제될 우려가 있기 때문입니다.
'STUDY > DB SQL' 카테고리의 다른 글
[SQL] ORDER BY 1 은 무엇일까? (0) | 2023.02.17 |
---|---|
[MyBatis] xml 파일 ROWNUM 에러 (꺽쇠) (0) | 2023.02.06 |
[SQL] SQL 논리 연산자와 연산자 우선순위 (0) | 2023.02.01 |
[SQL] 오라클 ROWNUM + ROW_NUMBER() (0) | 2023.01.31 |
[MyBatis] 마이바티스 세미콜론 ; 오류 (0) | 2023.01.30 |