WHERE 1=1 이란?
WHERE 1=1은 항상 참을 의미합니다.
즉, 의미 없는 조건입니다. 2=2, 3=3도 동일한 기능을 수행합니다.
WHERE 1=1을 사용하는 이유
주석처리가 편하며, WHERE 문을 유동적으로 작성해야 할 때 편리합니다.
먼저 WHERE 1=1로 조건을 걸고 그 이후 AND 조건을 사용하여 다음 조건을 작성한다면, WHERE 문을 신경 쓰지 않고 AND 조건문을 편리하게 작성할 수 있습니다.
아래와 같이 조건이 2개인 질의문이 있습니다.
AND절의 goal이 40이 맞는지 우선적으로 확인하고 싶다면, WHERE 조건 playerName = 'kane'을 주석 처리해야 합니다.
SELECT
playerName
, playerNum
, goal
, assist
FROM
player
WHERE
playerName = 'kane'
AND goal = 40
아래와 같이, AND절의 goal이 40이 맞는지 확인하기 위해서는 playerName = 'kane' 부분을 주석처리하여야 합니다.
하지만, 아래와 같은 쿼리는 WHERE 조건 바로 뒤에 AND 가 붙어 오류가 발생합니다.
SELECT
playerName
, playerNum
, goal
, assist
FROM
player
WHERE
-- playerName = 'kane'
AND goal = 40
정상적으로 쿼리를 실행하려면, playerName = 'kane' 부분과 AND까지 모두 주석처리하여 조회 해야 합니다.
SELECT
playerName
, playerNum
, goal
, assist
FROM
player
WHERE
-- playerName = 'kane'
-- AND
goal = 40
위 예시들과 같이 여러 번 주석처리를 해야 하는 번거로움이 있습니다.
이럴 경우 아래와 같이 WHERE 1=1을 사용해준다면, 필요 없는 부분만 주석처리하여 쿼리를 실행할 수 있습니다.
SELECT
playerName
, playerNum
, goal
, assist
FROM
player
WHERE 1 = 1
-- AND playerName = 'kane'
AND goal = 40
WHERE 1=1 사용 시 주의사항
쿼리의 조건을 동적으로 변경하여 쿼리 실행을 더 효율적으로 할 수 있지만, 반대로 주의해야 할 요소도 있습니다.
SELECT문 이외에 데이터를 수정 및 삭제하는 쿼리에는 사용을 지양하는 것이 좋습니다.
UPDATE, DELETE문에 WHERE 1=1을 사용했을 경우, WHERE 1=1 이외의 조건이 없기 때문에 데이터가 변경 또는 삭제될 우려가 있기 때문입니다.
아래와 같은 조회 쿼리는 괜찮지만,
SELECT
playerName
, playerNum
, goal
, assist
FROM
player
WHERE 1 = 1
<if test="playerName != null">
AND playerName = #{playerName}
</if>
수정, 삭제와 같은 쿼리에서는 사용을 자제할 필요가 있습니다.
아래 쿼리는 playerNum의 값에 따라 WHERE 조건이 달라지는 쿼리입니다.
UPDATE
player
SET
goal = 50
WHERE 1 = 1
<if test="playerNum != null">
AND playerNum = #{playerNum}
</if>
만약 playerNum의 값이 없다면, 아래와 같은 형태로 쿼리가 실행하게 됩니다.
UPDATE
player
SET
goal = 50
WHERE 1 = 1
위와 같은 형태로 쿼리가 실행된다면, 해당 테이블의 정보가 모두 변경되는 문제가 발생합니다.
null 체크는 기본이지만, 실수는 언제 어디서 나올지 모르기 때문에 WHERE 1=1이라는 구문을 수정, 삭제 쿼리에서는 사용하지 않는 것이 잠재적인 오류를 없애는 방법으로 보입니다.
'DB & SQL' 카테고리의 다른 글
[MSSQL] IN과 NOT IN 사용하기 (2) | 2023.04.11 |
---|---|
[MSSQL] Table과 Column의 Description 추가, 수정하기 (2) | 2022.12.16 |
[MSSQL] WITH(NOLOCK) - 테이블 잠금 해제 (2) | 2022.09.07 |
날짜, 시간 연산(DATEADD) (2) | 2022.06.02 |
varchar와 nvarchar의 차이 (6) | 2022.04.29 |
댓글