CSV 파일로 데이터를 내보낼 때 첫 번째 줄에 열 이름(헤더)을 포함하려면 UNION 문을 활용해야 합니다. MySQL의 INTO OUTFILE 구문 자체에는 헤더를 추가하는 기능이 없기 때문에, 열 이름을 문자열로 반환하는 SELECT 문과 실제 데이터를 조회하는 SELECT 문을 UNION으로 결합하는 방식을 사용합니다. 아래 예제를 통해 그 과정을 살펴보겠습니다.
예제
다음 예제에서는 student_info 테이블의 데이터를 CSV 파일로 내보냅니다. 이때 생성되는 CSV 파일의 첫 번째 줄에는 각 열의 이름(id, Name, Address, Subject)이 헤더로 표시됩니다.
mysql> (SELECT 'id', 'Name', 'Address', 'Subject') UNION (SELECT id, Name, Address, Subject FROM student_info INTO OUTFILE 'C:/mysql/bin/mysql-files/student_25.CSV' FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"' LINES TERMINATED BY '\r\n'); Query OK, 7 rows affected (0.04 sec)
위 쿼리를 실행하면 MySQL은 Student_25.CSV 파일을 생성하며, 파일의 내용은 다음과 같습니다.
id; "Name"; "Address"; "Subject" 101; "YashPal"; "Amritsar"; "History" 105; "Gaurav"; "Chandigarh"; "Literature" 125; "Raman"; "Shimla"; "Computers" 130; "Ram"; "Jhansi"; "Computers" 132; "Shyam"; "Chandigarh"; "Economics" 133; "Mohan"; "Delhi"; "Computers"
쿼리 동작 원리
- 첫 번째 SELECT 문: 'id', 'Name', 'Address', 'Subject'라는 문자열 값을 반환하여 CSV 파일의 헤더 행 역할을 합니다.
- 두 번째 SELECT 문: student_info 테이블에서 실제 데이터를 조회합니다.
- UNION: 두 결과 집합을 하나로 결합하여 헤더가 데이터보다 먼저 출력되도록 만듭니다.
- INTO OUTFILE 옵션: FIELDS ENCLOSED BY는 각 필드를 큰따옴표(")로 묶고, TERMINATED BY는 필드 구분자를 세미콜론(;)으로 지정하며, LINES TERMINATED BY는 각 레코드를 \r\n(캐리지 리턴 + 줄 바꿈)으로 구분합니다.
이처럼 UNION 문을 활용하면 별도의 후처리 작업 없이도 헤더가 포함된 CSV 파일을 손쉽게 생성할 수 있습니다.