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
位置是首选位置。 不建议使用锁定子句之前的位置; 预计在未来版本的 MySQL 中将删除对此的支持。 换句话说,FROM
之后但不在 SELECT
末尾的 INTO
会产生警告。
不应在嵌套的 SELECT
中使用 INTO
子句,因为此类 SELECT
必须将其结果返回到外部上下文。 在 UNION
语句中使用 INTO
也存在限制;请参阅第 15.2.18 节,“UNION 子句”。
对于 INTO
变体var_list
var_list
命名一个或多个变量的列表,每个变量可以是用户定义的变量、存储过程或函数参数,或存储程序局部变量。 (在准备好的SELECT ... INTO
语句中,只允许使用用户定义的变量;请参阅第 15.6.4.2 节,“局部变量作用域和解析”。)var_list
选定的值将分配给变量。 变量的数量必须与列的数量相匹配。 查询应该返回一行。 如果查询没有返回任何行,则会出现错误代码为 1329 的警告(
无数据
),并且变量值保持不变。 如果查询返回多行,则会出现错误 1172(结果包含多行
)。 如果该语句可能会检索多行,则可以使用LIMIT 1
将结果集限制为一行。SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
INTO
也可以与 var_list
TABLE
语句一起使用,但需遵守以下限制
变量的数量必须与表中的列数相匹配。
如果表包含多行,则必须使用
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 '
形式的 file_name
'SELECT
将选定的行写入文件。 该文件是在服务器主机上创建的,因此您必须拥有 FILE
权限才能使用此语法。 file_name
不能是现有文件,这尤其可以防止修改 /etc/passwd
和数据库表等文件。 character_set_filesystem
系统变量控制文件名的解释。
SELECT ... INTO OUTFILE
语句旨在将表转储到服务器主机上的文本文件中。 若要在其他主机上创建结果文件,SELECT ... INTO OUTFILE
通常不适合,因为无法写入相对于服务器主机文件系统的文件路径,除非可以使用服务器主机文件系统上的网络映射路径访问远程主机上的文件位置。
或者,如果 MySQL 客户端软件安装在远程主机上,则可以使用客户端命令(例如 mysql -e "SELECT ..." >
)在该主机上生成文件。file_name
SELECT ... INTO OUTFILE
是 LOAD DATA
的补充。 列值在写入时会转换为 CHARACTER SET
子句中指定的字符集。 如果不存在此类子句,则使用 binary
字符集转储值。 实际上,没有字符集转换。 如果结果集包含多个字符集中的列,则输出数据文件也是如此,并且可能无法正确重新加载文件。
语句的 export_options
部分的语法由与 LOAD DATA
语句一起使用的相同的 FIELDS
和 LINES
子句组成。 有关 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
已转义,以便于使用某些分页器进行查看。
结果文件不需要符合 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
系统变量设置为非空目录名,则要写入的文件必须位于该目录中。
在作为事件调度程序执行的事件的一部分出现的 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
设置输出缓冲区大小和可选延迟。 有关更多信息,请参阅这些系统变量的说明。