MySQL에서 쿼리를 실행할 때 컬럼명이나 테이블명을 미리 정해두지 않고 상황에 따라 유동적으로 지정해야 하는 경우가 있습니다. 이럴 때 PREPARE 문과 EXECUTE 문을 함께 활용하면 동적으로 컬럼을 선택한 쿼리를 실행할 수 있습니다.
핵심 흐름은 다음과 같습니다. 먼저 실행하고자 하는 쿼리를 문자열 형태로 만들어 준비(prepare)한 뒤, 해당 prepared statement를 실행(execute)하는 순서입니다.
예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성하겠습니다.
mysql> create table DemoTable ( EmployeeName varchar(100) ); Query OK, 0 rows affected (0.77 sec)
샘플 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values('John Doe');
Query OK, 1 row affected (0.18 sec)SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select * from DemoTable;
실행 결과는 아래와 같습니다.
+--------------+ | EmployeeName | +--------------+ | John Doe | +--------------+ 1 row in set (0.00 sec)
동적으로 컬럼 선택하기
1단계: 동적 쿼리 문자열 만들기
CONCAT 함수를 사용해 SELECT 문을 문자열로 조합한 후, 사용자 변수(@dynamicQuery)에 저장합니다.
mysql> set @dynamicQuery=CONCAT("SELECT ", (SELECT "EmployeeName from DemoTable"));
Query OK, 0 rows affected (0.00 sec)
mysql> select @dynamicQuery;
+---------------------------------------+
| @dynamicQuery |
+---------------------------------------+
| SELECT EmployeeName from DemoTable |
+---------------------------------------+
1 row in set (0.00 sec)변수에는 완성된 형태의 쿼리인 'SELECT EmployeeName from DemoTable'이 담긴 것을 확인할 수 있습니다.
2단계: PREPARE 문으로 쿼리 준비하기
mysql> prepare myStatement from @dynamicQuery; Query OK, 0 rows affected (0.00 sec) Statement prepared
3단계: EXECUTE 문으로 쿼리 실행하기
mysql> execute myStatement;
실행 결과는 아래와 같습니다.
+--------------+ | EmployeeName | +--------------+ | John Doe | +--------------+ 1 row in set (0.00 sec)
정리 및 추가 팁
이처럼 MySQL에서는 CONCAT으로 쿼리 문자열을 동적으로 구성하고, PREPARE → EXECUTE 순서로 처리하면 컬럼이나 테이블명을 런타임에 결정할 수 있습니다. 저장 프로시저 내부에서 검색 조건에 따라 조회 대상 컬럼을 바꿔야 할 때 특히 유용합니다.
참고로, 더 이상 필요 없는 prepared statement는 DEALLOCATE PREPARE myStatement;로 명시적으로 해제해 주면 세션 리소스를 깔끔하게 관리할 수 있습니다.