데이터베이스에서 중복 데이터를 제거하는 것은 매우 중요한 작업입니다. 중복된 데이터는 저장 공간을 낭비하고, 쿼리 성능을 저하시킬 수 있으며, 데이터 분석 시 오류를 일으킬 수 있습니다. 이번 글에서는 SQL에서 중복 데이터를 제거하는 여러 가지 방법에 대해 정리하려 합니다.
1. DISTINCT 키워드 사용
SQL에서 중복된 데이터를 제거하는 가장 간단한 방법 중 하나는 DISTINCT 키워드를 사용하는 것입니다. DISTINCT는 선택한 컬럼에서 중복된 값을 제거하고, 고유한 값만을 반환합니다.
예시:
SELECT DISTINCT column_name
FROM table_name;
위 쿼리는 table_name 테이블에서 column_name 컬럼에 중복된 값이 있을 경우, 중복을 제거하고 유일한 값만 반환합니다.
2. GROUP BY 사용
GROUP BY는 주로 집계 함수와 함께 사용되지만, 중복된 데이터를 제거하는 데에도 유용합니다. 이 방법은 하나 이상의 컬럼을 기준으로 그룹화하여, 각 그룹에 대해 하나의 결과만 반환합니다.
예시:
SELECT column_name
FROM table_name
GROUP BY column_name;
3. ROW_NUMBER()와 CTE(공통 테이블 표현식) 사용
중복된 데이터가 있을 때, 특정 조건을 기준으로 중복된 데이터를 제거하고자 한다면 ROW_NUMBER() 함수를 사용할 수 있습니다. ROW_NUMBER()는 각 행에 고유 번호를 매기며, 이를 활용해 중복된 데이터를 필터링할 수 있습니다.
예시:
WITH CTE AS (
SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name) AS row_num
FROM table_name
)
SELECT column_name
FROM CTE
WHERE row_num = 1;
위 쿼리는 column_name 컬럼에서 중복된 값을 찾아, 가장 첫 번째로 나타나는 값만 반환합니다. PARTITION BY는 중복을 기준으로 구분하고, ORDER BY는 중복된 값들에 순서를 매깁니다.
4. DELETE로 중복 데이터 제거
중복된 데이터를 삭제하고 테이블에서 완전히 제거하려면 DELETE 문을 사용해야 합니다. 이를 위해서 먼저 중복된 데이터를 찾고, 이를 삭제하는 쿼리를 작성합니다.
예시:
WITH CTE AS (
SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name) AS row_num
FROM table_name
)
DELETE FROM table_name
WHERE column_name IN (
SELECT column_name
FROM CTE
WHERE row_num > 1
);
위 쿼리는 table_name에서 중복된 column_name 값을 가진 행들을 찾아 삭제합니다. ROW_NUMBER()를 사용하여 중복된 값을 찾아 row_num > 1인 값들을 삭제하는 방식입니다.
5. DISTINCT ON (PostgreSQL 경우)
PostgreSQL에서는 DISTINCT ON을 사용하여 중복된 데이터를 쉽게 제거할 수 있습니다. 이 방법은 특정 컬럼에서 첫 번째 중복 항목을 반환하도록 설정할 수 있습니다.
예시:
SELECT DISTINCT ON (column_name) column_name
FROM table_name
ORDER BY column_name;
위 쿼리는 column_name에서 첫 번째 값을 반환하고, 중복된 값은 제거합니다.
결론
SQL에서 중복된 데이터를 제거하는 방법은 여러 가지가 있으며, 사용하는 데이터베이스 시스템과 상황에 따라 적합한 방법을 선택해야 합니다. DISTINCT나 GROUP BY를 사용하여 간단히 중복을 제거할 수 있지만, 복잡한 상황에서는 ROW_NUMBER()와 CTE를 활용하여 더 정교하게 중복을 처리할 수 있습니다. 중복된 데이터를 효과적으로 처리함으로써 데이터베이스의 성능을 최적화하고, 더 정확한 데이터 분석을 할 수 있습니다.