본문 바로가기
DB & SQL

SQL에서의 WHERE 1=1

by 무사뎀벨레 2022. 12. 13.

 

 

 

 

 

 

 

 

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이라는 구문수정, 삭제 쿼리에서는 사용하지 않는 것이 잠재적인 오류를 없애는 방법으로 보입니다.

반응형

댓글