Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  SELECT ... INTO Statement

15.2.13.1 SELECT ... INTO 语句

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 中将删除对其的支持。换言之,INTOFROM 之后但不是在 SELECT 语句的末尾将生成警告。

不应在嵌套的 SELECT 语句中使用 INTO 子句,因为该 SELECT 语句必须将结果返回到外部上下文。此外,还有对 INTOUNION 语句中的使用限制;见 第 15.2.18 节,“UNION 子句”

对于 INTO var_list 变体:

  • var_list 命名一个或多个变量,每个变量可以是用户定义的变量、存储过程或函数参数或存储程序局部变量。(在准备好的 SELECT ... INTO var_list 语句中,只允许用户定义的变量;见 第 15.6.4.2 节,“局部变量作用域和解析”。)

  • 选择的值将被分配给变量。变量的数量必须与列的数量匹配。查询应该返回单行。如果查询不返回行,错误代码 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 OUTFILELOAD DATA 的补充。 列值将被转换为指定的字符集。 如果没有指定字符集,值将使用 binary 字符集转储。 实际上,没有字符集转换。 如果结果集包含多个字符集的列,那么输出数据文件也将包含多个字符集,可能无法正确重新加载文件。

语句的 export_options 部分的语法与 LOAD DATA 语句相同。 有关 FIELDSLINES 子句的信息,包括默认值和允许的值,请参阅 第 15.2.9 节,“LOAD DATA 语句”

FIELDS ESCAPED BY 控制如何写入特殊字符。 如果 FIELDS ESCAPED BY 字符不为空,则在输出时使用该字符来避免歧义:

  • FIELDS ESCAPED BY 字符

  • FIELDS [OPTIONALLY] ENCLOSED BY 字符

  • FIELDS TERMINATED BYLINES TERMINATED BY 值的第一个字符

  • ASCII NUL(零值字节;实际写入的内容是 ASCII 0,而不是零值字节)

FIELDS TERMINATED BYENCLOSED BYESCAPED BYLINES TERMINATED BY 字符 必须 被转义,以便可以可靠地读回文件。 ASCII NUL 被转义以便使用某些 pager 查看。

结果文件不需要遵守 SQL 语法,因此不需要转义其他内容。

如果 FIELDS ESCAPED BY 字符为空,则不转义任何字符,并将 NULL 输出为 NULL,而不是 \N。 指定空转义字符可能不是一个好主意,特别是如果您的数据包含上述列表中的任何字符。

INTO OUTFILE 也可以与 TABLE 语句一起使用,以将表的所有列转储到文本文件中。 在这种情况下,可以使用 ORDER BYLIMIT 控制行的顺序和数量;这些子句必须在 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 table_alias [LIMIT 1] 一起使用。请参阅 第 15.2.19 节,“VALUES 语句”

Note

INTO OUTFILEINTO DUMPFILE 创建的任何文件都归操作系统用户所有,该用户账户下运行 mysqld。(您不应该以 root 身份运行 mysqld,因为这个原因和其他原因。)文件创建的 umask 为 0640;您必须拥有足够的访问权限来操作文件内容。

如果 secure_file_priv 系统变量设置为非空目录名,则要写入的文件必须位于该目录中。

在 Event Scheduler 执行的事件中,SELECT ... INTO 语句的诊断消息(不仅是错误,还包括警告)将写入错误日志,并在 Windows 上写入应用程序事件日志。有关更多信息,请参阅 第 27.4.5 节,“事件计划器状态”

支持周期性同步由 SELECT INTO OUTFILESELECT INTO DUMPFILE 写入的输出文件,通过设置 select_into_disk_sync 服务器系统变量启用。输出缓冲区大小和可选延迟可以分别使用 select_into_buffer_sizeselect_into_disk_sync_delay 设置。有关更多信息,请参阅这些系统变量的描述。