MySQL에서 여러 열에 저장된 값 중 가장 큰 값을 구할 때는 GREATEST() 함수를 사용합니다. 하지만 열에 NULL 값이 섞여 있으면 단순 비교만으로는 원하는 결과를 얻기 어렵습니다. 이럴 때 COALESCE() 함수를 함께 사용하면 깔끔하게 해결할 수 있습니다.
핵심 함수 살펴보기
- GREATEST(): 전달된 여러 값 중 가장 큰 값을 반환합니다. 다만 인수 중 하나라도 NULL이면 결과 역시 NULL이 됩니다.
- COALESCE(): 인수 목록에서 NULL이 아닌 첫 번째 값을 반환합니다. 이를 활용하면 NULL을 지정한 대체값(예: 0)으로 치환할 수 있습니다.
즉, 각 열에 COALESCE(열, 0)을 적용해 NULL을 0으로 바꾼 뒤 GREATEST()로 감싸면, NULL 여부와 관계없이 여러 열의 최대값을 정확히 구할 수 있습니다. 아래 예제로 직접 확인해 보겠습니다.
1. 테이블 생성하기
mysql> create table DemoTable -> ( -> Value1 int, -> Value2 int, -> Value3 int -> ); Query OK, 0 rows affected (0.61 sec)
2. 데이터 삽입하기
insert 명령으로 NULL이 포함된 샘플 데이터를 넣어 보겠습니다.
mysql> insert into DemoTable values(NULL,80,76); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable values(NULL,NULL,100); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(56,NULL,45); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(56,120,90); Query OK, 1 row affected (0.21 sec)
3. 저장된 데이터 확인하기
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+--------+--------+ | Value1 | Value2 | Value3 | +--------+--------+--------+ | NULL | 80 | 76 | | NULL | NULL | 100 | | 56 | NULL | 45 | | 56 | 120 | 90 | +--------+--------+--------+ 4 rows in set (0.00 sec)
4. 여러 열에서 최대값 조회하기
다음 쿼리는 세 개의 열 각각에 COALESCE()를 적용해 NULL을 0으로 치환한 후, GREATEST()로 가장 큰 값을 반환합니다.
mysql> select greatest(coalesce(Value1,0),coalesce(Value2,0),coalesce(Value3,0)) from DemoTable;
실행 결과:
+--------------------------------------------------------------------+ | greatest(coalesce(Value1,0),coalesce(Value2,0),coalesce(Value3,0)) | +--------------------------------------------------------------------+ | 80 | | 100 | | 56 | | 120 | +--------------------------------------------------------------------+ 4 rows in set (0.00 sec)
동작 원리와 주의 사항
GREATEST()는 인수 중 하나라도 NULL이면 결과로 NULL을 반환하기 때문에, NULL이 들어 있는 열을 그대로 비교하면 의도한 최대값을 얻을 수 없습니다. 위 예제에서 두 번째 행은 Value1과 Value2가 모두 NULL이지만, COALESCE() 덕분에 Value3의 값인 100이 정상적으로 출력되었습니다.
다만 이 방식은 모든 값이 0 이상일 때만 안전합니다. 만약 음수가 저장될 가능성이 있다면 대체값으로 매우 작은 수(예: -999999)나 해당 자료형의 최솟값을 사용해야 잘못된 결과를 피할 수 있습니다.