CSあるある

SQL은 tuple의 중복을 허락한다!

JIN_YOUNG _KIM 2025. 2. 5. 18:42

엥??? relational data model에서의 implicit constraints에서 분명히 "tuple"은 중복을 허락하지 않는다고 하였는디??

일단 SQL이 어떻게 tuple의 중복을 허락하는 지 예시로 살펴보자. 

📌 예제

아래 예제는 동일한 데이터를 여러 번 삽입하고, 중복이 허용되는지를 확인하는 것입니다.

1️⃣ 테이블 생성

CREATE TABLE employees (

    id INT, // 이 column을 Pk로 명시적 설정하지 않음을 기억하자

	name VARCHAR(50),
    
    department VARCHAR(50)
);

2️⃣ 중복 데이터 삽입

INSERT INTO employees (id, name, department) VALUES (1, 'Alice', 'HR');
INSERT INTO employees (id, name, department) VALUES (1, 'Alice', 'HR');
INSERT INTO employees (id, name, department) VALUES (2, 'Bob', 'IT');

3️⃣ 데이터 조회

SELECT * FROM employees;

4️⃣ 결과

+----+-------+------------+
| id | name  | department |
+----+-------+------------+
| 1  | Alice | HR         |
| 1  | Alice | HR         |
| 2  | Bob   | IT         |
+----+-------+------------+

동일한 튜플((1, 'Alice', 'HR'))이 중복 삽입된 것을 확인할 수 있음!

그러나 implicit constraints에서도 배웠듯이 tuple의 중복을 허락하면 안 된다. 

고로, tuple의 중복을 방지해줘야 한다. 

📌 중복을 방지하려면?

  1. PRIMARY KEY 또는 UNIQUE 제약 조건을 설정→ id가 기본 키이므로 중복된 id 값은 허용되지 않음

-> schema-based constraints(explicit constraints)로 schema를 SQL(DDL)로 정의할 때 명시적(explicit)으로 중복을

허용하지 않게 한다. 

 
CREATE TABLE employees (
    id INT PRIMARY KEY,//schema-based constraints
    name VARCHAR(50),
    department VARCHAR(50)
);
→ id가 PK이므로 중복된 id 값은 허용되지 않음
2. DISTINCT를 사용하여 중복 제거 조회→ DISTINCT를 사용하면 중복된 행이 제거된 결과를 반환.
sql
SELECT DISTINCT * FROM employees;

즉, 기본적으로 SQL은 튜플의 중복을 허용하지만, 키 설정이나 DISTINCT를 활용하여 중복을 방지할 수 있습니다. 😃