源自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. hive 调优(一)coding调优

    本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是 ...

  2. FOFA 批量采集url 图形化界面编写

    这是脚本 # coding:utf- import requests,re import time import sys import getopt import base64 guizhe='' s ...

  3. SpringBoot使用Undertow做服务器

    说明 undertow,jetty和tomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验.然而:当下微服务兴 ...

  4. python中的匿名函数

    python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda的主体是一 ...

  5. APP相关测试工具

    名称 描述   性能检测工具 用于对插件CPU.内存.闪退进行测试   接口测试工具 用于对插件本版本内的接口进行上线前的结构检测 自动比对差异   monkey测试工具 对主软件进行稳定性测试   ...

  6. 国内it论坛

    社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流. 技术社区一般有三 ...

  7. kubernets部署sock-shop微服务电商平台(11)

    一.准备条件 确保kubernetes可以访问:reg.yunwei.edu镜像库(vim /etc/hosts)   需要准备镜像:   [root@cicd sock-shop]# cat com ...

  8. failOnMissingWebXml

    使用maven创建项目时有时在pom.xml的war处出现failOnMissingWebXml的错误,根据错误提示的原因可以知道项目是web项目,打包时打成war包. 如果项目里没有web.xml, ...

  9. python中Requests的重试机制

    requests原生支持 import requests from requests.adapters import HTTPAdapter s = requests.Session() # 重试次数 ...

  10. cvpr2015papers

    @http://www-cs-faculty.stanford.edu/people/karpathy/cvpr2015papers/ CVPR 2015 papers (in nicer forma ...