Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 레코드를 정렬한 후 N개 행 삭제하는 방법

MySQL에서는 DELETE 문에 ORDER BY 절과 LIMIT 절을 함께 사용하여 특정 기준으로 레코드를 정렬한 뒤, 원하는 개수(N개)의 행만 삭제할 수 있습니다. 이 방법은 예를 들어 이름순으로 가장 앞선 데이터 몇 개를 제거하거나, 오래된 로그를 일괄 삭제할 때 유용하게 활용됩니다.

1. 테이블 생성하기

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName varchar(20)
-> );
Query OK, 0 rows affected (0.65 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용해 테이블에 여러 개의 레코드를 추가합니다.

mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Adam');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(FirstName) values('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(FirstName) values('Sam');
Query OK, 1 row affected (0.13 sec)

3. 전체 레코드 조회하기

SELECT 문을 사용해 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | Chris |
| 2 | Adam |
| 3 | John |
| 4 | David |
| 5 | Mike |
| 6 | Carol |
| 7 | Sam |
+----+-----------+
7 rows in set (0.00 sec)

4. 정렬 후 N개 행 삭제하기

다음은 ORDER BYLIMIT을 활용해 FirstName 기준 오름차순으로 정렬한 뒤, 상위 4개 행을 삭제하는 쿼리입니다.

mysql> delete from DemoTable order by FirstName asc limit 4;
Query OK, 4 rows affected (0.19 sec)

이 쿼리가 실행되면 FirstName이 알파벳 순서로 가장 빠른 'Adam', 'Carol', 'Chris', 'David' 네 개의 레코드가 삭제됩니다.

5. 삭제 결과 확인하기

테이블의 레코드를 다시 한번 조회해 삭제가 정상적으로 적용되었는지 확인합니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+----+-----------+
| Id | FirstName |
+----+-----------+
| 3 | John |
| 5 | Mike |
| 7 | Sam |
+----+-----------+
3 rows in set (0.00 sec)

핵심 정리

DELETE FROM 테이블명 ORDER BY 컬럼명 ASC/DESC LIMIT N; 형식으로 작성하면 지정한 컬럼 기준으로 정렬된 순서대로 N개의 행을 삭제할 수 있습니다. 단, 이 구문은 MySQL에서만 지원되며, PostgreSQL 등 다른 DBMS에서는 서브쿼리를 활용하는 별도의 방법이 필요합니다. 또한 중요한 데이터를 다룰 때는 삭제 전 반드시 백업을 수행하고, SELECT로 대상 레코드를 먼저 확인한 후 삭제하는 것이 안전합니다.