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 |
+----+-------+------------+
| id | name | department |
+----+-------+------------+
| 1 | Alice | HR |
| 1 | Alice | HR |
| 2 | Bob | IT |
+----+-------+------------+
→ 동일한 튜플((1, 'Alice', 'HR'))이 중복 삽입된 것을 확인할 수 있음!
그러나 implicit constraints에서도 배웠듯이 tuple의 중복을 허락하면 안 된다.
고로, tuple의 중복을 방지해줘야 한다.
📌 중복을 방지하려면?
- 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를 활용하여 중복을 방지할 수 있습니다. 😃