MySQL 将查询结果导出到文件(select … into Statement)
我们经常会遇到须要将SQL查询结果导出到文件,以便后续的传输或数据分析的场景。为了满足这个需求,MySQL的select语句提供了into子句可以将的查询结果直接导出到文本文件。本文就MySQL中select…into的用法举行演示。一、select…into语句简介
select…into语句不光仅可以大概将查询结果导出到csv文件,实际上它有3种用法:
[*]select … into @var_list from …. 将查询结果写入到一组变量
[*]select … into outfile from …. 将数据写入操纵体系文件,可以自界说数据格式(分隔符、包裹符、转义符、换行符等)。
[*]select … into dumpfile from …. 将单一行写入文件,没有任何格式化
1.1 根本语法
根据官方文档,into子句可以出现在以下3个位置。固然3个位置都符合语法,但select语句中至多只能有1个into语句(位置三选一):
[*]查询字段之后,from子句前
[*]锁定子句前(未来版本即将废弃)
[*]语句的末了
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMTE4NzMwYmUwY2YyNDgxYmEyZDc2Y2EzOWI2ODA2YjgucG5n
这里保举将into子句放在位置3,即语句的末了,如许相对平凡的select语句更为靠近,更容易明白,反面的示例也将接纳这种写法。
二、用法示例
下面演示into子句三种用法。
2.1 将查询结果生存到变量
into子句的一个常用场景就是将查询结果暂时生存到变量中,以便后续查询或利用,唯二要留意的点是变量的数目要和返回列数目匹配,而且最多只能返回一行数据。
以示例数据库employees中的employees表为例,查询3个结果,分别生存到3个变量中:
select emp_no,first_name,hire_date from employees limit 1 into @emp_no, @first_name, @hire_date;
select @emp_no, @first_name, @hire_date;
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZjJmZjAxOGQ1M2MwNGZkZGIwMzQxZDAzODQxYTg2MzEucG5n
这里用limit 1子句限定返回的结果只有1行,否则会报错。
2.2 将查询结果生存到文本文件
into outfile子句可以将查询结果导出到文本文件,固然并不愿定要是CSV格式,但大多数环境下我们都会选择这种格式。
要将MySQL中的数据写入到操纵体系的文件中, 起首须要具有FILE权限。而且为了安全须要设置参数secure_file_priv,这个参数是限定MySQL可以写入文件的目次:
show variables like 'secure_file_priv';
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYTliZWI2MGRhZjQ2NDRiYWJlYTJkNTljMTJlMTkyNjUucG5n
我们在平凡的select语句末了添加into outfile ‘/path/file_name’;即可将查询结果写入文件,这里的path就是参数secure_file_priv界说的目次(文件不能已存在):
select *from employees where emp_no<=10010 into outfile '/opt/mysql8.0.35/mysql-files/employees.txt';
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzAxMDQ3MGRhMzBkNGUwMGFjZTkyM2JhNjEzN2JiOTEucG5n
下面是导出文件内容,实在into outfile文件还隐式在反面附件了2个子句:
fields terminated by '\t' enclosed by '' escaped by '\\'
lines terminated by '\n' starting by ''
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZmRlZDJhNzYwYTNjNDlhYzhkMzU4NGZhMmM0YTM5ZGIucG5n
[*]fields 表现字段属性,terminated by ‘\t’ 以制表符分割字段,enclosed by ‘’ 不包裹字段,escaped by ‘\\’ 反斜线表现转义符(这里2个反斜线,第一个是转义符,第二个是反斜线)
[*]lines 表现行属性,terminated by ‘\n’ \n代表换行符,starting by ‘’ 行的出发点字符是空。
如果要导出CSV格式的文件,而且以双引号"包裹字段,那么只须要增长一个fields terminated by ‘,’ enclosed by '"'子句即可,其他的保持默认:
select *from employees where emp_no<=10010 into outfile '/opt/mysql8.0.35/mysql-files/employees.csv' fields terminated by ',' encolsed by '"';
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNTcxYzAzNTJjMWQ2NDAwZWIzMTE0MzczZDhhNzM1NGMucG5n
可以看到这次导出结果就是以逗号分割,以双引号包裹字段的数据:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNDgzM2ZiNzIyY2RjNDZlYzhjM2FjNmFhZTE4NGM1MDUucG5n
2.3 将查询结果生存到dumpfile
into dumpfile 子句可以将一行数据导出到文件,但是它不会做任何的分割,格式的界说,转义等操纵。相对应用场景较少,这个操纵通常用于将大型的BLOB字段生存到文件中,相识即可:
select *from employees limit 1 into dumpfile '/opt/mysql8.0.35/mysql-files/employees.dump';
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvN2YyZDIzMjY5ZWIzNGUyMGFiZjY2NWIzZDEyZTAwMjIucG5n
留意select语句只能返回一行结果,否则会报错。
导出的结果如下,可以看到数据没有任何分隔,都连在了一起,连换行都没有(提示符和数据表现在同一行):
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOTczOTlkZjAxNmYwNDUxNWIwYTQxMDVhMWJkMWEwYTEucG5n
页:
[1]