Post

6.3 Delete (SQL)

레코드 삭제 구문

만약 서비스를 운영하는 중 회원이 탈퇴를 하거나, 회사에서 퇴사자가 발생한다면 개인과 관련된 정보들을 삭제해야한다. Database에서는 데이터의 삭제를 위해서 DELETE는 구문을 지원한다. DELETE의 사용방법은 다음과 같다:

  • table_name: 레코드를 삭제하려는 테이블명
1
DELETE FROM table_name WHERE ...;

DELETE에서는 테이블명 이외에 컬럼을 따로 지정하지 않는다. 그리고 WHERE를 통해서 삭제할 레코드의 조건을 지정해준다. 만약 WHERE 절을 적지 않는다면, 테이블의 모든 데이터가 삭제되니 주의해야한다.

레코드 삭제의 활용

Table 0: Employee Table

employee_idnamecreated_atemail
1김철수2023-01-01 00:00:00ironsoo@naver.com
2이영희2023-01-02 15:20:00202@gmail.com
3홍길동2023-01-03 09:55:00hkd@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_idnamecreated_at
1개발자2023-01-01 00:00:00
2기획자2023-01-02 00:-0:00

Table 2: EmployeeJob Table

employee_idjob_idhired_at
212023-01-03 15:00:00
312023-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            |
+-------------+--------+---------------------+
+-------------+--------+---------------------+
This post is licensed under CC BY 4.0 by the author.