首页 > 数据库 >mysql -- 保存查询结果和加载数据

mysql -- 保存查询结果和加载数据

时间:2023-05-02 18:33:14浏览次数:32  
标签:terminated -- employees mysql 子句 select 加载

可以使用select into outfile语句将输出保存到文件中。可以指定列和行分割符,然后可以将数据导入其他数据平台。

保存查询结果

可以将输出目标另存为文件或表。

1.另存为文件

​ 要将输出结果保存到文件中,需要拥有file权限。 FILE是一个全局特权, 这意味着你不能将其限制为针对特定数据库的权限。但是,你可以限制用户查询的内容:

> create user if not exists 'mary'@'%' identified with mysql_native_password by 'Com.123456';
> grant select on employees.* to 'mary'@'%';
> grant file on *.* to 'mary'@'%';

​ 在Ubuntu系统中,默认情况下,MySQL不允许写入文件。应该在配置文件中设置secure_file_priv 并重新启动MySQL;在CentOS. Red Hat系统中,secure_ file_ priv被设置为/var/lib/mysql-files,意味着所有文件都将被保存在该目录中。

> show variables like '%secure%';

# 如需修改配置文件,可以像这样设置,需重启MySQL服务器
$ secure_file_priv = /var/lib/mysql 
  • 在CentOS上可以执行以下语句保存结果,保存文件为.csv格式
# SELECT INTO…OUTFILE语法:
# select * from Table into outfile '/路径/文件名'
# fields terminated by ','
# enclosed by '"'
# lines terminated by '\r\n'

# ●  在FIELDS子句中有三个亚子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。如果指定了FIELDS子句,则这三个亚子句中至少要指定一个。

# (1)TERMINATED BY用来指定字段值之间的符号,例如,“TERMINATED BY ','”指定了逗号作为两个字段值之间的标志。

# (2)ENCLOSED BY子句用来指定包裹文件中字符值的符号,例如,“ENCLOSED BY ' " '”表示文件中字符值放在双引号之间,若加上关键字OPTIONALLY表示所有的值都放在双引号之间。

# (3)ESCAPED BY子句用来指定转义字符,例如,“ESCAPED BY '*'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。

# ●   LINES子句:在LINES子句中使用TERMINATED BY指定一行结束的标志,如“LINES TERMINATED BY '?'”表示一行以“?”作为结束标志。

#/var/lib/mysql-files/result.csv路径为secure_file_priv的值
> select first_name,last_name into outfile '/var/lib/mysql-files/result.csv' \
->  fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' \
-> from employees.employees where hire_date < '1986-01-01' limit 10;

# 查看保存结果
$ cat /var/lib/mysql/employees/result.csv
"Bezalel","Simmel"
"Sumant","Peac"
"Eberhardt","Terkki"
"Otmar","Herbst"
"Florian","Syrotiuk"
"Tse","Herber"
"Udi","Jansch"
"Reuven","Garigliano"
"Erez","Ritzmann"
"Premal","Baek"

2.另存为表

​ 也可以将select语句的结果保存到表中。即使表不存在,也可以使用CREATE和SELECT来创建表并加载数据。如果表已经存在,则可以使用INSERT和SELECT加载数据。

# 查看titles表中的数据 distinct [dɪˈstɪŋkt] 不同的
>  select distinct title from employees.titles;
+--------------------+
| title              |
+--------------------+
| Senior Engineer    |
| Staff              |
| Engineer           |
| Senior Staff       |
| Assistant Engineer |
| Technique Leader   |
| Manager            |
+--------------------+


# 可以将上面的结果保存为一个新的表titles_only中
> create table employees.titles_only as select distinct title from employees.titles;

# 如果表已经存在,则可以使用INSERT INTO SELECT语句:
> insert into employees.titles_only select distinct title from employees.titles;

​ 为了避免重复,可以使用INSERT IGNORE [ɪɡˈnɔːr] 。本例中,titles_only表中没有primary key,因此IGNORE子句不会造成任何影响。

加载数据到表中

​ 不仅可以将表数据保存到文件中,反过来操作也可以,即将文件中的数据加载到表中,这种方式广泛用于加载批量数据的情况,并且是将数据加载到表中的超快速方式。可以指定列分隔符将数据加载到相应的列中。需要拥有表的FILE权限和INSERT权限。

# 创建一个新表,如果表已经存在,则可以直接加载。
> create table employee_names (first_name varchar(14) not null, last_name varchar(16) not null);
# 查看表结构的详细信息
> desc employee_names;

# 使用LOAD DATA INFILE语句加载数据:
> load data infile '/var/lib/mysql-files/result.csv' into table employee_names \
	-> fields terminated by ',' \
	-> optionally enclosed by '"' \
	-> lines terminated by '\n';

> select * from employee_names;
+------------+------------+
| first_name | last_name  |
+------------+------------+
| Bezalel    | Simmel     |
| Sumant     | Peac       |
| Eberhardt  | Terkki     |
| Otmar      | Herbst     |
| Florian    | Syrotiuk   |
| Tse        | Herber     |
| Udi        | Jansch     |
| Reuven     | Garigliano |
| Erez       | Ritzmann   |
| Premal     | Baek       |
   mysql
+------------+------------+

# 如果文件开头包含一些你想忽略的行,可以使用IGNORE n Lines指定:
> load data infile '/result.csv' into table employee_names \
	-> fields terminated by ',' \
	-> optionally enclosed by '"' \
	-> lines terminated by '\n' \
	-> ignore 1 lines;

# 可以使用REPLACE [rɪˈpleɪs]或者IGNORE来处理重复的行:
> load data infile 'result.csv' REPLACE into table employee_names \
	-> fields terminated by ',' \
	->  optionally enclosed by '"' \
	-> lines terminated by '\n';
    
# 或者
> load data infile 'result.csv' IGNORE into table employee_names \
    -> fields terminated by ',' \
    -> optionally enclosed by '"' \
    -> lines terminated by '\n';

标签:terminated,--,employees,mysql,子句,select,加载
From: https://www.cnblogs.com/paopaoT/p/17368029.html

相关文章

  • 传统电力能源行业项目分析
    友商一览:友商一:而对企业文化:发电和煤矿:电网企业究竟是谁?1.发电行业中国华电福新能源股份有限公司中国华电金山能源股份有限公司中国华电煤业集团中国华电榆横煤电有限公司中国华电安徽宿州发电有限公司中国华电杨凌热电公司中国华电漯河发电公司中国华电卓资热电有限公司中国华电芜......
  • 三、JVM-运行时数据区概述及线程(基础篇)
    一、前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载->链接(验证->准备->解析->)->初始化这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后......
  • 什么是部署
    1.什么是部署所谓部署,就是让开发出的产品能够在某一环境中运行起来;部署会将源代码生成可运行的软件包,通过配置使软件包在目标环境上也能正常工作。常见例子:一般来讲,产品正式发布之前,都会在测试环境部署进行功能测试。2.部署具体做了什么事情2.1.准备好静态页面首先要写好前端......
  • u8g2 ssd1306 长条OLED的高清大logo绘制程序drawLogo
    这段代码有什么用?一般来讲,移植后只要能显示任何指定的字符就行了打点画线都可以我一般选择显示U8G2的logo如图  代码voiddrawLogo12832(u8g2_t*u8g2){u8g2_SetFontMode(u8g2,1);/*字体模式选择*/u8g2_SetFontDirection(u8g2,0);/*字体方向选择*/......
  • k8s DCGM GPU采集指标项说明
    dcgm-exporter采集指标项指标解释dcgm_fan_speed_percentGPU风扇转速占比(%)dcgm_sm_clockGPUsm时钟(MHz)dcgm_memory_clockGPU内存时钟(MHz)dcgm_gpu_tempGPU运行的温度(℃)dcgm_power_usageGPU的功率(w)dcgm_pcie_tx_throughputGPUPCIeTX传......
  • SQLite3数据库的介绍和使用(面向业务编程-数据库)
    SQLite3数据库的介绍和使用(面向业务编程-数据库)SQLite3介绍SQLite是一种用C语言实现的的SQL数据库它的特点有:轻量级、快速、独立、高可靠性、跨平台它广泛应用在全世界范围内的手机电脑应用的内建数据库官网地址:https://www.sqlite.org/index.htmlSQLite因为其采用文件存储......
  • 2023.4.28《人月神话》读后感
    第二章 人月神话1.缺乏合理的时间进度控制是造成滞后的主要原因,比其他任何事情影响的和还大;2.好的东西需要一些时间来沉淀;3.似乎所有的程序员都是“乐观主义者”;4.期待不会有困难;5.本身构思是有BUG的;6.围绕成本核算的估计技术,混淆了工作量和项目进展;7.若干人员中分解任务会引发......
  • NC20279 [SCOI2010]序列操作
    题目链接题目题目描述lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:0ab把[a,b]区间内的所有数全变成01ab把[a,b]区间内的所有数全变成12ab把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,......
  • Docker 构建 elasticsearch + kibana
    elasticsearch环境准备修改系统配置cat>>/etc/sysctl.conf<<-'EOF'net.ipv4.ip_forward=1vm.max_map_count=655360EOF重新加载配置sysctl-p&&systemctlrestartnetwork下载ik分词器本次部署使用的是7.10.1版本,可在此处直接下载,其它版本请在github自行下载。将......
  • 线段树合并/分裂
    你说的对,但是你理应会动态开点线段树是什么东西。合并很简单,两棵线段树一块搜,然后逐个节点合并。分裂的话可以按照FHQTreap的方法。假如我们将前\(k\)小和后边分开成\(x,y\),首先看左子树,如果比\(k\)大那右子树给\(y\),递归左子树,反之左子树给\(x\),递归右子树。真没啥......