Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

MySQL 조건 처리의 핵심, IF()·IFNULL()·NULLIF() 함수 완벽 정리

다른 프로그래밍 언어와 마찬가지로 SQL(구조화 질의 언어)에도 데이터 흐름을 제어하는 조건문이 존재합니다. 대표적인 IF 함수는 주어진 조건이 참일 때 하나의 값을 반환하고, 거짓일 때는 다른 값(또는 아무것도 반환하지 않음)을 반환합니다. 이번 글에서는 MySQL을 기준으로 SQL의 IF 계열 함수를 자세히 살펴보겠습니다.

사전 준비: 샘플 테이블 만들기

이 글에서는 이름(name), 나이(age), 성별(gender) 정보를 담은 샘플 스키마를 사용합니다. 아래 SQL을 자신의 IDE나 SQL Fiddle에서 실행해 실습용 테이블을 먼저 생성해 보세요.

create table names (
   id INT,
   name VARCHAR(50),
   age INT,
   gender VARCHAR(50)
);
insert into names (id, name, age, gender) values (1, 'Bret Starkings', 55, 'M');
insert into names (id, name, age, gender) values (2, 'Bobbye Eyckel', 76, 'F');
insert into names (id, name, age, gender) values (3, 'Barbie Veschi', 50, 'F');
insert into names (id, name, age, gender) values (4, 'Electra Blazewicz', 47, 'F');
insert into names (id, name, age, gender) values (5, 'Estrella Borleace', 57, 'F');
insert into names (id, name, age, gender) values (6, 'Washington Pittwood', 75, 'M');
insert into names (id, name, age, gender) values (7, 'Phaedra Tertre', 27, 'F');
insert into names (id, name, age, gender) values (8, 'Nicolina Elie', 76, 'F');
insert into names (id, name, age, gender) values (9, 'Hugh Hughson', 86, 'M');
insert into names (id, name, age, gender) values (10, 'Dare Ravilious', 59, 'M');
insert into names (id, name, age, gender) values (11, 'Cad Levins', 13, 'M');
insert into names (id, name, age, gender) values (12, 'Sollie Kimbury', 33, 'M');
insert into names (id, name, age, gender) values (13, 'Elga Rearie', 61, 'F');
insert into names (id, name, age, gender) values (14, 'Cherey Terron', 54, 'F');
insert into names (id, name, age, gender) values (15, 'Abbie Kent', 23, 'F');
insert into names (id, name, age, gender) values (38, 'Nelia Picot', 2, 'F');
insert into names (id, name, age, gender) values (39, 'Benedetto Smithin', 33, 'M');
insert into names (id, name, age, gender) values (40, 'Rickie Maymand', 83, 'F');
insert into names (id, name, age, gender) values (41, 'Kristoforo Dashkov', 6, 'M');
insert into names (id, name, age, gender) values (42, 'Cherice Genty', 6, 'F');
insert into names (id, name, age, gender) values (43, 'Shirley Fake', 95, 'F');
insert into names (id, name, age, gender) values (44, 'Aeriel Plant', 36, 'F');
insert into names (id, name, age, gender) values (45, 'Halimeda Gook', 74, 'F');
insert into names (id, name, age, gender) values (46, 'Minor Harriot', 63, 'M');
insert into names (id, name, age, gender) values (47, 'Greggory Found', 61, 'M');
insert into names (id, name, age, gender) values (48, 'Vivien Braund', 94, 'F');
insert into names (id, name, age, gender) values (49, 'Gaylord Pochet', 96, 'M');
insert into names (id, name, age, gender) values (77, 'Nataline Sealand', 43, 'F')

IF() 함수

IF(expression ,expr_true, expr_false);

MySQL에서 IF 함수는 세 개의 매개변수를 받습니다. 첫 번째는 평가할 불리언(boolean) 표현식, 두 번째는 조건이 참일 때 반환할 값, 세 번째는 조건이 거짓일 때 반환할 값입니다.

다음 예제는 나이가 18세 이상인지 판별하여 결과를 OVER_18이라는 별칭 컬럼으로 출력합니다.

SELECT name, age, IF(age >= 18, "YES", "NO") AS OVER_18
FROM names;

위 쿼리는 각 레코드의 이름과 나이를 조회한 뒤, 조건 판별 결과를 OVER_18 컬럼으로 함께 반환합니다. 실행 결과의 일부는 아래와 같습니다.

nameageOVER_18
Bret Starkings55YES
Bobbye Eyckel76YES
Barbie Veschi50YES
Electra Blazewicz47YES
Estrella Borleace57YES
Washington Pittwood75YES
Phaedra Tertre27YES
Nicolina Elie76YES
Hugh Hughson86YES
Dare Ravilious59YES
Cad Levins13NO

결과를 보면 13살 Cad Levins만 NO로 표시되고, 나머지는 모두 YES로 출력된 것을 확인할 수 있습니다.

IFNULL() 함수

IFNULL()은 첫 번째 표현식이 NULL인지 검사하는 조건문입니다. 첫 번째 표현식이 NULL이면 두 번째 표현식을 반환하고, NULL이 아니면 첫 번째 표현식을 그대로 반환합니다.

IFNULL(NULL, 2) ⇒ 2 반환
IFNULL(0, 4) ⇒ 0 반환

SELECT name, IFNULL(age, "NOT ENTERED") AS age
FROM names;

위 MySQL 문장은 age라는 컬럼을 반환하며, 나이 값이 NULL로 저장된 모든 레코드를 문자열 "NOT ENTERED"로 대체하여 출력합니다. NULL 값으로 인한 오류나 빈 화면을 방지할 때 매우 유용하게 사용됩니다.

NULLIF() 함수

NULLIF()는 반대로 동작하는 함수입니다. 함수에 전달된 두 표현식이 서로 같으면 NULL을 반환하고, 같지 않으면 첫 번째 표현식을 반환합니다.

SELECT name, NULLIF(name, age)
FROM names;

위 예제는 이름과 나이를 비교하는 극단적인 사례입니다. 실무에서 이름과 나이가 일치하는 경우는 거의 없겠지만, 구문이 어떻게 작성되는지 이해하는 데는 충분합니다. 두 값이 같을 때 특정 연산을 제외하거나, 0으로 나누기 오류를 방지하는 등의 상황에서 NULLIF()가 유용하게 활용될 수 있습니다.

마치며

MySQL에는 데이터 흐름을 제어할 수 있는 여러 종류의 IF 계열 함수가 마련되어 있습니다. IF(), IFNULL(), NULLIF()의 개념은 사용 중인 어떤 데이터베이스에도 동일하게 적용할 수 있으며, 정확한 문법이 필요하다면 해당 DBMS의 공식 문서를 참고하는 것이 좋습니다.