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>













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章