文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  SELECT ... INTO 语句

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 位置是首选位置。 不建议使用锁定子句之前的位置; 预计在未来版本的 MySQL 中将删除对此的支持。 换句话说,FROM 之后但不在 SELECT 末尾的 INTO 会产生警告。

不应在嵌套的 SELECT 中使用 INTO 子句,因为此类 SELECT 必须将其结果返回到外部上下文。 在 UNION 语句中使用 INTO 也存在限制;请参阅第 15.2.18 节,“UNION 子句”

对于 INTO var_list 变体

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

  • 选定的值将分配给变量。 变量的数量必须与列的数量相匹配。 查询应该返回一行。 如果查询没有返回任何行,则会出现错误代码为 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 OUTFILELOAD DATA 的补充。 列值在写入时会转换为 CHARACTER SET 子句中指定的字符集。 如果不存在此类子句,则使用 binary 字符集转储值。 实际上,没有字符集转换。 如果结果集包含多个字符集中的列,则输出数据文件也是如此,并且可能无法正确重新加载文件。

语句的 export_options 部分的语法由与 LOAD DATA 语句一起使用的相同的 FIELDSLINES 子句组成。 有关 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 已转义,以便于使用某些分页器进行查看。

结果文件不需要符合 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 OUTFILEVALUES 语句一起使用,将值直接写入文件。 示例如下所示

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 语句”

注意

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

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

在作为事件调度程序执行的事件的一部分出现的 SELECT ... INTO 语句的上下文中,诊断消息(不仅是错误,还包括警告)会写入错误日志,并在 Windows 上写入应用程序事件日志。 有关其他信息,请参阅第 27.4.5 节,“事件调度程序状态”

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