1. 程式人生 > >mysql資料庫中的增刪改操作

mysql資料庫中的增刪改操作

1、插入資料

         語法格式: INSERT INTO table_name (column_list) VALUES (value_list);

                               INSERT INTO table_name (column_list) VALUES (value_list1),(value_list2),……;

                               INSERT INTO table_name (column_list) SELECT (column_list2) FROM query_table WHERE (condition);

(1)插入資料

# 插入資料
mysql> insert into student(sid,sname) value(3,'dayi');
mysql> insert into student(sid) value(2);
mysql> insert into student(sname) value('dayi123');
# 插入資料時也支援算術運算子
mysql> insert into student(sid,sname) value(3*3,'dy');
# 檢視插入的所有資料,由於sid設定了auto_increment,沒有設定sid時會自動新增
mysql> select * from student;
+-----+---------+--------+---------+
| sid | sname   | gender | dept_id |
+-----+---------+--------+---------+
|   2 | NULL    | NULL   |    NULL |
|   3 | dayi    | NULL   |    NULL |
|   4 | dayi123 | NULL   |    NULL |
|   9 | dy      | NULL   |    NULL |
+-----+---------+--------+---------+

(2)同時插入多條資料

插入時選項資訊說明:

         low_priority:如果有其他連線正在讀取資料庫,則需要等待讀取完成再插入

         ignore:如果違反主鍵和唯一鍵的約束條件,則不報錯而只產生警告資訊,違反的行被丟棄

# 同時向student表中插入兩條資料
mysql> insert into student(sid,sname) value(10,'liuer'),(1,'liyi');
# 在插入時也可不寫插入列表
mysql> insert into dept value(1,'aaa'),(2,'bbb'),(3,'ccc'); 
# 使用ignore引數插入時違反主鍵唯一約束條件,插入資料數只有警告並不退出
mysql> insert ignore into dept value(3,'ccc'),(4,'ddd');
Query OK, 1 row affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 1  Warnings: 1

插入資料時提示資訊說明

         Records:插入的記錄條數

         Duplicates:插入時被忽略的記錄

         Warings:表明有問題的資料值

(3)將查詢結果插入到表中

# 將mysql.user表中的user查詢出來插入到dept表中的dept_name欄位
mysql> insert into dept(dept_name) select user from mysql.user;
Query OK, 8 rows affected (2.28 sec)
Records: 8  Duplicates: 0  Warnings: 0

(4)插入資料時的其他選項

         on duplicate key update語句:當使用insert插入資料時碰到當前插入的資料違反主鍵或唯一鍵的唯一性約束時,使用” on duplicate key update”語句時則Insert會轉變成update語句修改對應的已經存在表中的這條資料;”on duplicate key update”子句後面可以跟多個修改,用逗號隔開。

# 插入資料,當id存在時對id等於100加1
mysql> insert into dept(id,dept_name) value(1,'aaa') ON DUPLICATE KEY UPDATE id=100+1;
Query OK, 2 rows affected (2.29 sec)
# 插入資料當id為2存在時修改id為2的dept_name的值為’bbb-test’
mysql> insert into dept value(2,'bbb') ON DUPLICATE KEY UPDATE dept_name='bbb-test';
# 檢視修改後的值
mysql> select * from dept where id=2 or id=101;
+-----+-----------+
| id  | dept_name |
+-----+-----------+
|   2 | bbb-test  |
| 101 | aaa       |

2、修改資料

         Mysql資料庫表中插入的資料不是一成不變,可以對其進行修改,修改語法如下

         單表修改語句:UPDATE [LOW_PRIORITY] [IGNORE] table_name SET col_name1 = {expr1|DEFAULT}, col_name2 = {expr2|DEFAULT},……, [WHERE (condition)] [ORDER BY……] [LIMIT row_count];

         多表修改語句:UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1 = {expr1|DEFAULT}, col_name2 = {expr2|DEFAULT},……, [WHERE (condition)]

(1)修改選項說明

         單表修改:修改指定單個表中的已經存在的資料的一個或多個列的數值;set短語後面要跟修改的列和值。

         Order by:表示update資料按照指定的順序進行

         Limit:限定修改資料的行數

         多表修改:修改table_references指定的多個表中滿足條件的行資料,多表修改不允許使用order by 和limit語句

         Low_prority:修改語句需要等待其他連線的讀操作結束後再執行。

         Ignore:當修改語句碰到違反唯一約束性條件情況時,語句不報錯,只會有警告。

(2)修改操作

# 修改student表中sid為2 的sname和gender
mysql> update student set sname="name_test",gender='2' where sid=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
#修改student表中最先找到的兩行資料的gender欄位為666
mysql> update student set gender='666' limit 2;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

    當為一個表中唯一約束遞增的一列數值同時加指定的值時,由於違反唯一約束會報錯,此時可以遞減排序,在對值進行增加。

# 為student表中的sid欄位加1時由於違反唯一約束會報錯。
mysql> update student set sid=sid+1;
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
# 反向排序再增加時不會報錯
mysql> update student set sid=sid+1 order by sid desc;
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6  Changed: 6  Warnings: 0
# 多條件修改
mysql> update teacher set name='carey' where name='ruth' and id>100 and id<200;
Query OK, 1 row affected (2.33 sec)
Rows matched: 1  Changed: 1  Warnings: 0

(3)多表修改

# 將滿足條件的teacher表中name欄位修改weiteacher_backup表中的name欄位
mysql> update teacher,teacher_backup set teacher.name=teacher_backup.name where teacher.id=teacher_backup.id;
Query OK, 1 row affected (0.00 sec)
Rows matched: 2  Changed: 1  Warnings: 0

3、刪除資料

刪除語法:

    單表刪除:DELETE [LOW_RPIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (partition_name,……)] [WHERE condition] [ORDER BY……] [LIMIT row_count];

    多表刪除:DELETE [LOW_RPIORITY] [QUICK] [IGNORE] tbl_name1[.*],tbl_name2[.*] …… FROM|USING table_references [WHERE condition];

選項說明:

         多表刪除:從一個或多個表中刪除滿足條件的資料

             table_references:代表了多個表的join操作

             Low_prority:修改語句需要等待其他連線的讀操作結束後再執行,只作用在MyISAM, MEMORY及 MERGE儲存引擎

             Order by:刪除資料的順序

             Limit:刪除資料的行數

             Quick:關鍵詞是在使用myisam儲存引擎時,刪除操作不會合並刪除表的索引葉節點

(1)單表刪除

# 刪除表teacher_backup01中的所有資料
mysql> delete from teacher_backup01;
Query OK, 2 rows affected (2.34 sec)
# 刪除表teacher_backup中name為’vivian’的資料
mysql> delete from teacher_backup where name='vivian';
Query OK, 1 row affected (0.06 sec)
# 刪除student表中id最大的資料
mysql> delete from student order by sid desc limit 1;
Query OK, 1 row affected (2.30 sec)

(2)多表刪除

# 刪除表teacher和表teacher_backup中name相同的資料
mysql> DELETE teacher,teacher_backup FROM teacher INNER JOIN teacher_backup WHERE teacher.name=teacher_backup.name;
Query OK, 2 rows affected (2.36 sec)
# 定義表別名刪除表teacher和表teacher_backup中id欄位相同的資料
mysql> DELETE t1,t2 FROM teacher AS t1 INNER JOIN teacher_backup AS t2 WHERE t1.id=t2.id;               
Query OK, 2 rows affected (2.40 sec)

(3)使用”Truncate table”來刪除或截斷表裡的所有資料

    Truncate table語句用來刪除/截斷表裡的所有資料,和delete刪除所有表資料在邏輯上含義相同,但效能更快;類似執行了drop table和create table兩個語句。

# 刪除teacher_backup01表裡的所有資料
mysql> truncate table teacher_backup01;
Query OK, 0 rows affected (0.01 sec)