WHERE절 1=1, 1=2의 의미

WHERE절 1=1, 1=2의 의미


ibatis를 이용한 동적쿼리를 보면 where절에 1=1, 1=2라는 조건이 자주 보인다.

그전에도 가끔 본 조건이지만 쿼리를 제대로 분석해보고자 마음 먹었기에 1=1과 1=2라는 조건을 자세히 살펴보고자 한다.



WHERE 1=1

SELECT *

FROM tb_test

WHERE 1=1

   <isEqual prepand='AND' property='first' compareValue='1'>

   first_col = '1'

   </isEqual>

   <isEqual prepand='AND' property='second' compareVale='2'>

   second_col = '2'

   </isEqual>

ibatis의 을 이용해 파라미터가 특정값이면 조건을 추가시키는 동적쿼리이다. 파라미터의 값이 특정값과 일치하면 where조건이 추가되고 조건이 모두 맞지않으면 전체를 조회하는 쿼리문이다.



만약 여기서 1=1이 없다면?

  SELECT *

  FROM tb_test

  WHERE

이런 쿼리문이 작성될 것이고, ORA-00936이라는 missing expression 에러가 나게될 것이다.

이렇듯 ibatis를 이용해 WHERE절에 조건을 추가할 때 1=1은 유용할 수 있다.



WHERE 1=2

이번에 WHERE절에 1=2가 어떻게 쓰이는지 살표보자

SELECT *

FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

        1=2
        </isEqual>

        <isEqual prepand='AND' property='second compareValue='2'>
        second_col = '2'
        </isEqual>

이 동적쿼리문은 first값이 1로 들어오면

(생략)

WHERE 1=1 AND 1=2

이런 조건으로 쿼리문이 실행되면서 false이므로 아무것도 조회하지 못하게 됩니다.

1=2를 이용하면 특정 값을 전달 받을 때, 아무 결과도 가져오지 못하게 할 수 있습니다.



무조건 좋기만 할까?

하지만 이런 1=1을 남발하는 것은 특히 UPDATE, INSERT, DELETE와 같은 데이터의

입출력을 가능케하는 문장에서는 위험할 수 있다.

DELETE FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

	first_col = '1'

        </isEqual>

이 동적쿼리에 first값이 1로 넘어온다면,

DELETE FROM tb_tes

WHERE 1=1

테이블의 모든 데이터가 삭제될 것이다.

그렇기에 1=1, 1=2를 INSERT, DELETE, UPDATE 등에 쓸 때는 한 번 더 생각해보는 것이 중요한 것 같다.

하지만 ibatis말고 mybatis를 쓴다면 <WHERE> 라는 태그를 이용해 동적쿼리가
반환하는 조건이 있다면 첫 번쨰 리턴된 조건의 AND나 OR를 자동으로 trim하여 쿼리문을 동작하게 할 수 있다.


참고 : http://jdm.kr/blog/7

'SQL' 카테고리의 다른 글

JOIN에서 ON절과 WHERE절의 차이  (0) 2017.08.16

JOIN에서 ON절과 WHERE절의 차이

 

같은 조건이라도 JOIN할 때 ON절에 조건을 넣을 때와 WHERE절에 조건을 넣을 때

쿼리 결과는 다르다. 어떻게 다른지 두 테이블을 살펴보자.

 

1) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

    WHERE b.location = 'korea';

 

2) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

       AND b.location = 'korea';

 

1)의 경우에는 employee테이블과 department 테이블이 outer join을 한 후

location이 korea인 값들만 추출한다.

 

2)의 경우에는 department 테이블에서 location이 korea인 값만 employee 테이블과 조인한다.

 

따라서 결과는

1)에는 location이 korea인 값만 존재하지만

2)에서는 location이 korea가 아닌 값도 존재하게된다.

 

 

employee 테이블                                  

employee_id 

 department_no

 1000

 10

 1001

 10

 1002

 20

 

 

department 테이블

 department_no

location 

 10

 korea

 20

 usa

 

 

1)    1000, 10, korea

       1001, 10, korea

 

2)    1000, 10, korea

       1001, 10, korea

       1002, 20, null

 

 

 

2)의 쿼리를 풀어서 다른 방식으로 써보면

 

3) SELECT *

    FROM employee a

    LEFT OUTER JOIN ( SELECT *

                              FROM department

                              where location = 'korea' ) b

    ON a.department_no = b.department_no;

 

3)과 같다.

 

출처 : http://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where

*해당 출처를 참고하여 작성한 글입니다.

'SQL' 카테고리의 다른 글

[SQL]ibatis에서 where 1=1과 1=2  (0) 2017.08.20

+ Recent posts