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

MySQL에서 GROUP BY 절이 DISTINCT처럼 동작하는 이유와 방법

GROUP BY 절과 DISTINCT 절의 유사성

MySQL에서 SELECT 문에 GROUP BY 절을 사용할 때 집계 함수(Aggregate Function)를 함께 사용하지 않으면, 결과가 마치 DISTINCT 절을 사용한 것과 같이 나타납니다. 즉, 중복된 값을 제거하고 고유한 값만 반환하게 됩니다.

예를 들어 다음과 같은 테이블이 있다고 가정해 보겠습니다.

mysql> Select * from testing;
+------+---------+---------+
| id   | fname   | Lname   |
+------+---------+---------+
|  200 | Raman   | Kumar   |
|  201 | Sahil   | Bhalla  |
|  202 | Gaurav  | NULL    |
|  203 | Aarav   | NULL    |
|  204 | Harshit | Khurana |
|  205 | Rahul   | NULL    |
|  206 | Piyush  | Kohli   |
|  207 | Lovkesh | NULL    |
|  208 | Gaurav  | Kumar   |
|  209 | Raman   | Kumar   |
+------+---------+---------+
10 rows in set (0.00 sec)

위 테이블에는 성(Lname) 컬럼에 중복된 값들이 존재합니다. 예를 들어 'Kumar'는 세 번, NULL 값은 네 번 등장합니다.

DISTINCT 절 사용 예시

'Lname' 컬럼에 DISTINCT 절을 적용하면 MySQL은 다음과 같은 결과를 반환합니다.

mysql> select Distinct LNAME from testing;
+---------+
| LNAME   |
+---------+
| Kumar   |
| Bhalla  |
| NULL    |
| Khurana |
| Kohli   |
+---------+
5 rows in set (0.00 sec)

중복이 제거되어 총 5개의 고유한 값만 출력된 것을 확인할 수 있습니다.

GROUP BY 절로 동일한 결과 얻기

이번에는 아래와 같이 GROUP BY 절을 사용해 보겠습니다.

mysql> Select LNAME from testing GROUP BY Lname;
+---------+
| LNAME   |
+---------+
| NULL    |
| Bhalla  |
| Khurana |
| Kohli   |
| Kumar   |
+---------+
5 rows in set (0.04 sec)

DISTINCT 절을 사용했을 때와 마찬가지로 5개의 고유한 값만 반환되었습니다. 집계 함수 없이 GROUP BY를 사용하면 그룹화 기준 컬럼의 고유한 값들만 남기 때문에, 사실상 DISTINCT와 동일한 역할을 수행하는 것입니다.

두 결과의 차이점

두 쿼리의 결과 집합을 자세히 비교하면 한 가지 중요한 차이를 발견할 수 있습니다.

  • GROUP BY 절: 반환되는 결과 집합이 정렬(Sorted)되어 있습니다.
  • DISTINCT 절: 반환되는 결과 집합이 정렬되지 않은 상태로 출력됩니다.

즉, GROUP BY는 내부적으로 그룹화 과정에서 정렬 작업이 수반되는 반면, DISTINCT는 단순히 중복을 제거하기 때문에 정렬이 보장되지 않습니다. 따라서 정렬된 고유값 목록이 필요하다면 GROUP BY를 활용하는 것도 하나의 방법이 될 수 있습니다. 다만 명시적인 순서가 필요한 경우에는 ORDER BY 절을 함께 사용하는 것이 권장됩니다.