源自MySQL 5.7 官方手册 SELECT...INTO Syntax

一、SELECT...INTO介绍

  SELECT...INTO用来将查询结果存储在变量或者写入文件中。

SELECT
...
...
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]

  通常有以下三种用法:

  • SELECT...INTO var_list,将查询结果存储在变量中;
  • SELECT...INTO OUTFILE 将查询结果写入一个文件,还可以指定列和行终止符以生成特定的输出格式。
  • SELECT...INTO DUMPFILE 将单行数据写入文件,没有任何格式。

  在SELECT的语法展示中,INTO子句在整个语句的尾部。但是让INTO子句紧跟在select_expr列表后。

  一个INTO子句不应该在内嵌的SELECT中使用,因为这样一个SELECT必须将它的查询结果返回给外部上下文。

  1.1 结果写入变量

  NTO子句可以命名一个或多个变量的列表,这些变量可以是用户自定义的变量,存储过程或函数的参数,或存储的程序的局部变量。而对于预编译的SELECT...INTO OUTFILE,只允许使用用户自定义变量,see Section 13.6.4.2, “Local Variable Scope and Resolution”。

  select后选定的值将分配给into后的变量,变量的数量必须与列数相匹配。如果查询未返回任何行,则会出现错误代码为1329的警告(No Data),并且变量的值保持不变。如果查询返回多个行,报错error 1172:Rseult consisted of more than one row,当然可以使用LIMIT 1来解决这个问题。

  用户自定义的变量对大小写不敏感,See Section 9.4, “User-Defined Variables”。

  1.2 SELECT ... INTO OUTFILE

SELECT ... INTO OUTFILE 'file_name'

  文件会在服务器主机上创建,所以用户必须拥有FILE权限才能使用该语法。

  同时,file_name不能是一个已经存在的文件,它会防止诸如/etc/passwd和数据库表等文件被损毁。character_set_filesystem系统变量控制文件名的解释。

  SELECT ... INTO OUTFILE语句主要用于让您非常快速地将表转储到服务器计算机上的text文件中。如果要在服务器主机之外的其他主机上创建结果文件,通常无法使用SELECT ... INTO OUTFILE,因为无法写出该文件相对于那个服务器主机的文件系统的路径。(there is no way to write a path to the file relative to the server host's file system.)

  但是,如果远程计算机上安装了MySQL客户端软件,则可以使用客户端命令在客户端主机上生成该文件,如:

mysql -e “SELECT ...”> file_name

  如果可以使用服务器文件系统上的网络映射路径访问远程主机上文件的位置,也可以在服务器主机以外的其他主机上创建生成的文件。在这种情况下,目标主机上不需要存在mysql(或其他一些MySQL客户端程序)

  SELECT ... INTO OUTFILE是LOAD DATA的补充。将列值转换为CHARACTER SET子句中指定的字符集。如果不存在此子句,则使用binary字符集转储值。实际上,没有字符集转换。如果结果集包含多个字符集中的列,则输出数据文件也将如此,您可能无法正确重新加载文件。

  该语句的export_options部分的语法,与LOAD DATA语句使用相同FIELDS和LINES子句。See 有关FIELDS和LINES子句的信息,请参见Section 13.2.6, “LOAD DATA Syntax”,包括其默认值和允许值。

三。关于输出格式

  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 BY, ESCAPED BY, or LINES TERMINATED BY 字符必须进行转义操作,以便能可靠地读取文件。而为了更方便地用页面查看,ASCII NUL 也会被转义。

  生成的文件不必符合SQL语法,因此不需要转义任何其他内容。

  如果FIELDS ESCAPED BY字符为空,则不转义任何字符,并将NULL输出为NULL,而不是\N。

  指定一个空的转义字符并不是一个好主意,尤其是当数据中的字段值包含刚刚给出的列表中的任何字符。

  下面是一个以许多程序使用的逗号分隔值(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值存储在文件中,这非常有用。

NOTES:

  由INTO OUTFILE或INTO DUMPFILE创建的任何文件都可由服务器主机上的所有用户写入。原因是MySQL服务器无法创建一个这样的文件:该文件的拥有者不是它所运行账户下的用户。(出于这个原因和其他原因,你永远不应该以root身份运行mysqld)因此,文件必须是world-writable的,以便您可以操作其内容。如果secure_file_priv系统变量设置为非空目录名,则要写入的文件必须位于该目录中。

  最后,在作为事件调度程序执行的事件的一部分发生的SELECT ... INTO语句的上下文中,诊断消息(不仅是错误,还包括警告)被写入错误日志,并且在Windows上写入应用程序事件日志。see Section 23.4.5, “Event Scheduler Status”.

四、自己执行SELECT...INTO碰到的问题

  我把上面的SELECT...INTO语句修改了一下,执行自己的版本导出数据时遇到了错误。

  于是查看当前用户的权限:

  这块不太懂,搜索说需要"FILE"权限,我以为自己没有“FILE”权限(实际已经有了),于是想赋给当前用户这个权限:

  没什么影响,只是提一下这个过程。

  有了“FILE”权限,还是报错不能执行:

ERROR  (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

  涉及到secure_file_priv这个系统变量:

  根据前一章的提示,我只能把输出文件放到这个目录下。

  还有就是这个系统变量是只读的,无法直接通过SQL修改。具体的修改方法可以搜索。

  继续。

  现在有新的问题:

  查询结果显示,系统变量secure_file_priv=C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\

  Windows的文件管理器的地址栏现实的也是:C:\ProgramData\MySQL\MySQL Server 5.7\Uploads

  如下语句仍然不能执行:

SELECT * INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\sqltraining_stu.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM student; /* ERROR 1290 (HY000): The MySQL server is running with the
--secure-file-priv option so it cannot execute this statement */

  报错也没变,但现在只能是文件路径的格式问题了。修改路径分隔符,执行成功。

SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/sqltraining_stu.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM student; /* rows affected (0.00 sec) */

  

MySQL SELECT语法(二)SELECT...INTO语法的更多相关文章

  1. 语法:MySQL中INSERT INTO SELECT的使用(转)

    1. 语法介绍      有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (fi ...

  2. MySQL基本命令语法之select

    目录 MySQL基本命令语法之select 查询去重以及常数 空值与着重号 着重号 空值 运算符 算术运算符 比较运算符 符号型 非符号型 逻辑运算符 优先级 排序分页 排序 分页 拓展 多表查询 等 ...

  3. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  4. MySQL语法二:数据操纵语句

    数据操纵语句DML(SELECT,DELETE,UPDATE,INSERT) 一. 数据操纵语句是对数据表中的内容进行操作.比如对某个表中的某条记录或者多条记录进行增删改查操作. 一).查询 SELE ...

  5. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  6. update中加入select最常用的update语法

    update中加入select最常用的update语法 (转) (2010-08-20 11:40:16) 转载▼ 标签: it 分类: SQL 最常用的update语法是:UPDATE <ta ...

  7. MySQL语法大全_自己整理的学习笔记(MySQL语句 整理二)

    select * from emp; #注释 #--------------------------- #----命令行连接MySql--------- #启动mysql服务器 net start m ...

  8. 实验二 PHP基本语法实验

    实验二 PHP基本语法实验 0 实验准备 0.1实验环境和相关工具软件 具体到的机房环境,请在Windowsxp环境下做本实验: l  操作系统:Windowsxp l  Web服务器:Apache ...

  9. MySql数据库基本介绍和基本语法

    一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系统中,关系型数据库使用最为 ...

  10. MySQL的联结(Join)语法

    MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别:   在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如 ...

随机推荐

  1. Java安全(加密、摘要、签名、证书、SSL、HTTPS)

    对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统开发中遇到的各种安全相关的问题,熟悉和了解这些安全技术的基本原理和使用场景还是非常必要的.本文将对非对称加密.数字 ...

  2. 游览器中javascript的执行过程

    在讲这个问题之前,先来补充几个知识点,如果对此已经比较了解可以直接跳过 大多数游览器的组件构成如图 在最底层的三个组件分别是网络,UI后端和js解释器.作用如下: (1)网络- 用来完成网络调用,例如 ...

  3. C++公有继承,私有继承和保护继承的区别

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...

  4. Ubuntu下制作deb包的方法详解

    1  认识deb包 1.1   认识deb包 deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组. 由于 Unix ...

  5. python 简单了解一下 描述器

    1.描述器是什么? 在Python中描述器也被称为描述符, 1)描述器实际上是任何新式类(新式类是继承自 type 或者 object 的类),这种类至少实现了3个特殊的方法__get__, __se ...

  6. Web前端学习笔记——Canvas

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  7. Build Telemetry for Distributed Services之OpenTracing指导:C#

    官网链接:https://opentracing.io/guides/ 官方微博:https://medium.com/opentracing Welcome to the OpenTracing G ...

  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写

    public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化 ...

  9. Salesforce LWC学习(九) Quick Action in LWC

    我们在lightning开发中,quick action是一个常用的功能,很可惜的是,lwc目前还不支持单独的custom quick action操作,只能嵌套在aura中使用才能发挥作用. 官方也 ...

  10. python进阶--多线程多进程

    一.线程和进程 进程是拥有独立内存,能够独立运行的最小单位,也是程序执行的最小单位,线程是程序运行过程中,一个单一的顺序控制流程,是程序执行流的最小单位,一个进程至少包含一个线程,多线程共享进程的内存 ...