6.3 Delete (SQL)
레코드 삭제 구문
만약 서비스를 운영하는 중 회원이 탈퇴를 하거나, 회사에서 퇴사자가 발생한다면 개인과 관련된 정보들을 삭제해야한다. Database에서는 데이터의 삭제를 위해서 DELETE는 구문을 지원한다. DELETE의 사용방법은 다음과 같다:
- table_name: 레코드를 삭제하려는 테이블명
1
DELETE FROM table_name WHERE ...;
DELETE에서는 테이블명 이외에 컬럼을 따로 지정하지 않는다. 그리고 WHERE를 통해서 삭제할 레코드의 조건을 지정해준다. 만약 WHERE 절을 적지 않는다면, 테이블의 모든 데이터가 삭제되니 주의해야한다.
레코드 삭제의 활용
Table 0: Employee Table
employee_id | name | created_at | |
---|---|---|---|
1 | 김철수 | 2023-01-01 00:00:00 | ironsoo@naver.com |
2 | 이영희 | 2023-01-02 15:20:00 | 202@gmail.com |
3 | 홍길동 | 2023-01-03 09:55:00 | hkd@gmail.com |
Employee 테이블을 이용하여 예시를 들어보자.
Q. 김철수 사원이 퇴사를 하여 관련된 정보를 삭제해야한다. Employee 테이블에서 김철수 사원의 정보를 삭제해보자.
1
2
3
4
5
6
7
8
9
10
11
12
-- 김철수 삭제
DELETE FROM employee WHERE name = '김철수';
-- 삭제 결과 조회
SELECT * FROM employee;
-- 조회 결과:
-- +-------------+------+---------------------+-------------------+
-- | employee_id | name | created_at | email |
-- +-------------+------+---------------------+-------------------+
-- | 2 | 이영희 | 2023-01-02 15:20:00 | 202@gmail.com |
-- | 3 | 홍길동 | 2023-01-03 09:55:00 | hkd@gmail.com |
-- +-------------+------+---------------------+-------------------+
만약 사원중에 동명이인이 존재한다면, name 컬럼을 이용하여 삭제를 하는 것은 오류의 원인이 될 수 있다. 따라서 하나의 레코드만 삭제하기 위해서라면 employee_id를 조건으로 사용하는 것이 좋다:
1
DELETE FROM employee WHERE employee_id = 1;
DELETE … USING (PostgreSQL Only)
다른 DML구문과 마찬가지로, DELETE도 다른 테이블의 정보를 이용하여 삭제를 하려는 요구가생긴다. 이때 DELETE ... USING
구문을 사용할 수 있으며, 사용법은 다음과 같다:
- tb1: 데이터를 삭제할 테이블
- tb2: 값을 불러올 테이블
- match_col: 값을 불러올 레코드를 매칭하기 위한 조건값
1
2
3
DELETE FROM tb1
USING tb2
WHERE tb1.match_col = tb2.match_col AND ...;
위의 쿼리문의 WHERE절을 보면 tb1과 tb2의 연결관계에 따른 조건뿐만 아니라, tb1과 tb2를 필터링하는 용도로도 사용한다. Job과 EmployeeJob을 이용한 예시를 살펴보자.
Table 1: Job Table
job_id | name | created_at |
---|---|---|
1 | 개발자 | 2023-01-01 00:00:00 |
2 | 기획자 | 2023-01-02 00:-0:00 |
Table 2: EmployeeJob Table
employee_id | job_id | hired_at |
---|---|---|
2 | 1 | 2023-01-03 15:00:00 |
3 | 1 | 2023-01-03 15:00:00 |
Q. EmployeeJob 테이블에서 개발자에 해당하는 레코드를 삭제해보자.
DELETE ... USING
구문을 이용하여 예제에 해당하는 동작을 수행하기 위해선 아래 두 기능을하는 쿼리문을 작성해야한다.
- USING절을 통해서 Job을 가져온 뒤, EmployeeJob의 job_id (FK)를 이용하여 Job과 매칭
- 개발자에 해당하는 job_id는 Job의 name 컬럼이 개발자인 레코드에서 참조할 수 있다. 그리고 쿼리문을 작성할 수 있다:
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 개발자에 해당하는 연결관계 삭제
DELETE FROM employee_job
USING job
WHERE employee_job.job_id = job.job_id
AND job.name = '개발자';
-- 삭제 결과 조회
SELECT * FROM employee_job;
-- 조회 결과:
+-------------+--------+---------------------+
| employee_id | job_id | hired_at |
+-------------+--------+---------------------+
+-------------+--------+---------------------+