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

MySQL에서 NULL이 포함된 여러 열의 최대값 구하는 방법 (COALESCE + GREATEST)

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)나 해당 자료형의 최솟값을 사용해야 잘못된 결과를 피할 수 있습니다.