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

MySQL에서 DISTINCT로 날짜별 고유한 값만 조회하는 방법

MySQL에서 DISTINCT 값 조회하기

데이터베이스 작업을 하다 보면 datetime 컬럼에 시간까지 포함된 여러 레코드가 저장되어 있을 때, 날짜 기준으로 중복을 제거하고 고유한 값만 조회해야 하는 경우가 자주 있습니다. 이 글에서는 GROUP BY와 DATE() 함수를 활용해 특정 컬럼의 고유한 값을 출력하는 방법을 예제와 함께 살펴보겠습니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1996
(
    ShippingDate datetime,
    CustomerName varchar(20)
);
Query OK, 0 rows affected (0.84 sec)

배송일자(ShippingDate)를 저장하는 datetime 타입 컬럼과 고객명(CustomerName)을 저장하는 varchar 타입 컬럼으로 구성된 간단한 테이블입니다.

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable1996 values('2019-12-21 10:45:00','Chris');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1996 values('2019-12-21 12:10:00','David');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1996 values('2019-12-20 12:10:00','Bob');
Query OK, 1 row affected (0.14 sec)

여기서 주목할 점은 '2019-12-21' 날짜에 두 개의 레코드가 존재하지만, 시간이 서로 다르다는 것입니다.

3. 전체 레코드 확인하기

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

mysql> select * from DemoTable1996;

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

+---------------------+--------------+
| ShippingDate        | CustomerName |
+---------------------+--------------+
| 2019-12-21 10:45:00 | Chris        |
| 2019-12-21 12:10:00 | David        |
| 2019-12-20 12:10:00 | Bob          |
+---------------------+--------------+
3 rows in set (0.00 sec)

현재 3개의 레코드가 조회되며, 같은 날짜라도 시간이 다르면 별개의 행으로 표시됩니다.

4. 날짜 기준으로 고유한 값만 조회하기

날짜 부분만 추출하여 그룹화하려면 DATE() 함수와 GROUP BY 절을 함께 사용하면 됩니다.

mysql> select * from DemoTable1996 group by date(ShippingDate);

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

+---------------------+--------------+
| ShippingDate        | CustomerName |
+---------------------+--------------+
| 2019-12-21 10:45:00 | Chris        |
| 2019-12-20 12:10:00 | Bob          |
+---------------------+--------------+
2 rows in set (0.07 sec)

결과 분석 및 참고 사항

'2019-12-21' 날짜의 두 레코드가 하나로 묶여 총 2개의 행만 반환되었습니다. 즉, 시간 정보를 무시하고 날짜 단위로 고유한 값만 필터링한 결과입니다.

다만 한 가지 유의할 점이 있습니다. 위 쿼리처럼 SELECT *와 함께 GROUP BY를 사용하면, 그룹 내 어떤 레코드가 대표로 선택될지 보장되지 않습니다. MySQL 5.7 이상 버전에서는 ONLY_FULL_GROUP_BY SQL 모드가 기본적으로 활성화되어 있어 이런 쿼리가 오류를 발생시킬 수 있습니다. 따라서 실무에서는 다음과 같이 작성하는 것이 안전합니다.

mysql> select date(ShippingDate) as ShippingDay, min(CustomerName) as CustomerName
from DemoTable1996
group by date(ShippingDate);

이렇게 하면 날짜별로 하나의 대표 값을 명확하게 지정할 수 있어, 의도치 않은 결과를 방지하고 코드의 호환성도 높일 수 있습니다.