sql, column is null과 column = null

‘is null’과 ‘= null’의 차이를 명확하게 확인할 필요가 있었다

  • sql을 사용하면서 column is nullcolumn = null 의 차이가 궁금했다.
  • 특히 아래와 같이 sql mapping를 활용하여 어플리케이션에서 쿼리를 날릴 때 기대하는 방향대로 동작하지 않을까 걱정했다.
void updateName(){
    Test test = new Test();
    test.setName("kim");
    test.setId(null);
    mapper.update(test); // update tests set name = ? where id = ?; 
}
  • sql mapper인 mybatis를 활용하여 update tests set name = ? where id = ?; 형태로 쿼리를 작성했다. setId에 null이 들어갔다. 이 경우 id가 어떤 경우 update가 될까? 만약 예상치 못한 레코드가 변경되는 것은 아닐까?
  • 아래와 같은 문제를 고려해봤다.
    • id 칼럼이 null인 경우 동작한다.
    • id 칼럼이 empty인 경우 동작한다.
    • id 칼럼이 문자열 ‘null’인 경우 동작한다.
    • db에서 예외를 던진다.
  • 아래와 같이 테스트를 진행하였다.
create table tests(
    seq int auto_increment primary key,
    id varchar(100),
    name varchar(100)
)

insert into tests (id, name) values 
(null, 'kim'),
('null', 'kim'),
('', 'kim'),
('kim1234', 'kim');

-- affected 0
update tests 
set name = 'new name'
where id = null 

-- affected 0
update tests 
set name = 'new name'
where id != null

-- affected 1
update tests 
set name = 'new name'
where id is null 
  • 테스트 결과 where somecolumn = null 쿼리 자체가 동작하지 않았다. 그러니까 필터링 되는 값이 0개였다.
  • 처음 개발을 할 때 column is null이 매우 불편하다고 생각했다. 지금 보면 매우 안전한 방식이다. where id = ? 으로 동적쿼리를 생성하는 과정에서 null을 입력할 수 있는 상황은 언제든 발생할 수 있다. 이러한 상황에서 ‘= null’ 과 ‘is null’을 통하여 null을 통제하는 방식은 사이드이펙트를 최소화 한다.