MySQL資料庫 之 插入、更新與刪除資料
一、插入資料
MySQL 中使用 insert 語句來向資料庫表中插入新的資料記錄。
☆ 為表的所有欄位插入資料
insert into tb_name (col_list) values (value_list)
建立一個數據表 person 如下:
>>> create table person(
id int unsigned not null primary key auto_increment,
name char(40) not null default "",
age int not null default 0,
info char(50) null
);
>>> show tables;
+-----------------+
| Tables_in_learn |
+-----------------+
| person |
+-----------------+
1 row in set (0.00 sec)
>>> select * from person:
Empty set (0.03 sec)
我們檢視當前資料表顯示已經建立成功,檢視資料表中的資料,顯示當前資料表為空。
接下來我們向表中插入資料:
>>> insert into person (id, name, age, info)
values (1, 'Green', 21, 'Lawyer');
Query OK, 1 row affected (0.00 sec)
插入資料時,不需要按照表定義的順序插入,只要保證值的順序與列欄位的順序相同就可以。這裡不再演示。
在插入資料時,允許列名稱列表 col_list 為空,值列表中需要為列的每一個欄位指定值,並且值的順序必須和資料表中欄位定義時的順序相同。如:
>>> insert into person
values (2 , 'Lily', 18, 'teacher');
Query OK, 1 row affected (0.00 sec)
>>> select * from person;
+----+-------+-----+---------+
| id | name | age | info |
+----+-------+-----+---------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
+----+-------+-----+---------+
2 rows in set (0.00 sec)
☆ 為表的指定欄位插入資料
>>> insert into person (name, age, info)
values ('Lilei', 20, 'sports man');
Query OK, 1 row affected (0.00 sec)
>>> select * from person;
+----+-------+-----+------------+
| id | name | age | info |
+----+-------+-----+------------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
| 3 | Lilei | 20 | sports man |
+----+-------+-----+------------+
3 rows in set (0.00 sec)
在 person 表中,id 欄位為主鍵,不能為空,所以系統會自動為該欄位插入自增的序列值。在插入資料時,如果某些欄位沒有指定插入值,MySQL 將插入該欄位在 定義時的預設值。
如:
>>> insert into person (name, age)
values ('Xiaohua', 18);
Query OK, 1 row affected (0.01 sec)
>>> mysql> select * from person;
+----+---------+-----+------------+
| id | name | age | info |
+----+---------+-----+------------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
| 3 | Lilei | 20 | sports man |
| 4 | Xiaohua | 18 | NULL |
+----+---------+-----+------------+
4 rows in set (0.00 sec)
可以看到,插入語句中沒有指定 info 的值,所以 MySQL 自動為該欄位插入了定義表時定義的預設值——空值。
☆ 同時插入多條資料
insert 語句可以同時向資料表中插入多條記錄,插入時指定多個值列表,每個值列表之間用逗號隔開:
insert into tb_name (col_list) values (values_list1), (values_list2), ...
eg:
>>> insert into person (name, age, info)
values ('Evans', 22, 'student'),
('Jack', 27, 'singer'),
('Dawei', 33, 'cook');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
>>> select * from person;
+----+---------+-----+------------+
| id | name | age | info |
+----+---------+-----+------------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
| 3 | Lilei | 20 | sports man |
| 4 | Xiaohua | 18 | NULL |
| 5 | Evans | 22 | student |
| 6 | Jack | 27 | singer |
| 7 | Dawei | 33 | cook |
+----+---------+-----+------------+
7 rows in set (0.00 sec)
我們同樣可以不指定插入欄位列表,直接插入資料記錄,但此時,我們插入的值列表的順序及資料型別必須和表定義時的欄位型別及資料型別匹配。
【注意】由於 MySQL 執行單條 insert 語句插入多行資料,比用多條 insert 語句要快,所以在插入多條記錄時,最好選擇使用單條 insert 語句。
☆ 將查詢結果插入表中
如果我們想要把另外一個表合併個人資訊到 person 表中,不需要把每條記錄的值逐一輸入,我們只需要一個 insert 語句和一個 select 語句組合在一起即可:
insert into tb_name1 (col_list1) select (col_list2) from tb_name2 where (condition)
即:我們根據 condition 條件從 tb_name2 的表中 select 出 col_list2 中指定的欄位的值,然後 insert 到 tb_name1 的 col_list1 中相應的欄位中。
首先,我們先新建一個 people 表,它具有和 person 表相同的欄位名和資料型別,並向其內插入兩條資料:
>>> create table people(
id int unsigned not null primary key auto_increment,
name char(40) not null default '',
age int not null default 0,
info char(50) null
);
Query OK, 0 rows affected (0.01 sec)
>>> insert into people
values (8, 'Xiaogang', 45, 'Doctor'),
(9, 'Eva', 35, 'police');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
>>> select * from people;
+----+----------+-----+--------+
| id | name | age | info |
+----+----------+-----+--------+
| 8 | Xiaogang | 45 | Doctor |
| 9 | Eva | 35 | police |
+----+----------+-----+--------+
2 rows in set (0.00 sec)
現在,我們將 people 表中的資料插入到 person 表中:
>>> insert into person (id, name, age, info)
select id, name, age, info from people;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
>>> select * from person;
+----+----------+-----+------------+
| id | name | age | info |
+----+----------+-----+------------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
| 3 | Lilei | 20 | sports man |
| 4 | Xiaohua | 18 | NULL |
| 5 | Evans | 22 | student |
| 6 | Jack | 27 | singer |
| 7 | Dawei | 33 | cook |
| 8 | Xiaogang | 45 | Doctor |
| 9 | Eva | 35 | police |
+----+----------+-----+------------+
9 rows in set (0.01 sec)
成功!
id 欄位為主鍵欄位,在插入的時候要保證該欄位值的唯一性,如果不能確定,可以忽略該欄位,系統會自動為我們加上正確的值。
【注意】MySQL 並不關心 select 返回的列名,它其實是根據列的位置進行插入操作,第一列對應插入第一列,第二列對應插入第二列,以此類推,所以我們只要保證 select 出來的資料的 欄位數量 與 insert 到的表的 col_list1 欄位數量 相同即可,同時別忘了具有相同的資料型別。
二、更新資料
MySQL 使用 update 語句更新表中的記錄, 可以更新特定的行或者同時更新所有的行。
update tb_name set col_name1 = value1, cul_name2 = value2, ... where condition
如:我們將 id 為 8 的記錄中的 name 更新為 Harry,age 更新為 22:
>>> select * from person where id = 8;
+----+----------+-----+--------+
| id | name | age | info |
+----+----------+-----+--------+
| 8 | Xiaogang | 45 | Doctor |
+----+----------+-----+--------+
1 row in set (0.00 sec)
>>> update person set name='Harry', age=22 where id = 8;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
>>> select * from person where id = 8;
+----+-------+-----+--------+
| id | name | age | info |
+----+-------+-----+--------+
| 8 | Harry | 22 | Doctor |
+----+-------+-----+--------+
1 row in set (0.00 sec)
現在我們要更新年齡在 18 ~ 22 之間的所有人的 info 為 student:
>>> select * from person where age between 18 and 22;
+----+---------+-----+------------+
| id | name | age | info |
+----+---------+-----+------------+
| 1 | Green | 21 | Lawyer |
| 2 | Lily | 18 | teacher |
| 3 | Lilei | 20 | sports man |
| 4 | Xiaohua | 18 | NULL |
| 5 | Evans | 22 | student |
| 8 | Harry | 22 | Doctor |
+----+---------+-----+------------+
6 rows in set (0.00 sec)
>>> update person set info = 'student' where age between 18 and 22;
Query OK, 5 rows affected (0.01 sec)
Rows matched: 6 Changed: 5 Warnings: 0
>>> select * from person where age between 18 and 22;
+----+---------+-----+---------+
| id | name | age | info |
+----+---------+-----+---------+
| 1 | Green | 21 | student |
| 2 | Lily | 18 | student |
| 3 | Lilei | 20 | student |
| 4 | Xiaohua | 18 | student |
| 5 | Evans | 22 | student |
| 8 | Harry | 22 | student |
+----+---------+-----+---------+
6 rows in set (0.00 sec)
成功!
三、刪除資料
MySQL 使用 delete 語句進行資料的刪除,同時允許 where 子句指定刪除條件:
delete from tb_name [where condition]
其中,where condition 為可選的刪除條件,如果沒有這條子句,將刪除整個表。
我們現在將 person 表中的 id 為 8 的資料刪除:
>>> select * from person where id = 8;
+----+-------+-----+---------+
| id | name | age | info |
+----+-------+-----+---------+
| 8 | Harry | 22 | student |
+----+-------+-----+---------+
1 row in set (0.00 sec)
>>> delete from person where id = 8;
Query OK, 1 row affected (0.00 sec)
>>> select * from person where id = 8;
Empty set (0.00 sec)
再次查詢顯示記錄為空,說明我們已經成功將 id 為 8 的資料記錄刪除。
我們現在刪除 age 在 18 ~ 22 之間的資料記錄:
>>> select * from person where age between 18 and 22;
+----+---------+-----+---------+
| id | name | age | info |
+----+---------+-----+---------+
| 1 | Green | 21 | student |
| 2 | Lily | 18 | student |
| 3 | Lilei | 20 | student |
| 4 | Xiaohua | 18 | student |
| 5 | Evans | 22 | student |
+----+---------+-----+---------+
5 rows in set (0.00 sec)
>>> delete from person where age between 18 and 22;
Query OK, 5 rows affected (0.00 sec)
>>> select * from person where age between 18 and 22;
Empty set (0.00 sec)
再次查詢顯示記錄為空,說明已經成功刪除響應資料記錄。
假如我們現在要刪除整個資料表的所有記錄,那我們可以這樣操作:
>>> select * from person;
+----+-------+-----+--------+
| id | name | age | info |
+----+-------+-----+--------+
| 6 | Jack | 27 | singer |
| 7 | Dawei | 33 | cook |
| 9 | Eva | 35 | police |
+----+-------+-----+--------+
3 rows in set (0.00 sec)
>>> delete from person ;
Query OK, 3 rows affected (0.00 sec)
>>> select * from person;
Empty set (0.00 sec)
現在只是將 person 整個表的資料清空了,但是表還存在:
>>> show tables;
+-----------------+
| Tables_in_learn |
+-----------------+
| people |
| person |
+-----------------+
2 rows in set (0.00 sec)
關於資料的刪除,如果我們想刪除一個數據表中的所有資料記錄,我們還可以使用truncate table tb_name
語句。它的原理是直接將表刪除,然後重新建一張跟原表一模一樣的表,但是此時表中沒有資料,相當於清空表中的所有資料:
>>> select * from people;
+----+----------+-----+--------+
| id | name | age | info |
+----+----------+-----+--------+
| 8 | Xiaogang | 45 | Doctor |
| 9 | Eva | 35 | police |
+----+----------+-----+--------+
2 rows in set (0.00 sec)
>>> truncate table people;
Query OK, 0 rows affected (0.01 sec)
>>> select * from people;
Empty set (0.00 sec)
>>> show tables;
+-----------------+
| Tables_in_learn |
+-----------------+
| people |
| person |
+-----------------+
2 rows in set (0.00 sec)