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

MySQL에서 MAX(DISTINCT ...) 구현하는 방법과 DISTINCT 없이 사용할 때의 차이점

MAX() 함수에 DISTINCT를 사용하는 두 가지 문법

먼저 MAX() 함수 안에 DISTINCT 키워드를 사용하는 첫 번째 문법을 살펴보겠습니다.

SELECT MAX(DISTINCT yourColumnName) FROM yourTableName;

두 번째 문법은 다음과 같으며, DISTINCT를 사용하지 않습니다.

SELECT MAX(yourColumnName) FROM yourTableName;

참고: 위 두 쿼리는 DISTINCT 키워드의 사용 여부와 관계없이 동일한 결과를 반환합니다. MySQL은 내부적으로 MAX(yourColumnName)을 처리할 때 자동으로 고유(distinct) 값만 대상으로 연산하기 때문입니다.

예제: 테이블 생성하기

실제 예제를 통해 확인해 보겠습니다. 먼저 테이블을 생성합니다.

mysql> create table DemoTable
(
    Number int
);
Query OK, 0 rows affected (1.50 sec)

INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(78);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(68);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.10 sec)

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+--------+
| Number |
+--------+
|     80 |
|     88 |
|     78 |
|     88 |
|     68 |
|     88 |
+--------+
6 rows in set (0.00 sec)

테이블에는 값 88이 세 번 중복되어 들어가 있는 것을 확인할 수 있습니다.

CASE 1 — MAX(DISTINCT ...) 사용하기

다음은 MAX(DISTINCT ...)를 구현하는 쿼리입니다.

mysql> select max(DISTINCT Number) from DemoTable;

실행 결과는 다음과 같습니다.

+----------------------+
| max(DISTINCT Number) |
+----------------------+
|                   88 |
+----------------------+
1 row in set (0.00 sec)

CASE 2 — DISTINCT 없이 MAX() 사용하기

다음은 DISTINCT를 사용하지 않고 MAX()를 실행하는 쿼리입니다.

mysql> select max(Number) from DemoTable;

실행 결과는 다음과 같습니다.

+-------------+
| max(Number) |
+-------------+
|          88 |
+-------------+
1 row in set (0.07 sec)

결론

위 결과에서 확인할 수 있듯이, 두 쿼리는 완전히 동일한 결과인 88을 반환합니다. 이는 최댓값(MAX) 집계 함수의 특성상 중복 값을 제거하더라도 결과가 달라지지 않기 때문입니다. 따라서 MySQL에서는 가독성을 위해 굳이 DISTINCT 키워드를 추가할 필요가 없습니다. 반면 SUM()이나 AVG()처럼 중복 값 제거 여부에 따라 결과가 달라지는 집계 함수와는 차이가 있다는 점을 기억해 두면 좋습니다.