SQL - 처리 중복: 초보자 가이드

안녕하세요, 미래의 SQL 마법사 여러분! 오늘 우리는 SQL에서 중복을 처리하는 흥미로운 세상으로 뛰어들어 보겠습니다. 코드를 한 줄도 작성해 본 적이 없으신 분들도 걱정마세요 - 이 여정에서 여러분의 친절한 안내자가 되어 드릴게요, 단계별로 함께 진행하겠습니다. 이 튜토리얼의 끝을 맺을 때쯤에는 중복을 마치 프로처럼 처리할 수 있을 거예요!

SQL - Handling Duplicates

SQL에서 중복을 처리하는 이유는 무엇인가요?

파티를 준비하고 손님 명단을 작성하는 상상해 보세요. 동일한 사람이 두 번 등록되는 일이 없기를 바랄 것입니다, 아닌가요? SQL에서 중복을 처리하는 것이 중요한 이유도 바로 이와 같습니다. 데이터베이스 세계에서 중복 데이터는 다양한 문제를 일으킬 수 있습니다:

  1. 저장 공간을 낭비합니다
  2. 잘못된 계산과 보고서를 초래할 수 있습니다
  3. 데이터 유지보수를 더 어렵게 만듭니다

quick story를 공유해 드리겠습니다. 데이터베이스 관리자로서의 초창기에, 고객 데이터베이스에서 중복을 놓쳐버린 적이 있었습니다. 그 결과, 마케팅 팀은 같은 프로모션 이메일을 일부 고객에게 여러 번 보냈습니다. 말할 필요도 없겠지만, 그 고객들은 기분이 좋지 않았고, 저는 어려운 방식으로 교훈을 배웠습니다!

중복 항목을 예방하는 방법

중복을 처리하는 가장 좋은 방법은 그것이 데이터베이스에 들어오지 않도록 예방하는 것입니다. 다음과 같은 방법들이 있습니다:

1. 기본 키를 사용하는 방법

기본 키는 테이블의 각 행을 고유하게 식별하는 칼럼(또는 칼럼들의 조합)입니다. 정의 상 중복을 포함할 수 없습니다.

CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);

이 예제에서 StudentID는 기본 키입니다. SQL은 자동으로 중복된 StudentID 값을 삽입하는 것을 방지합니다.

2. 고유 제약 조건을 사용하는 방법

고유 제약 조건은 기본 키와 유사하지만 기본 키가 아닌 칼럼에 적용할 수 있습니다.

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Email VARCHAR(100) UNIQUE,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);

여기서 우리는 Email 칼럼에 고유 제약 조건을 추가했습니다. 이렇게 하면 두 명의 직원이 같은 이메일 주소를 가질 수 없습니다.

3. INSERT IGNORE를 사용하는 방법

MySQL을 사용하고 계신다면, INSERT IGNORE 문을 사용하여 중복 항목을 조용히 무시할 수 있습니다.

INSERT IGNORE INTO Students (StudentID, FirstName, LastName)
VALUES (1, 'John', 'Doe');

만약 StudentID 1에 해당하는 학생이 이미 존재한다면, 이 문은 오류를 발생시키지 않고 단순히 중복 항목을 무시합니다.

중복을 계산하고 식별하는 방법

occasionally sneak into our data despite our best efforts. Let's learn how to find them!

중복을 계산하는 방법

중복을 계산하려면 GROUP BY 절과 HAVING 절을 함께 사용할 수 있습니다.

SELECT FirstName, LastName, COUNT(*) as Count
FROM Students
GROUP BY FirstName, LastName
HAVING Count > 1;

이 쿼리는 학생들을 그들의 이름으로 그룹화하고, 하나 이상의 항목이 있는 그룹만 표시합니다. 마치 "한 번 이상 나타나는 이름을 보여주고, 몇 번 나타났는지 말해줘"라고 묻는 것과 같습니다.

특정 중복을 식별하는 방법

실제 중복 행을 보려면 자체 조인(self-join)을 사용할 수 있습니다.

SELECT s1.*
FROM Students s1
JOIN Students s2 ON
s1.FirstName = s2.FirstName AND
s1.LastName = s2.LastName AND
s1.StudentID > s2.StudentID;

이 쿼리는 각 학생 기록을 다른 모든 학생 기록과 비교합니다. 같은 이름을 가지고 있지만 다른 ID를 가진 두 기록을 찾으면, 더 높은 ID를 가진 기록을 표시합니다. 마치 "다른 학생과 같은 이름을 가진 모든 학생을 보여주고, 그 중에서 ID 번호가 더 높은 학생만 보여주"라고 말하는 것과 같습니다.

테이블에서 중복을 제거하는 방법

이제 우리는 중복을 찾았으니, 그것을 청소해 보겠습니다!

1. DISTINCT 키워드를 사용하는 방법

DISTINCT 키워드는 쿼리 결과에서 중복을 제거하는 가장 간단한 방법입니다.

SELECT DISTINCT FirstName, LastName
FROM Students;

이 쿼리는 테이블에 몇 번 나타나든 각 고유한 이름 조합을 표시합니다.

2. GROUP BY를 사용하는 방법

GROUP BY를 사용하여 중복을 제거할 수도 있습니다.

SELECT FirstName, LastName
FROM Students
GROUP BY FirstName, LastName;

이 쿼리는 DISTINCT와 같은 결과를 제공하지만, 집계 함수를 수행해야 할 때 더 유연하게 사용할 수 있습니다.

3. 영구적으로 중복을 제거하는 방법

테이블에서 중복 행을 실제로 삭제하려면 서브쿼리(subquery)를 사용할 수 있습니다.

DELETE s1 FROM Students s1
INNER JOIN Students s2
WHERE
s1.FirstName = s2.FirstName AND
s1.LastName = s2.LastName AND
s1.StudentID > s2.StudentID;

이 쿼리는 모든 중복 학생을 삭제하고, 가장 낮은 StudentID를 가진 학생만 남깁니다. 이 작업을 수행할 때는 매우 신중해야 합니다 - SQL에는 실행 취소 버튼이 없습니다!

다음은 우리가 논의한 방법들을 요약한 표입니다:

방법 사용 사례 예제
기본 키 중복 방지 CREATE TABLE Students (StudentID INT PRIMARY KEY, ...);
고유 제약 조건 특정 칼럼에서 중복 방지 CREATE TABLE Employees (Email VARCHAR(100) UNIQUE, ...);
INSERT IGNORE 중복 무시 (MySQL) INSERT IGNORE INTO Students ...
COUNT(*)와 GROUP BY 중복 계산 SELECT ..., COUNT(*) ... GROUP BY ... HAVING Count > 1;
자체 조인 특정 중복 식별 SELECT s1.* FROM Students s1 JOIN Students s2 ON ...
DISTINCT 쿼리 결과에서 중복 제거 SELECT DISTINCT FirstName, LastName FROM Students;
DELETE와 자체 조인 영구적으로 중복 제거 DELETE s1 FROM Students s1 INNER JOIN Students s2 WHERE ...

이제 여러분은 중복을 처리하는 데 필요한 지식을 갖추셨습니다. 대단한 힘을 가지게 되셨으니, 쿼리를 실행하기 전에 항상 두 번 확인하십시오, 특히 데이터를 삭제할 때는 더 더욱 그렇습니다. 행복하게 코딩하시고, 여러분의 데이터베이스는 항상 중복 없이 유지되시길 바랍니다!

Credits: Image by storyset