개요
쿼리에 사용할 열 이름을 동적으로 생성해야 하는 경우, SET 명령과 사용자 정의 변수(user-defined variable)를 함께 활용하면 됩니다. 이 기법은 INFORMATION_SCHEMA에서 테이블의 열 정보를 읽어온 뒤, CONCAT과 GROUP_CONCAT으로 SELECT 문 전체를 문자열로 조립하고, PREPARE와 EXECUTE로 동적으로 실행하는 방식입니다.
기본 문법
먼저 SET 명령으로 사용자 정의 변수에 원하는 쿼리 문자열을 담습니다. 문법은 다음과 같습니다.
SET @anyVariableName :=
(
SELECT CONCAT
(
"SELECT",
GROUP_CONCAT(CONCAT("\n 1 as ", COLUMN_NAME) SEPARATOR ','), "\n FROM DUAL")
FROM information_schema.columns
WHERE TABLE_NAME = 'yourTableName'
);
다음으로 PREPARE 명령을 사용해 해당 변수를 실행 가능한 준비된 문장(prepared statement)으로 만듭니다.
PREPARE anyVariableName FROM @anyVariableName;
준비된 문장은 EXECUTE 명령으로 실행할 수 있습니다.
EXECUTE anyVariableName;
사용이 끝나면 반드시 DEALLOCATE 명령으로 준비된 문장을 해제하여 세션 리소스를 정리해야 합니다.
DEALLOCATE PREPARE anyVariableName;
실습 예제
이제 실제로 두 개의 열을 가진 테이블을 생성한 뒤, 해당 열 이름들을 CONCAT 쿼리에 활용해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> CREATE TABLE ConcatenationWithUserDefinedVariable
-> (
-> Id INT NOT NULL AUTO_INCREMENT,
-> User_Id INT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.14 sec)
앞서 설명한 문법을 그대로 적용하여, 대상 테이블의 열 이름을 포함한 쿼리 문자열을 사용자 정의 변수에 저장합니다.
mysql> SET @q := (
-> SELECT CONCAT(
-> "SELECT",
-> GROUP_CONCAT(CONCAT("\n 1 as ", column_name) SEPARATOR ','),
-> "\nFROM DUAL")
-> FROM information_schema.columns
-> WHERE table_name = 'ConcatenationWithUserDefinedVariable');
Query OK, 0 rows affected (0.01 sec)
생성된 사용자 정의 변수 @q를 PREPARE 명령으로 준비합니다.
mysql> PREPARE stmt FROM @q;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
이제 준비된 문장을 EXECUTE 명령으로 실행합니다.
mysql> EXECUTE stmt;
실행 결과는 다음과 같습니다. 테이블의 각 열(Id, User_Id)이 값 1을 가진 열로 출력되는 것을 확인할 수 있습니다.
+----+---------+
| Id | User_Id |
+----+---------+
| 1 | 1 |
+----+---------+
1 row in set (0.00 sec)
마지막으로 준비된 문장을 DEALLOCATE로 해제하여 마무리합니다.
mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
정리
이 방식의 핵심은 INFORMATION_SCHEMA.COLUMNS 뷰에서 특정 테이블의 모든 열 이름을 조회한 후, GROUP_CONCAT으로 각 열을 "1 AS 열이름" 형태의 문자열로 연결하고, 여기에 SELECT와 FROM 절을 덧붙여 완전한 SQL 문을 만드는 것입니다. 완성된 문자열은 PREPARE → EXECUTE → DEALLOCATE 순서로 처리하면 되며, 이를 통해 스키마가 변경되어도 열 목록을 자동으로 반영하는 유연한 동적 쿼리를 구성할 수 있습니다.