요약 : 해당 튜토리얼에서는 MySQL DELETE JOIN문을 이용하여 여러 테이블에서 데이터를 삭제하는 방법을 보여줍니다.
이전 튜토리얼에서 배운 내용 :
- 여러 테이블에 대한 단일 DELETE문
- 자식 테이블(child table)에 foreign key에 대한 ON DELETE CASCADE 참조 작업이 있는 여러 관련 테이블에 대한 단일 DELETE문
이번 튜토리얼에서는 DELETE문과 함께 INNER JOIN 또는 LEFT JOIN 절을 사용하여 여러 테이블에서 데이터를 삭제(제거)하는 보다 유연한 방법을 소개합니다.
MySQL DELETE JOIN with INNER JOIN
MySQL은 DELETE 문에서 INNER JOIN절을 사용하여 테이블에서 행을 삭제하고 다른 테이블에서 일치하는 행 도한 삭제할 수 있습니다.
예를 들어, 지정된 조건을 모두 충족하는 T1 및 T2 테이블 모두에서 행을 삭제하려면 다음과 같은 쿼리를 사용합니다.
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;
DELETE와 FROM 사이에 테이블 이름 T1과 T2를 넣습니다. T1 테이블을 생략하게 되면 DELETE 문은 T2 테이블의 행만 삭제하게 됩니다. 마찬가지로, T2 테이블을 생략하면 DELETE 문은 T1 테이블의 행만 삭제하게 됩니다.
T1.key = T2.key 식은 삭제할 T1과 T2 테이블 간의 일치하는 행에 대한 조건을 지정합니다.
WHERE 절의 조건은 삭제할 T1및 T2의 행을 결정합니다.
MySQL DELETE JOIN with INNER JOIN example
다음과 같은 구조와 데이터를 가진 두 개의 테이블 t1과 t2가 있다고 가정합니다 :
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT
);
CREATE TABLE t2 (
id VARCHAR(20) PRIMARY KEY,
ref INT NOT NULL
);
INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2(id,ref) VALUES('A',1),('B',2),('C',3);

다음 쿼리는 DELETE...INNER JOIN문을 사용하여 t1 테이블에서 ID가 1인 행과 t2 테이블에서 ref가 1인 행을 삭제합니다.
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
2 row(s) affected
이것은 두 개의 행이 삭제되었음을 알려줍니다.
MySQL DELETE JOIN with LEFT JOIN
우리는 종종 SELECT 문에서 LEFT JOIN을 사용하여 오른쪽 테이블에 일치하는 행이 있거나 없는 왼쪽 테이블의 행을 찾습니다. DELETE 문에서도 LEFT JOIN을 사용하여 다른 테이블(오른쪽 테이블)에 일치하는 행이 없는 테이블(왼쪽 테이블)의 행을 삭제할 수도 있습니다. 다음 쿼리는 LEFT JOIN과 함께 DELET 문을 사용하여 T2 테이블에 해당되는 행이 없는 T1 테이블에서 행을 삭제하는 방법을 보여줍니다.
DELETE T1
FROM T1
LEFT JOIN
T2 ON T1.key = T2.key
WHERE
T2.key IS NULL;
INNER JOIN 절에서 했던 것 처럼 T1과 T2 테이블이 아니라, DELETE 키워드 뒤에 T1 테이블만 넣습니다.
MySQL DELETE JOIN with LEFT JOIN example
샘플 데이터베이스에서 고객 및 주문 테이블을 참조하십시오:

각 고객은 0개 이상의 주문을 가지고 있습니다. 그러나 각 주문은 단 한명의 고객에게만 속합니다.
우리는 LEFT JOIN절을 DELETE 문과 함께 사용하여 고객 마스터 데이터를 정리할 수 있습니다. 다음 쿼리는 주문을 하지 않은 고객 데이터를 제거합니다:
DELETE customers
FROM customers
LEFT JOIN
orders ON customers.customerNumber = orders.customerNumber
WHERE
orderNumber IS NULL;
다음 쿼리를 사용하여 주문이 없는 고객이 있는지 확인하여 삭제를 확인할 수 있습니다.
SELECT
c.customerNumber,
c.customerName,
orderNumber
FROM
customers c
LEFT JOIN
orders o ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;
The query returned an empty result set which is what we expected.
쿼리는 우리가 예상했던 것과 같은 빈 결과 집합을 반환했습니다.
'SQL > 개념' 카테고리의 다른 글
[MySQL] SELF-JOIN (0) | 2022.06.10 |
---|---|
[TIL] MySQL에서 위도-경도 거리 계산하기 (0) | 2022.06.09 |
[MySQL] WINDOW함수 (0) | 2022.05.26 |
[MY SQL] CONCAT과 GROUP_CONCAT (0) | 2022.05.05 |
[Oracle] Like 연산자 (0) | 2022.04.08 |