JaeWon's Devlog
article thumbnail
반응형

DB(MySQL)에서 DELETE 문 에서 Join 을 사용하여 여러 테이블에서 데이터를 삭제하는 방법을 정리해보고자 한다.


1. 일반적인 DELETE 문

--	1. 기본 Delete
DELETE FROM T_MEMBER;

--	2. where 문을 사용한 Delete
DELETE FROM T_MEMBER WHERE NAME = '개발자';

2. Join 을 사용한 DELETE 문

- Join 을 사용하여 Delete 를 할 경우 하나의 쿼리로 다수의 테이블에 있는 데이터를 삭제할 수 있다.

2-1. Inner Join

- INNER JOIN 과 함께 DELETE 문을 실행하면 기준이 되는 테이블에서 행을 삭제하고, 다른 테이블에서 일치하는 행을 추가로 삭제할 수 있다.

- 예를 들어, T1, T2 두 테이블에서 조건을 충족하는 행(row)를 삭제하려면 아래와 같습니다.

--	기본
DELETE T1, T2
FROM T1
INNER JOIN T2
ON T1.key = T2.key;

--	WHERE 문 사용
DELETE T1, T2
FROM T1
INNER JOIN T2
ON T1.key = T2.key
WHERE T1.key = 'TEST';

- 간단하게 예제를 만들어서 확인해보겠습니다.

DROP TABLE IF EXISTS t1, t2;

CREATE TABLE t1 (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE t2 (
    id INT PRIMARY KEY,
    phone VARCHAR(20),
    ref INT NOT NULL
);

INSERT INTO t1 VALUES (1, "개발자"),(2, "테스터"),(3, "백수");

INSERT INTO t2(id,phone,ref) VALUES(1,"01012341234",3),(2,"01033335555",1),(3,"01077778888",2);

좌측 t1, 우측 t2

- t1 테이블에서 id 가 3인 데이터를 삭제하면서, t2 테이블에서도 연관된 ref가 3인 데이터를 지우고자 한다면, 쿼리는 아래와 같습니다.

DELETE T1,T2 
FROM T1
INNER JOIN T2 
ON T1.id = T2.ref 
WHERE T1.id = '3';

- 쿼리를 실행하게되면, 다음 메시지가 반환됩니다.

2 row(s) affected

- 이후 데이터를 확인해보면 두 테이블에서 모두 삭제된 것을 확인 할 수 있습니다.

좌측 t1, 우측 t2

만약, Join 은 사용하지만 하나의 테이블에서만 삭제하고 싶다면, DELETE 와 FROM 사이에 삭제하고자 하는 테이블명만 작성하여 사용하시면 됩니다.

2-2. LEFT JOIN

- 다음과 같이 HUMAN_TABLE 과 PHONE_TABLE 이 있습니다.

- 각 사람은 0개 이상의 전화번호를 가지고 있으나, 전화번호는 1명의 사람에게만 속합니다.

HUMAN_TABLE
PHONE_TABLE

- JEFT JOIN 과 함께 HUMAN_TABLE의 데이터를 정리 할 수 있습니다.

- 전화번호를 가지고 있지 않는 회원을 조회하고, 지워보도록 하겠습니다.

SELECT *
FROM HUMAN_TABLE A
LEFT JOIN PHONE_TABLE B
ON A.human_id = B.human_id
WHERE B.phone_number IS NULL;

- 다음 쿼리는 번호를 가지고 있지 않는 고객을 제거합니다.

DELETE A
FROM HUMAN_TABLE A
LEFT JOIN PHONE_TABLE B
ON A.human_id = B.human_id
WHERE B.phone_number IS NULL;

- 그리고 다시 위 조회를 하게 되면 삭제된 것을 확인하실 수 있습니다.

HUMAN_TABLE


참고

- https://extbrain.tistory.com/74

- https://www.mysqltutorial.org/mysql-delete-join/

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!