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

MySQL UPDATE 실행 중 SELECT 문 사용하는 방법 – 서브쿼리 활용 완벽 가이드

MySQL에서 UPDATE와 SELECT를 동시에 사용하는 방법

MySQL에서 UPDATE 문을 실행하면서 동시에 SELECT 문을 활용해야 하는 경우가 종종 있습니다. 예를 들어, 같은 테이블 내의 다른 행 값을 기준으로 특정 행을 수정하고 싶을 때가 그렇습니다. 이럴 때는 WHERE 절과 함께 서브쿼리(subquery)를 사용하면 됩니다.

다만 한 가지 주의할 점이 있습니다. MySQL에서는 UPDATE의 대상 테이블을 서브쿼리의 FROM 절에서 직접 참조할 수 없으며, 이 경우 오류 1093이 발생합니다. 따라서 서브쿼리를 한 번 더 감싸는 파생 테이블(derived table) 형태로 작성해야 정상적으로 실행됩니다.

1단계: 예제 테이블 생성

먼저 실습에 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.82 sec)

2단계: 데이터 삽입

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

mysql> insert into DemoTable values(100,'Chris');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(250,'David');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values(150,'Mike');
Query OK, 1 row affected (0.12 sec)

3단계: 전체 레코드 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+------+-------+
| Id | Name |
+------+-------+
| 100 | Chris |
| 250 | David |
| 150 | Mike |
+------+-------+
3 rows in set (0.00 sec)

4단계: UPDATE 실행 중 SELECT 문 사용하기

이제 업데이트 도중 SELECT 문을 활용하는 쿼리를 살펴보겠습니다. 아래 예제는 가장 큰 Id 값을 가진 행을 찾아 해당 행의 Name을 'Robert'로 변경합니다.

mysql> update DemoTable
-> set Name='Robert'
-> where Id in
-> (
-> select *from ( select max(Id) from DemoTable ) tbl1
-> );
Query OK, 1 row affected (0.27 sec)
Rows matched: 1 Changed: 1 Warnings: 0

여기서 핵심은 ( select max(Id) from DemoTable ) tbl1 부분입니다. 내부 서브쿼리를 별칭(tbl1)이 있는 파생 테이블로 감싸면 MySQL이 이를 임시 테이블로 처리하기 때문에, UPDATE 대상 테이블을 참조하면서도 오류 없이 쿼리를 실행할 수 있습니다.

5단계: 결과 확인

테이블의 레코드를 다시 한번 조회해 변경 사항을 확인해 보겠습니다.

mysql> select *from DemoTable;

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

+------+--------+
| Id | Name |
+------+--------+
| 100 | Chris |
| 250 | Robert |
| 150 | Mike |
+------+--------+
3 rows in set (0.00 sec)

Id가 250인 행의 Name이 'David'에서 'Robert'로 성공적으로 변경된 것을 확인할 수 있습니다. 이처럼 서브쿼리와 파생 테이블을 조합하면 UPDATE 문 안에서 SELECT 결과를 자유롭게 활용할 수 있습니다.