暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据操作语句(12)- SELECT 语句(2)

数据库杂货铺 2021-04-12
679
SELECT ... INTO 语句
 
SELECT 的 SELECT ... INTO 形式将查询结果存储在变量中或写入文件:
 
SELECT ... INTO var_list 选择列值并将它们存储到变量中。
 
SELECT ... INTO OUTFILE 将所选行写入文件。可以指定列和行终止符以生成特定的输出格式。
 
SELECT ... INTO DUMPFILE 在没有任何格式的情况下将单行写入文件。
 
给定的 SELECT 语句最多可以包含一个 INTO 子句,但如 SELECT 语法描述所示,INTO 可以出现在不同的位置:
 
●  FROM 之前。例如:
 
    SELECT * INTO @myvar FROM t1;
     
    ● 在后面的锁定子句之前。例子:
     
      SELECT * FROM t1 INTO @myvar FOR UPDATE;
       
      ●  SELECT 语句的最后。例如:
       
        SELECT * FROM t1 FOR UPDATE INTO @myvar;
         
        从 MySQL 8.0.20 开始支持在语句末尾使用 INTO,并且是首选位置。从 MySQL 8.0.20 开始,不推荐使用锁定子句之前使用 INTO,并且在将来的 MySQL 版本中将删除对它的支持。换句话说,INTO 用于 FROM 之后而不是在 SELECT 语句的末尾将生成一个警告。
         
        INTO 子句不应在嵌套的 SELECT 中使用,因为这样的 SELECT 必须将其结果返回到外部上下文。在 UNION 语句中使用 INTO 也有一些限制。
         
        对于INTO var_list 变量:
         
         var_list 列出一个或多个变量的列表,每个变量可以是用户定义的变量、存储过程或函数参数,或存储程序局部变量。(在预编译 SELECT ... INTO var_list 语句中,只允许使用用户定义的变量。)
         
        选定的值将分配给变量。变量数必须与列数匹配。查询应该返回一行。如果查询没有返回任何行,则会出现错误代码1329的警告(没有数据),变量值保持不变。如果查询返回多行,则出现错误1172(结果由多行组成)。如果语句可能检索到多行,则可以使用 LIMIT 1 将结果集限制为一行。
         
          SELECT iddata 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;
               
              用户变量名不区分大小写。
               
              SELECT 语句的 SELECT ... INTO OUTFILE 'file_name' 形式将所选行写入文件。文件是在服务器主机上创建的,因此必须具有 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 子句中指定的字符集。如果不存在这样的子句,则使用二进制字符集转储值。实际上,没有字符集转换。如果结果集包含多个字符集的列,则输出数据文件也将包含这些列,并且可能无法正确重新加载该文件。
               
              语句的 export_options 部分的语法同样也包含与 LOAD DATA 语句一起使用的 FIELDS LINES 子句。
               
              FIELDS ESCAPED BY 控制如何写入特殊字符。如果 FIELDS ESCAPED BY 字符不为空,则在必要时输出以下字符时作为前缀,以避免歧义:
               
              FIELDS ESCAPED BY 字符
               
              FIELDS [OPTIONALLY] ENCLOSED BY 字符
               
              FIELDS TERMINATED BY LINES TERMINATED BY 值的第一个字符
               
              ASCII NUL(零值字节;转义符后面实际写入的是ASCII 0,而不是零值字节)
               
              FIELDS TERMINATED BY、ENCLOSED BYESCAPED 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 OUTFILEMySQL 只向文件中写入一行,没有任何列或行终止,也不执行任何转义处理。这对于查询 BLOB 值并将其存储在文件中非常有用。
                     
                    TABLE 还支持 INTO DUMPFILE。如果表包含多行,则还必须使用 LIMIT 1 将输出限制为单行。INTO DUMPFILE 也可以与 SELECT * FROM (VALUES ROW()[, ...]) AS table_alias [LIMIT 1] 语句一起使用。
                     
                    注意
                     
                    INTO OUTFILE 或 INTO DUMPFILE 创建的任何文件都属于 mysqld 运行帐户下的操作系统用户。(由于这个和其他原因,不应该以 root 用户身份运行 mysqld。)从 MySQL 8.0.17 开始,用于文件创建的 umask 0640;必须有足够的访问权限来操作文件内容。在 MySQL 8.0.17 之前,umask 0666,服务器主机上的所有用户都可以写入该文件。
                     
                    如果 secure_file_priv 系统变量设置为非空目录名,则要写入的文件必须位于该目录中。
                     
                    在事件调度器执行的事件中,作为其中一部分的 SELECT ... INTO 语句上下文中,诊断消息(不仅包括错误,还包括警告)将写入错误日志,在 Windows 上写入应用程序事件日志。
                     
                    从 MySQL 8.0.22 开始,通过设置 select_into_disk_sync 服务器系统变量,支持定期同步由 SELECT INTO OUTFILE SELECT INTO DUMPFILE 写入的输出文件。通过设置 select_into_buffer_size 和  select_into_disk_sync_delay,可以设置输出缓冲区大小和延迟。
                     
                     
                     
                     
                     
                     
                     
                    官方网站:
                    https://dev.mysql.com/doc/refman/8.0/en/select-into.html
                    文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论