SQLD를 공부하면서 WHERE 1=1 조건식을 계속 마주했다. 처음에는 오타인 줄 알았는데(ㅋㅋ) 자주 나오길래 분명히 무슨 이유가 있을 것으로 생각했다.
1=1 ??
해당 식은 참이다. 즉, 1=1이란 조건은 사실 상 의미가 없는 조건이다.
SELECT *
FROM STUDENTS
WHERE S_ID = '1911'
AND S_NM LIKE 'gj%'
위와 같은 쿼리에서 S_ID = '1911' 조건행을 주석처리하고 싶으면 아래와 같이 작성해야된다. 주석을 하고 싶은 부분에 -- 표시와 S_NM LIKE 'gj%' 조건식의 줄바꿈을 해야하기에 조금 번거롭다..
SELECT *
FROM STUDENTS
WHERE --S_ID = '1911'
--AND
S_NM LIKE 'gj%'
하지만 WHERE 1=1을 사용하면 아래와 같이 비교적 편리하고 깔끔하게 정리가 된다.
SELECT *
FROM STUDENTS
WHERE 1=1
--AND S_ID = '1911'
AND S_NM LIKE 'gj%'
유동적으로 작성한다는 의미는 특정 상황에 따라 WHERE절을 다르게 작성해야 하는 것을 의미하며 AND 조건을 추가 혹은 변경하는 방식을 의미한다.
예를 들어 STUDENTS 테이블에서 다수의 학생 ID를 OR로 활용해서
조회하는 query문 python으로 작성해보면 (물론 IN으로 하는 것이 효율적이다!!) 아래와 같다.
query = """ SELECT * FROM STUDENTS """
for i, s_id in enumerate(s_id_ls):
if "WHERE" not in query:
query += "WHERE "
if i == 0:
query += "`S_ID` = '{}' ".format(s_id)
else:
query += "OR `S_ID` = '{}' ".format(s_id)
하지만 WHERE 1=1을 사용한다면 아래와 같이 코드가 간단해지고 직관적이게 된다.
query = """ SELECT * FROM STUDENTS """
for i, s_id in enumerate(s_id_ls):
if "WHERE" not in query:
query += "WHERE 1=1 "
query += "OR `S_ID` = '{}' ".format(s_id)
SELECT를 사용할 때는 효율적이지만 UPDATE와 DELETE를 하는 경우에는 사용을 지양하는 편이 좋다고 한다.
수정과 삭제를 할 때 WHERE 1=1을 사용하면 부가적인 조건이 없을 경우 모든 데이터의 변경 또는 소실될 수 있기 때문이다.
아래의 두 SQL은 STUDENTS 테이블에 존재하는 전체 데이터를 삭제하는 것을 의미한다.
DELETE FROM STUDENTS
WHERE 1=1
DELETE FROM STUDENTS