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 테이블에서 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
- 이후 데이터를 확인해보면 두 테이블에서 모두 삭제된 것을 확인 할 수 있습니다.
만약, Join 은 사용하지만 하나의 테이블에서만 삭제하고 싶다면, DELETE 와 FROM 사이에 삭제하고자 하는 테이블명만 작성하여 사용하시면 됩니다.
2-2. LEFT JOIN
- 다음과 같이 HUMAN_TABLE 과 PHONE_TABLE 이 있습니다.
- 각 사람은 0개 이상의 전화번호를 가지고 있으나, 전화번호는 1명의 사람에게만 속합니다.
- 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;
- 그리고 다시 위 조회를 하게 되면 삭제된 것을 확인하실 수 있습니다.
참고
'BackEnd > DataBase' 카테고리의 다른 글
[MYSQL] IN, EXISTS 절 활용하기 (0) | 2022.08.27 |
---|---|
[MySQL] abs 함수를 통한 절대값 구하기 (0) | 2022.08.26 |
[MySQL] on duplicate key update(Insert 시 값 존재하면 Update) (0) | 2022.07.01 |
[DB] Join(조인) 정리하기 (0) | 2022.05.07 |
[DB] Transaction(트랜잭션) 정리하기 (0) | 2022.05.07 |