13.2.9.1 SELECT ... INTO 구문
SELECT
의 SELECT ... INTO
형식을 사용하면 쿼리 결과를 변수에 저장하거나 파일에 기록 할 수 있습니다.
SELECT ... INTO
는 컬럼 값을 선택하고이를 변수에 저장합니다.var_list
SELECT ... INTO OUTFILE
은 선택된 행을 파일에 기록합니다. 컬럼 및 행 종결자를 지정하면 특정 출력 형식을 생성 할 수 있습니다.SELECT ... INTO DUMPFILE
은 단일 행을 파일 형식 설정없이 씁니다.
SELECT
구문의 설명 ( 섹션 13.2.9 "SELECT 구문" 을 참조하십시오)에서는 INTO
절이 문 끝 부분에 나와 있습니다. INTO
또한 select_expr
목록 바로 사용하실 수 있습니다.
중첩 된 SELECT
는 그 결과를 외부 컨텍스트에 반환해야하기 때문에 이러한 SELECT
는 INTO
절을 사용해서는 없습니다.
INTO
절은 하나 이상의 변수의 목록을 지정할 수 있습니다. 이 변수는 사용자 정의 변수 저장 프로 시저 또는 저장 함수의 매개 변수 또는 저장 프로그램의 로컬 변수를 지정할 수 있습니다. (준비된 SELECT ... INTO OUTFILE
문에서 사용자 정의 변수 만 허용됩니다. 섹션 13.6.4.2 "로컬 변수의 범위 해결" 을 참조하십시오.)
선택된 값은 변수에 할당됩니다. 변수의 수가 컬럼 수와 일치해야합니다. 쿼리는 단일 행을 반환합니다. 쿼리가 행을 반환하지 않으면 오류 코드 1329에서 경고가 발생 ( No data
) 변수 값은 변경되지 않은 상태입니다. 쿼리가 여러 행을 반환하는 경우 오류 1172가 발생합니다 ( 결과가 2줄 이상인 경우
). 이 문이 여러 행을 얻을 가능성이있는 경우에는 LIMIT 1
을 사용하여 결과 집합을 단일 행으로 제한 할 수 있습니다.
SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
사용자 변수 이름은 대소 문자를 구분하지 않습니다. 섹션 9.4 "사용자 정의 변수" 를 참조하십시오.
SELECT
의 SELECT ... INTO OUTFILE '
형식은 선택된 행을 파일에 기록합니다. 이 파일은 서버 호스트에서 생성되므로이 구문을 사용하려면 file_name
'FILE
권한이 필요합니다. file_name
을 기존 파일에 할 수 없습니다. 이는 특히 /etc/passwd
등의 파일이나 데이터베이스 테이블이 삭제 될 수 피할 수 있습니다. character_set_filesystem
시스템 변수는 파일 이름의 해석을 제어합니다.
SELECT ... INTO OUTFILE
문은 주로 테이블을 서버 컴퓨터의 텍스트 파일에 매우 빠르게 덤프 할 수있게하는 것을 목적으로하고 있습니다. 결과 파일을 서버 호스트가 아닌 호스트에서 만들 때 일반적으로 서버 호스트의 파일 시스템을 기준으로 한 파일 경로를 작성하는 방법이 존재하지 않기 때문에 SELECT ... INTO OUTFILE
사용 수 없습니다.
그러나 MySQL 클라이언트 소프트웨어가 원격 컴퓨터에 설치되어있는 경우, 대신 mysql -e "SELECT ..." >
등의 클라이언트 명령을 사용하여 클라이언트 호스트에 파일을 생성 할 수 있습니다. file_name
또한 서버의 파일 시스템에서 네트워크에 매핑 된 경로를 사용하여 원격 호스트의 파일 위치에 액세스 할 수있는 경우에도 결과 파일을 서버 호스트에서 다른 호스트로 만들 수 있습니다. 이 경우 대상 호스트에 mysql (또는 다른 어떤 MySQL 클라이언트 프로그램)이 존재할 필요는 없습니다.
SELECT ... INTO OUTFILE
는 LOAD DATA INFILE
을 보완하는 것입니다. 열 값 CHARACTER SET
절에서 지정된 문자 세트로 변환되어 기록됩니다. 이러한 조항이 존재하지 않는 경우, 값은 binary
문자 세트를 사용하여 덤프됩니다. 사실상 문자 세트 변환은 실행되지 않습니다. 결과 세트에 컬럼이 여러 문자 세트에 포함되어있는 경우, 출력 데이터 파일에 그대로 포함되므로 해당 파일을 제대로 장전하지 못할 수 있습니다.
이 문 export_options
부분의 구문은 LOAD DATA INFILE
문에서 사용되는 것과 같은 FIELDS
및 LINES
절로 구성되어 있습니다. FIELDS
및 LINES
절 (각각의 기본값과 허용되는 값 포함)은 섹션 13.2.6 "LOAD DATA INFILE 구문" 을 참조하십시오.
FIELDS ESCAPED BY
는 특수 문자를 작성하는 방법을 제어합니다. FIELDS ESCAPED BY
문자가 비어 있지 않은 경우, 그 문자는 출력에서 다음 문자 앞에 붙은 접두어로 모호성을 피하기 위해 필요한 경우에 사용됩니다.
FIELDS ESCAPED BY
문자FIELDS [OPTIONALLY] ENCLOSED BY
문자FIELDS TERMINATED BY
및LINES TERMINATED BY
값의 첫 번째 문자ASCII
NUL
(0 값의 바이트 이스케이프 문자 다음에 실제로 기록하는 문자는 0의 값의 바이트가 아닌 ASCII의 "0
"입니다)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
또는 LINES TERMINATED BY
문자는 그 파일을 확실히 읽어 되돌릴 수 있도록 탈출해야합니다. ASCII NUL
은 일부 호출기에서 쉽게 확인할 수 있도록 이스케이프됩니다.
결과 파일은 SQL 구문을 준수 할 필요가 없기 때문에 다른 아무것도 이스케이프 할 필요가 없습니다.
FIELDS ESCAPED BY
문자가 비어있는 경우 어떤 문자도 이스케이프되지 않고 NULL
은 \N
대신 NULL
로 출력됩니다. 특히 데이터의 필드 값에 지금 지정된 목록에서 하나의 문자가 포함되어 있으면 빈 이스케이프 문자를 지정하는 것은 아마 적절한 방법이 없습니다.
많은 프로그램에서 사용되는 쉼표로 구분 된 값 (CSV) 형식의 파일을 생성하는 예를 보여줍니다.
SELECT a, b, a + b INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ','OPTIONALLY ENCLOSED BY ' "' LINES TERMINATED BY '\ n' FROM test_table;
INTO OUTFILE
대신 INTO DUMPFILE
를 사용하면 MySQL은 이스케이프 처리를 실행하지 않고 열이나 행의 끝없는 행을 하나만 파일에 기록합니다. 이것은 파일에 BLOB
값을 저장하는 데 도움이됩니다.
INTO OUTFILE
또는 INTO DUMPFILE
에 의해 작성된 파일은 서버 호스트의 모든 사용자가 쓸 수 있습니다. 이것은 MySQL 서버가 그것을 실행하는 계정을 가진 사용자 이외의 어떤 사용자가 소유하는 파일도 만들 수 없기 때문입니다. (이러한 이유 때문에, mysqld를 root
로는 결코 실행하지 마십시오.) 따라서이 파일은 그 내용을 조작 할 수 있도록 모든 사용자가 쓸 수 있어야합니다.
secure_file_priv
시스템 변수가 비어 있지 않은 디렉토리 이름에 설정되어있는 경우 기록 된 파일은 해당 디렉토리에 존재해야합니다.
이벤트 스케줄러에 의해 실행되는 이벤트의 일부로 실행 된 SELECT ... INTO
문 맥락에서 진단 메시지 (오류뿐만 아니라 경고 포함)가 오류 로그에 (Windows에서 응용 프로그램 이벤트 로그에) 기록됩니다. 자세한 내용은 섹션 20.4.5 "이벤트 스케줄러 상태" 를 참조하십시오.