MySQL에서 GROUP BY 절과 조건을 함께 사용하면 각 그룹별로 NULL 또는 빈 문자열('')이 아닌 값만 효율적으로 추출할 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 그 방법을 살펴보겠습니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Id varchar(100),
-> Message varchar(200)
-> );
Query OK, 0 rows affected (1.17 sec)
2. 데이터 삽입
INSERT 명령을 사용해 빈 문자열과 NULL 값을 포함한 다양한 레코드를 삽입합니다.
mysql> insert into DemoTable values('1','');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values('1','Hi');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('2','Hello');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('3','Awesome');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('3','Good Morning');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('2',NULL);
Query OK, 1 row affected (0.15 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+------+--------------+
| Id | Message |
+------+--------------+
| 1 | |
| 1 | Hi |
| 2 | Hello |
| 3 | Awesome |
| 3 | Good Morning |
| 2 | NULL |
+------+--------------+
6 rows in set (0.00 sec)
위 결과를 보면 Id 1에는 빈 문자열('')이, Id 2에는 NULL 값이 포함되어 있는 것을 확인할 수 있습니다.
4. 비어 있지 않은 값만 GROUP BY로 조회하기
다음은 WHERE 절에서 IS NOT NULL과 length() 함수를 함께 사용하여, 각 Id 그룹별로 비어 있지 않은 메시지 중 사전 순으로 가장 앞서는 값을 선택하는 쿼리입니다.
mysql> select Id,min(Message) from DemoTable
-> where Message IS NOT NULL and length(Message) > 0
-> group by Id;
출력 결과
+------+--------------+
| Id | min(Message) |
+------+--------------+
| 1 | Hi |
| 2 | Hello |
| 3 | Awesome |
+------+--------------+
3 rows in set (0.06 sec)
쿼리 핵심 포인트
- Message IS NOT NULL — NULL 값을 제외합니다.
- length(Message) > 0 — 빈 문자열('')까지 함께 걸러냅니다. IS NOT NULL만으로는 빈 문자열이 필터링되지 않기 때문에 두 조건을 반드시 함께 사용해야 합니다.
- min(Message) — 각 그룹에서 비어 있지 않은 값 중 사전 순으로 가장 작은 값을 반환합니다.
- group by Id — Id를 기준으로 레코드를 그룹화합니다.
이처럼 IS NOT NULL과 length() 함수를 조합하면 NULL과 빈 문자열을 동시에 필터링할 수 있으며, GROUP BY 결과에서 의미 있는 값만 깔끔하게 추출할 수 있습니다.