该 SELECT ... INTO
形式的 SELECT
可以将查询结果存储在变量中或写入文件:
-
SELECT ... INTO
选择列值并将其存储在变量中。var_list
-
SELECT ... INTO OUTFILE
将选定的行写入文件。可以指定列和行终止符以生成特定的输出格式。 -
SELECT ... INTO DUMPFILE
将单行写入文件,而不进行任何格式化。
给定的 SELECT
语句最多只能包含一个 INTO
子句,尽管如 SELECT
语法描述所示(见 第 15.2.13 节,“SELECT 语句”),INTO
可以出现在不同的位置:
-
在
FROM
之前。示例:SELECT * INTO @myvar FROM t1;
-
在尾随锁定子句之前。示例:
SELECT * FROM t1 INTO @myvar FOR UPDATE;
-
在
SELECT
语句的末尾。示例:SELECT * FROM t1 FOR UPDATE INTO @myvar;
语句末尾的 INTO
位置是首选位置。在锁定子句之前的 INTO
位置已弃用;预计在未来版本的 MySQL 中将删除对其的支持。换言之,INTO
在 FROM
之后但不是在 SELECT
语句的末尾将生成警告。
不应在嵌套的 SELECT
语句中使用 INTO
子句,因为该 SELECT
语句必须将结果返回到外部上下文。此外,还有对 INTO
在 UNION
语句中的使用限制;见 第 15.2.18 节,“UNION 子句”。
对于 INTO
变体:var_list
-
var_list
命名一个或多个变量,每个变量可以是用户定义的变量、存储过程或函数参数或存储程序局部变量。(在准备好的SELECT ... INTO
语句中,只允许用户定义的变量;见 第 15.6.4.2 节,“局部变量作用域和解析”。)var_list
-
选择的值将被分配给变量。变量的数量必须与列的数量匹配。查询应该返回单行。如果查询不返回行,错误代码 1329 将发生 (
No data
),变量值将保持不变。如果查询返回多行,错误 1172 将发生 (Result consisted of more than one row
)。如果可能查询将检索多行,可以使用LIMIT 1
限制结果集为单行。SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
INTO
也可以与 var_list
TABLE
语句一起使用,subject to these restrictions:
-
变量的数量必须与表中的列数量匹配。
-
如果表包含多行,您必须使用
LIMIT 1
限制结果集为单行。LIMIT 1
必须在INTO
关键字之前。
示例语句如下所示:
TABLE employees ORDER BY lname DESC LIMIT 1
INTO @id, @fname, @lname, @hired, @separated, @job_code, @store_id;
您也可以从生成单行的 VALUES
语句中选择值,并将其分配给用户变量。在这种情况下,您必须使用表别名,并将每个值从值列表分配给变量。每个语句都等同于 SET @x=2, @y=4, @z=8
:
SELECT * FROM (VALUES ROW(2,4,8)) AS t INTO @x,@y,@z;
SELECT * FROM (VALUES ROW(2,4,8)) AS t(a,b,c) INTO @x,@y,@z;
用户变量名称不区分大小写。见 第 11.4 节,“用户定义变量”。
该 SELECT ... INTO OUTFILE '
形式的 文件名
'SELECT
将所选行写入文件。 文件是在服务器主机上创建的,因此您必须拥有 FILE
权限以使用此语法。 文件名
不能是现有文件,这也防止了诸如 /etc/passwd
和数据库表被修改。 character_set_filesystem
系统变量控制文件名的解释。
该 SELECT ... INTO OUTFILE
语句旨在将表转储到服务器主机上的文本文件中。 要在其他主机上创建结果文件,SELECT ... INTO OUTFILE
通常不可行,因为无法写入相对于服务器主机文件系统的文件路径,除非远程主机上的文件位置可以使用服务器主机文件系统上的网络映射路径访问。
另外,如果 MySQL 客户端软件安装在远程主机上,可以使用客户端命令,如 mysql -e "SELECT ..." >
在该主机上生成文件。文件名
此外,SELECT ... INTO OUTFILE
是 LOAD DATA
的补充。 列值将被转换为指定的字符集。 如果没有指定字符集,值将使用 binary
字符集转储。 实际上,没有字符集转换。 如果结果集包含多个字符集的列,那么输出数据文件也将包含多个字符集,可能无法正确重新加载文件。
语句的 export_options
部分的语法与 LOAD DATA
语句相同。 有关 FIELDS
和 LINES
子句的信息,包括默认值和允许的值,请参阅 第 15.2.9 节,“LOAD DATA 语句”。
FIELDS ESCAPED BY
控制如何写入特殊字符。 如果 FIELDS ESCAPED BY
字符不为空,则在输出时使用该字符来避免歧义:
-
该
FIELDS ESCAPED BY
字符 -
该
FIELDS [OPTIONALLY] ENCLOSED BY
字符 -
该
FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一个字符 -
ASCII
NUL
(零值字节;实际写入的内容是 ASCII0
,而不是零值字节)
该 FIELDS TERMINATED BY
、ENCLOSED BY
、ESCAPED BY
或 LINES TERMINATED BY
字符 必须 被转义,以便可以可靠地读回文件。 ASCII NUL
被转义以便使用某些 pager 查看。
结果文件不需要遵守 SQL 语法,因此不需要转义其他内容。
如果 FIELDS ESCAPED BY
字符为空,则不转义任何字符,并将 NULL
输出为 NULL
,而不是 \N
。 指定空转义字符可能不是一个好主意,特别是如果您的数据包含上述列表中的任何字符。
INTO OUTFILE
也可以与 TABLE
语句一起使用,以将表的所有列转储到文本文件中。 在这种情况下,可以使用 ORDER BY
和 LIMIT
控制行的顺序和数量;这些子句必须在 INTO OUTFILE
之前。 TABLE ... INTO OUTFILE
支持与 SELECT ... INTO OUTFILE
相同的 export_options
,并且受相同的文件系统写入限制。 一个示例语句如下所示:
TABLE employees ORDER BY lname LIMIT 1000
INTO OUTFILE '/tmp/employee_data_1.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY '\'
LINES TERMINATED BY '\n';
您也可以使用 SELECT ... INTO OUTFILE
语句与 VALUES
语句来直接将值写入文件。下面是一个示例:
SELECT * FROM (VALUES ROW(1,2,3),ROW(4,5,6),ROW(7,8,9)) AS t
INTO OUTFILE '/tmp/select-values.txt';
您必须使用表别名;列别名也支持,并且可以选择性地使用它们来写入所需列的值。您还可以使用 SELECT ... INTO OUTFILE
支持的所有导出选项来格式化输出文件。
下面是一个生成逗号分隔值(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 DUMPFILE
而不是 INTO OUTFILE
,MySQL 将只写入文件的一行,不进行任何列或行终止符处理,也不执行任何转义处理。这对于选择 BLOB
值并将其存储在文件中非常有用。
TABLE
也支持 INTO DUMPFILE
。如果表包含多行,您必须还使用 LIMIT 1
限制输出到单行。INTO DUMPFILE
也可以与 SELECT * FROM (VALUES ROW()[, ...]) AS
一起使用。请参阅 第 15.2.19 节,“VALUES 语句”。table_alias
[LIMIT 1]
由 INTO OUTFILE
或 INTO DUMPFILE
创建的任何文件都归操作系统用户所有,该用户账户下运行 mysqld。(您不应该以 root
身份运行 mysqld,因为这个原因和其他原因。)文件创建的 umask 为 0640;您必须拥有足够的访问权限来操作文件内容。
如果 secure_file_priv
系统变量设置为非空目录名,则要写入的文件必须位于该目录中。
在 Event Scheduler 执行的事件中,SELECT ... INTO
语句的诊断消息(不仅是错误,还包括警告)将写入错误日志,并在 Windows 上写入应用程序事件日志。有关更多信息,请参阅 第 27.4.5 节,“事件计划器状态”。
支持周期性同步由 SELECT INTO OUTFILE
和 SELECT INTO DUMPFILE
写入的输出文件,通过设置 select_into_disk_sync
服务器系统变量启用。输出缓冲区大小和可选延迟可以分别使用 select_into_buffer_size
和 select_into_disk_sync_delay
设置。有关更多信息,请参阅这些系统变量的描述。