MySQL快速入门11----查询(3)

1 select- into outfile结果导出




导出结果到文件
mysql支持,将获得到的数据记录在文件内而不是返回到客户端。
常规的:文件内的每一行是一条数据,而每个字段之间使用水平制表符分隔。
导出的数据文件可以使用LOAD DATA INFILE语法载入到某个数据表内。
注意, 不允许向已经存在的文件内导出数据

在导出到文件的过程中,支持配置字段分隔符,包裹符,和转义符。和配置行(记录)结束符,和起始符
默认为:
字段:fields terminated by '\t' enclosed by '' escaped by '\\‘
记录:lines terminated by '\n' starting by ''
其他常用的是:字段使用逗号分割,而使用引号包裹
SELECT a,b,a+b INTO OUTFILE ‘file‘ 
FIELDS TERMINATED BY ',' ENCLOSED BY '"‘
LINES TERMINATED BY '\n‘
FROM test_table;

同时支持 into dumpfile,作用与outfile一致,不过是不做任何换行和转义处理。非常适合导出二进制数据。

mysql> select * into outfile "E:/outfile.txt" from one;
Query OK, 3 rows affected (0.00 sec)
将表one导出到E盘目录下的outfile.txt文件中,文件的中的内容如下:
可以看出,字段间用制表符(tab键)隔离,行之间用换行符隔离,这是MySQL中默认的行为;

增加过滤条件:
mysql> select * into outfile "E:/outfile2.txt" from teacher_class where id between 2 and 5;
Query OK, 4 rows affected (0.02 sec)
注意:导出的文件名不能重复!


为了满足某种特别的需求,会采用不同的分割方式。
支持,在导出数据时,设置记录,与字段的分割符。

通过如下的选项:
fields:设置字段选项
Lines: 设置行选项(记录选项)
先看默认值:
字段:
fields terminated by '\t' enclosed by '' escaped by '\\‘


记录:
lines terminated by '\n' starting by ''


mysql> select * into outfile "E:/outfile4.txt"  fields terminated by ',' lines starting by 'start: ' terminated by '===end;\n'from t
eacher_class where id between 2 and 5;
Query OK, 4 rows affected (0.00 sec)
如上所示:fields字段用逗号隔开,lines字段以‘’start:‘’开始,以'===end\n'结束。

mysql> select * into outfile "E:/outfile5.txt"  fields terminated by ',' enclosed by 'x' lines starting by 'start: ' terminated by '
===end;\n'from teacher_class where id between 2 and 5;
Query OK, 4 rows affected (0.02 sec)

每一个列用字符包裹起来。

保存二进制数据,不会发生转移和换行:
mysql> select * into dumpfile 'e:/outfile9.txt' from teacher_class where t_name = '韩信' limit 1



2 新增数据 insert & replace & loaddata


2.1 insert





创建表test_1:
mysql> drop table if exists test_1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table if not exists test_1(
    -> id int primary key auto_increment,
    -> name char(20),
    -> sex enum('male', 'female', 'secret')
    -> )character set utf8;
Query OK, 0 rows affected (0.08 sec)

表中的数据类型:
mysql> desc test_1;
+-------+--------------------------------+------+-----+---------+----------------+
| Field | Type                           | Null | Key | Default | Extra          |
+-------+--------------------------------+------+-----+---------+----------------+
| id    | int(11)                        | NO   | PRI | NULL    | auto_increment |
| name  | char(20)                       | YES  |     | NULL    |                |
| sex   | enum('male','female','secret') | YES  |     | NULL    |                |
+-------+--------------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)


Insert 的几种常见用法:

方式一:

可以 省略对列的指定,要求 value() 括号内,提供给了 按照列顺序出现的所有字段的值。
可以一次性使用多个值,采用(), (), ();的形式。
Insert into tbl_name values (), (), ();
mysql> insert into test_1 values
    -> (null, 'Apple', 1),
    -> (null, 'Lin', 2);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Lin   | female |
+----+-------+--------+
2 rows in set (0.00 sec)

方式二

或者使用set语法。
Insert into tbl_name set field=value,…;

如下所示:
mysql> insert into test_1 set name = 'Qian',sex = 3;
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Lin   | female |
|  3 | Qian  | secret |
+----+-------+--------+
3 rows in set (0.00 sec)

方式三

可以在列值指定时,使用表达式。
Insert into tbl_name values (field_value, 10+10, now());

方式四


可以使用一个特殊值 default,表示该列使用默认值。
Insert into tbl_name values (field_value, default);

表test_1没有设置默认值,这里就不做展示了,应该时如下的形式;
insert into teacher values
(13, 'xxx', 'yyy', default),//前提是该变量类型设置了default
(14, 'xxx', 'yyy', default(days))//得到字段的默认值

方式五

可以通过一个查询的结果,作为需要插入的值。
Insert into tbl_name select …;

如下所示:
mysql> insert into test_1 (name, sex) select name, sex from test_1;
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Lin   | female |
|  3 | Qian  | secret |
|  4 | Apple | male   |
|  5 | Lin   | female |
|  6 | Qian  | secret |
+----+-------+--------+
6 rows in set (0.01 sec)
注意:test_1中id被设为了主键,如果全部插入test_1中的值的话会造成主键冲突!

方式六

可以指定在插入的值出现主键(或唯一索引)冲突时,更新其他非主键列的信息。
Insert into tbl_name 值 on duplicate key update 字段=值, …;

如下所示(如果直接插入和已有主键冲突的值的话,插入不成功),此时插入的2和已有的主键冲突,将name和sex更新:
mysql> insert into test_1 values (2, 'Blue', 2) on duplicate key update name = 'Blue', sex = 2;
Query OK, 2 rows affected (0.08 sec)

数据展示:
mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Blue  | female |
|  3 | Qian  | secret |
|  4 | Apple | male   |
|  5 | Lin   | female |
|  6 | Qian  | secret |
+----+-------+--------+
6 rows in set (0.00 sec)
Into 可以省略。不建议。


2.2 replace


Replace REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。(替换原有记录)

主键或唯一索引冲突,则替换,否则插入。

此时表test_1中的数据:
mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Blue  | female |
|  3 | Qian  | secret |
|  4 | Apple | male   |
|  5 | Lin   | female |
|  6 | Qian  | secret |
+----+-------+--------+
6 rows in set (0.00 sec)

通过replace向表中插入数据:
mysql> replace into test_1 values(2, 'Green', 1);
Query OK, 2 rows affected (0.03 sec)

mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Green | male   |
|  3 | Qian  | secret |
|  4 | Apple | male   |
|  5 | Lin   | female |
|  6 | Qian  | secret |
+----+-------+--------+
6 rows in set (0.00 sec)
replace into的语法和insert into的语法相似,但是如果冲突的话可以替换表中的数据,和inset into on duplicate update相似。


2.3 load data infile 




导入:从一个文本内容导入,我们刚刚导出的。

语法:
LOAD DATA INFILE 'file_name.txt'    [REPLACE | IGNORE]    INTO TABLE tbl_name    
[FIELDS        [TERMINATED BY 'string']        [[OPTIONALLY] ENCLOSED BY 'char']        [ESCAPED BY 'char' ]    ]    
[LINES        [STARTING BY 'string']        [TERMINATED BY 'string']    ]    
[IGNORE number LINES]

应该根据数据格式导入,格式语法,默认为:
字段:
fields terminated by '\t' enclosed by '' escaped by '\\‘
记录:
lines terminated by '\n' starting by ''

其他常用的是:字段使用逗号分割,而使用引号包裹

获取数据的字符集,受character_set_database配置的限制。注意,不受客户端的字符集的影响。

在导入数据时,如果出现主键冲突,可选的:忽略 或 替换。
Load data infile ‘file’ Ignore replace

可以选择在文本文件开始出,忽略若干行再进行导入。
Into table tbl_name ignore N lines;

Load data infile "file" into table tbl_name;
注意:导入时,涉及到数据增加,需要考虑,是否冲突的情况。

通常,可以在导出时,将主键导出成null。利用自动增长的特性。可以形成新的主键:
同样:在导入数据时,需要同样指定数据的分割,起止符号等。保证 导出数据的格式与导入数据需要的格式是一致的即可.

首先当test_1导出,注意,将有主键的一行设置为空:
mysql> select null,name,sex into outfile 'E:/test3.txt'from test_1;
Query OK, 6 rows affected (0.00 sec)

将导出的数据导入到test_1表中:
mysql> load data infile 'E:/test3.txt' into table test_1;
Query OK, 6 rows affected (0.03 sec)
Records: 6  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from test_1;
+----+-------+--------+
| id | name  | sex    |
+----+-------+--------+
|  1 | Apple | male   |
|  2 | Green | male   |
|  3 | Qian  | secret |
|  4 | Apple | male   |
|  5 | Lin   | female |
|  6 | Qian  | secret |
|  7 | Apple | male   |
|  8 | Green | male   |
|  9 | Qian  | secret |
| 10 | Apple | male   |
| 11 | Lin   | female |
| 12 | Qian  | secret |
+----+-------+--------+
12 rows in set (0.00 sec)

mysql>













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值