SQL을 사용하여 데이터베이스를 조작할 때 불필요한 데이터를 삭제하는 것은 흔한 일입니다. 그러나 여러 테이블에 관련된 데이터를 삭제할 경우, 단순한 DELETE 문으로는 충분하지 않을 수 있습니다. 이때 JOIN을 사용하여 다른 테이블과 결합하고 특정 조건에 따라 데이터를 삭제하는 방법이 효과적입니다. 본 기사에서는 JOIN을 사용한 DELETE 문법의 기초부터 구체적인 예까지 자세히 설명합니다.
DELETE 문법의 기본 구조
DELETE 문은 특정 조건에 맞는 데이터를 테이블에서 삭제하는 데 사용됩니다. 기본적인 문법은 다음과 같습니다.
기본 문법
DELETE FROM 테이블명
WHERE 조건;
예시
다음은 employees
테이블에서 특정 직원 ID를 가진 레코드를 삭제하는 예시입니다.
DELETE FROM employees
WHERE employee_id = 123;
이 구문에서는 employees
테이블에서 employee_id
가 123인 행이 삭제됩니다. WHERE
절을 사용하지 않으면 테이블 내 모든 레코드가 삭제되므로 주의해야 합니다.
JOIN을 사용한 DELETE 문법
여러 테이블에 관련된 데이터를 삭제할 때는 JOIN을 사용하여 조건에 따라 데이터를 삭제할 수 있습니다. 기본적인 문법은 다음과 같습니다.
JOIN을 사용한 DELETE 문법의 기본 구조
DELETE t1
FROM 테이블1 t1
JOIN 테이블2 t2 ON t1.공통컬럼 = t2.공통컬럼
WHERE 조건;
예시
다음은 orders
테이블과 customers
테이블을 JOIN하여 특정 고객 ID에 관련된 주문 데이터를 삭제하는 예시입니다.
DELETE o
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
이 구문에서는 orders
테이블의 customer_id
가 customers
테이블의 customer_id
와 일치하는 행 중에서 customers
테이블의 customer_id
가 123인 주문 데이터가 삭제됩니다. JOIN을 사용하면 여러 테이블에 걸친 조건에 따라 데이터를 삭제할 수 있습니다.
INNER JOIN을 사용한 삭제 예시
INNER JOIN을 사용하면 두 테이블에 공통된 데이터를 기반으로 특정 조건을 만족하는 행을 삭제할 수 있습니다. 다음은 그 구체적인 예시입니다.
INNER JOIN을 사용한 DELETE 문 예시
다음 예시에서는 orders
테이블과 customers
테이블을 INNER JOIN하여 특정 고객 ID에 관련된 주문 데이터를 삭제합니다.
DELETE o
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
실행 상세
orders
테이블(별칭 o)과customers
테이블(별칭 c)을customer_id
로 결합합니다.customers
테이블의customer_id
가 123인 행을 대상으로 합니다.- 그 조건에 맞는
orders
테이블의 행을 삭제합니다.
사용 예시
예를 들어, 특정 고객(ID 123)이 계정을 삭제한 경우, 해당 고객에 관련된 주문 데이터를 삭제하고자 할 수 있습니다. 이 DELETE 문은 해당 고객에 관련된 모든 주문 데이터를 삭제하는 데 도움이 됩니다.
INNER JOIN을 사용하면 특정 조건에 맞는 데이터만 정확히 삭제할 수 있습니다. 이를 통해 데이터의 일관성을 유지하면서 불필요한 데이터를 효율적으로 삭제할 수 있습니다.
LEFT JOIN을 사용한 삭제 예시
LEFT JOIN을 사용하면 특정 조건을 충족하는 데이터를 삭제할 때 관련된 테이블에 존재하지 않는 데이터도 고려할 수 있습니다. 다음은 그 구체적인 예시입니다.
LEFT JOIN을 사용한 DELETE 문 예시
다음 예시에서는 orders
테이블과 customers
테이블을 LEFT JOIN하여 customers
테이블에 존재하지 않는 주문 데이터를 삭제합니다.
DELETE o
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id IS NULL;
실행 상세
orders
테이블(별칭 o)과customers
테이블(별칭 c)을customer_id
로 LEFT JOIN합니다.customers
테이블에 해당하는customer_id
가 존재하지 않는(값이 NULL인) 행을 대상으로 합니다.- 그 조건에 맞는
orders
테이블의 행을 삭제합니다.
사용 예시
예를 들어, 고객 정보가 삭제된 후에도 관련된 주문 데이터가 데이터베이스에 남아 있는 경우, 이 DELETE 문을 사용하여 customers
테이블에 존재하지 않는 고객의 주문 데이터를 일괄 삭제할 수 있습니다.
LEFT JOIN을 사용하면 주로 왼쪽 테이블(orders
)에 남아 있는 고립된 데이터를 삭제할 수 있습니다. 이를 통해 데이터베이스 내 데이터의 일관성을 유지하면서 불필요한 데이터를 효율적으로 삭제할 수 있습니다.
안전하게 DELETE 문을 실행하는 팁
DELETE 문을 실행할 때는 실수로 중요한 데이터를 삭제하지 않도록 주의해야 합니다. 아래 팁을 참고하여 안전하게 DELETE 문을 실행해 보세요.
팁 1: 트랜잭션 사용
DELETE 문을 트랜잭션 내에서 실행하면 오류가 발생한 경우 변경 사항을 롤백할 수 있습니다.
BEGIN TRANSACTION;
DELETE o
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
-- 문제가 없으면 커밋
COMMIT;
-- 문제가 있으면 롤백
ROLLBACK;
팁 2: 삭제 대상 데이터 확인
DELETE 문을 실행하기 전에 SELECT 문을 사용하여 삭제할 데이터를 확인합니다.
SELECT o.*
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
팁 3: 백업을 받기
중요한 데이터가 포함된 테이블의 백업을 주기적으로 받아두면, 실수로 데이터를 삭제했을 때도 복구할 수 있습니다.
팁 4: LIMIT 절 사용
대량의 데이터를 한 번에 삭제할 경우, LIMIT 절을 사용하여 삭제할 행 수를 제한합니다.
DELETE o
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123
LIMIT 10;
팁 5: 로그 기록
DELETE 문 실행 전후에 로그를 기록하여 어떤 데이터가 삭제되었는지 추적할 수 있습니다.
INSERT INTO delete_log (
table_name, deleted_at, deleted_rows)
SELECT 'orders', NOW(), COUNT(*)
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
DELETE o
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 123;
이러한 팁을 따르면 데이터베이스의 안전성을 유지하면서 DELETE 문을 실행할 수 있습니다.
요약
본 기사에서는 SQL에서 JOIN을 사용하여 여러 테이블을 결합하고 조건에 따라 데이터를 삭제하는 방법에 대해 설명했습니다. DELETE 문의 기본 구조부터 시작해 INNER JOIN 및 LEFT JOIN을 사용한 구체적인 예시, 그리고 안전하게 DELETE 문을 실행하는 팁까지 소개했습니다. 적절한 절차를 따르면 데이터의 일관성을 유지하면서 불필요한 데이터를 효율적으로 삭제할 수 있습니다. 이러한 방법과 주의점을 활용하여 안전하고 효과적인 데이터베이스 관리를 수행하시기 바랍니다.