사원 이름 name과 월급 salary로 구성되어 있는 db 테이블이 있다고 생각해 봅시다. 아직 직급 필드는 없다고 생각해 봅시다. 월급 협상이 안 된 신입 직원 분들도 있다고 해 봅시다. 그럴 일이 있을지는 잘 모르겠지만요. 그러면 salary가 null값인 레코드가 있다는 것입니다.
일단 레코드 5개만 추가해 봅시다. 데이터 베이스 이름은 worker입니다.
필드가 2개입니다. 하나는 worker_name, 다른 하나는 salary입니다. worker_name은 반드시 5자가 아니기 때문에, 가변 길이를 이용하였습니다. 그리고 월급은 정수형으로 표현할 수 있기 때문에, int로 설정하였습니다.
그리고 다음과 같이 데이터를 넣습니다. salary 필드에 not null 조건이 붙어 있지 않은 걸로 보아서는, null 값이 들어가도 된다는 것이네요. 부서랑 직책도 있지만, 이것은 나중에 다시 추가를 해 보도록 합시다. 이제, select * from worker; 라는 쿼리로 내용물을 확인해 봅시다.
이 쿼리입니다. 이것을 실행시켜 보면 아래와 같이 나올 겁니다.
실습 준비는 끝이 났습니다. salary의 값이 null일 경우, 0으로 결과값을 대체하는 쿼리를 만들어 볼 게요.
일단 데이터에 따라서 다른 결과값을 가져와야 합니다. 조건에 걸리는 절은 salary입니다. 만약에 salary가 null값이라면 0을 출력해야 하고, 아니라면 salary를 가져 와야 합니다.
그러면 case문을 쓸 수도 있어요. case when 조건 then 결과, ... , else 결과 이런 식으로요. 여기에서는 조건이 is null로 걸렸는데요. 만약에 레코드의 salary 필드가 null 이라면, 0을 가져오는 것이에요. 아니라면 그냥 salary 값을 가지고 오면 될 거에요.
그런데, 이것을 간단하게 하는 방법이 있는데, mysql에서는 ifnull을 이용하면 됩니다.
사용 방법은 아래와 같습니다.
ifnull(expr1,expr2);
만약에 expr1이 null이라면, expr2를 리턴합니다. 그렇지 않다면, expr1을 리턴합니다. 그러면 결과 레코드의 어떠한 필드 값이 NULL일 때, NULL 대신에 다른 값을 끌어 온다? 정도로 보시면 될 듯 싶어요. 어렵지 않아요.
그러면, 이것은 어떨까요? 어떠한 레코드의 salary 필드가 NULL값을 가진다면 0을 리턴합니다. 그렇지 않다면, salary 필드의 값을 그대로 가져올 거에요. 이 코드의 수행 결과는 어떻게 될까요?
Anie와 David의 월급이 모르는 값인 NULL값이였어요. 그렇기 때문에, 저는 ifnull을 이용해서, salary 필드가 널 값이라면 0을 리턴하게끔 했습니다. 또 다른 예제를 봅시다.
이것은 어떨까요? 'chogahui05'라는 표현식1이 NULL값이라면 '05'를, 아니라면 표현식1을 리턴해요. 그런데 봅시다. 1번째 표현식인 'chogahui05'는 알 수 없는 값인 NULL이 아닙니다. 따라서 그냥 'chogahui'를 출력합니다.
그렇군요. 이제 또 다른 예제를 봅시다. expr1이 ''이라고 해 봅시다. 그러면 어떤 결과를 출력할까요?
''은 빈 문자열이에요. 길이가 0이기 때문입니다. 이는 알 수 없는 값인 NULL과 다릅니다. 따라서, 이 때에도, ''은 NULL이 아닙니다. 따라서, 표현식 1인 ''를 출력하게 됩니다.
만약에 쿼리가 ifnull(NULL,'05')라면 이야기가 달라집니다. expr1이 NULL, 즉 알 수 없는 값입니다. 알 수 없다는 것이 참이기 때문에 '05'가 리턴됩니다.
어렵지 않아요. mysql에서 iffull 함수는 그냥 expr1이 NULL이면 expr2를 리턴하고, 아니면 expr1을 리턴한다. 정도만 짚고 넘어가시면 좋을 듯 싶습니다.
'코딩 > Sql' 카테고리의 다른 글
mysql regexp : 복잡한 패턴 매칭을 해 봅시다. (20) | 2019.08.12 |
---|---|
mysql 테이블 컬럼 추가 : alter 명령어로 해 보자. (3) | 2019.08.02 |
mysql Like 연산자 : 간단한 패턴과 매칭되는지 검사한다. (8) | 2019.08.01 |
mysql sysdate vs now : 비슷한 거 같지만 차이가 있다. (3) | 2019.07.20 |
sql null 값 : 어느 값인지 모른다. (4) | 2019.07.13 |
최근댓글