首批通过分布式安全可靠测评,为关键业务系统打造
SELECT INTO
更新时间:2026-07-15 20:56:55
描述
该语句用于将查询结果存储在变量或文件中。其中:
SELECT ... INTO OUTFILE用于将结果集存储在外部文件,并可以指定输出格式。说明
SELECT ... INTO OUTFILE输出数据时支持使用\N代表NULL。SELECT ... INTO DUMPFILE用于向外部文件写入不带格式的单行。SELECT ... INTO var_list用于将结果集存储到变量。
权限要求
执行 SELECT INTO 语句,需要拥有 FILE 权限和对应表的 SELECT 权限。有关 OceanBase 数据库权限的详细介绍,请参见 MySQL 模式下的权限分类。
示例如下:
要为用户授予 FILE 权限,可以使用以下命令格式:
GRANT FILE ON *.* TO user_name;
其中,user_name 是需要执行 SELECT INTO 命令的用户。
语法
select_stmt INTO
{OUTFILE 'file_name'
[{CHARSET | CHARACTER SET} charset_name]
[field_opt]
[line_opt]
| DUMPFILE 'file_name'
| into_var_list};
field_opt:
{COLUMNS | FIELDS} field_term_list
field_term_list:
field_term [, field_term ...]
field_term:
{[OPTIONALLY] ENCLOSED | TERMINATED | ESCAPED} BY string
line_opt:
LINES line_term_list
line_term_list:
line_term [line_term]
line_term:
{STARTING | TERMINATED} BY string
参数解释
| 参数 | 描述 |
|---|---|
| select_stmt | 指定要执行的查询语句。select_stmt 必须返回一个结果集,查询语句的具体结构和选项信息,参见 SELECT 语句。
说明
|
| file_name | 用于指定导出文件的路径和文件名。file_name 有以下格式:
说明由于阿里云 OSS 有文件大小的限制,对于超过 5 GB 的文件,导出到 OSS 时会被拆分成多个文件,每个文件小于 5 GB。 |
| CHARSET | CHARACTER SET charset_name | 可选项,指定导出到外部文件的字符集。charset_name 表示字符集的名称。 |
| field_opt | 可选项,导出字段格式选项。指定输出文件中各个字段的格式,通过 FIELDS 或 COLUMNS 子句来指定。详细介绍可参见下文 field_term。 |
| line_opt | 可选项,导出数据行的开始和结束符选项。指定输出文件中每一行的开始和结束字符,通过 LINES 子句设置。详细介绍可参见下文 line_term。 |
field_term
[OPTIONALLY] ENCLOSED BY string:用来指定包裹字段值的符号,默认没有引用符号。例如,ENCLOSED BY '"'表示字符值放在双引号之间。如果使用了OPTIONALLY关键字,则仅对字符串类型的值使用指定字符包裹。TERMINATED BY string:用来指定字段值之间的符号。例如,TERMINATED BY ','指定了逗号作为两个字段值之间的标志。ESCAPED BY string:用来指定转义字符,以便处理特殊字符或解析特殊格式的数据。默认的转义字符是反斜杠(\)。
line_term
STARTING BY string:指定每一行开始的字符,默认没有起始符号。TERMINATED BY string:指定每一行的结束字符,默认使用换行符。例如,... LINES TERMINATED BY '\n' ...表示一行将以换行符作为结束标志。
示例
导出数据文件到本地
设置导出的文件路径。
要导出文件,需要先设置系统变量
secure_file_priv,配置导出文件可以访问的路径。注意
由于安全原因,设置系统变量
secure_file_priv时,只能通过本地 Socket 连接数据库执行修改该全局变量的 SQL 语句。更多信息,参见secure_file_priv。登录到要连接 OceanBase 数据库的 OBServer 节点。
ssh admin@xxx.xxx.xxx.xxx执行以下命令,通过本地 Unix Socket 连接方式连接租户
mysql001。obclient -S /home/admin/oceanbase/run/sql.sock -uroot@mysql001 -p******设置导出路径为
/home/admin/test_data。SET GLOBAL secure_file_priv = "/home/admin/test_data";退出登录。
重新连接数据库后,使用
SELECT INTO OUTFILE语句导出数据。指定逗号作为两个字段值之间的标志;对字符串类型的值使用"字符包裹;使用换行符作为结束标志。指定文件名为test_tbl1.csv。SELECT /*+parallel(2)*/ * FROM test_tbl1 INTO OUTFILE '/home/admin/test_data/test_tbl1.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';返回结果如下:
Query OK, 9 rows affected
导出数据文件到 OSS
使用 SELECT INTO OUTFILE 语句从 test_tbl2 表中按分区导出数据到指定的 OSS 存储位置。分区依据是 col1 和 col2 列的组合,相同的行属于同一个分区,将导出到同一个目录中。
SELECT /*+parallel(3)*/ * FROM test_tbl2
INTO OUTFILE 'oss://$DATA_FOLDER_NAME/?host=$OSS_HOST&access_id=$OSS_ACCESS_ID&access_key=$OSS_ACCESS_KEY';
存储位置由 $DATA_FOLDER_NAME 变量指定,同时需要提供 OSS 的主机地址、访问 ID 和访问密钥。