mysql系列——DML操作彙總(四)
一、DML定義
DML:(Data Manipulation Language)資料操作語言-資料庫的基本操作,SQL中處理資料等操作統稱為資料操縱語言,簡而言之就是實現了基本的“增刪改查”操作。
DML操作是可以手動控制事務的開啟、提交和回滾的。包括的關鍵字有:select、update、delete、insert、merge
宣告:本文涉及到的語法用[]包含的內容,屬於可選項。
一、插入操作
1、插入單行兩種方式
方式1:
insert into 表名[(欄位名1,欄位名1,…)] values(值1,值2,…);
說明:
- 欄位和值的個數、型別必須一一對應
- 如果是字元型別或日期型別,值需要用單引號(‘’)引起來;
- 如果是數值型別,不需要用單引號;
- 如果欄位不能為空,必須插入值;
- 可以為空的欄位可以不用插入值,但需要注意:欄位和值都不寫;或欄位寫上,值用null代替;
- 如果表名後不寫欄位,此時表示所有欄位,順序和表中欄位順序一致。
方式2: 不常用
insert into 表名 set 欄位1=值1,欄位2=值2,..;
2、批量插入兩種方式
方式1
insert into 表名[(欄位1,欄位2,…)] values(值1,值2,…), (值1,值2,…), (值1,值2,…)…;
方式2
insert into 表名[(欄位1,欄位2,…)]
說明:
資料來源select語句可以有很多種寫法,需要注意:select返回的結果和待插入資料的欄位的數量、順序以及型別需要完全一致。
二、更新操作
1、單表更新
update 表名[[as] 別名] set [別名.]欄位 = 值, [別名.]欄位 = 值…[where條件];
2、多表更新
update 表1[[as] 別名1], 表2[[as] 別名2] set [別名.]欄位 = 值, [別名.]欄位 = 值…[where條件];
三、刪除操作
1、使用delete刪除
單表刪除
delete [別名/表名] from 表名[[as] 別名] [where條件];
注意:
- 如果無別名,表名就是別名;
- 如果有別名,delete後面必須寫別名;
- 如果無別名,delete後面的別名可省略。
--刪除demo1表所有記錄 delete from demo1; --刪除demo1表所有記錄 delete demo1 from demo1; --有別名的方式,刪除demo1表所有記錄 delete d1 from demo1 d1; --有別名的方式,刪除demo1表滿足條件的記錄 delete d1 from demo1 as d1 where d1.a > 100;
多表刪除
delete [別名1], [別名2]… from 表1[[as] 別名1], 表2[[as] 別名2]… [where條件];
說明:別名可以省略不寫,但是需要在delete後面跟上表名,多個表名之間用逗號隔開。
示例1:
刪除demo1表中的記錄,,條件是這些記錄的欄位a在demo2中存在的記錄。 delete d1 from demo1 t1,demo2 d2 where d1.a = d2.c2;
示例2:
同時對2個表進行刪除,條件是demo1.a=demo2.c2的記錄。 delete d1,d2 from demo1 d1,demo2 d2 where d1.a=d2.c2;
2、使用truncate刪除
truncate 表名;
3、drop、truncate、delete區別
drop 表名
1、drop是DDL,會隱式提交,所以,不能回滾,不會觸發觸發器。
2、drop語句刪除表結構及所有資料,並將表所佔用的空間全部釋放。
3、drop語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該表的儲存過程/函式將保留,但是變為invalid狀態。
truncatetable表名
1、truncate是DDL,會隱式提交,所以,不能回滾,不會觸發觸發器。
2、truncate只刪除資料,而不刪除表的結構(定義)。當表被TRUNCATE後,這個表和索引所佔用的空間會恢復到初始大小
3、對於外來鍵(foreignkey)約束引用的表,不能使用truncatetable,而應使用不帶where子句的delete語句。
delete from 表名
1、delete是DML,執行delete操作時,每次從表中刪除一行,同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,
但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,可以通過rollback撤消操作。
2、delete只刪除資料,而不刪除表的結構(定義)。delete操作不會減少表或索引所佔用的空間。
3、指定where子句,支援刪除部分資料。
總結:
1、在速度上,一般來說,drop>truncate>delete。
2、在使用drop和truncate時一定要注意,雖然可以恢復,但為了減少麻煩,還是要慎重。
3、如果想刪除表,當然用drop;
如果想保留表而將所有資料刪除,並且和事務無關,用truncate即可;
如果和事務有關,或者想觸發trigger,還是用delete;
如果想刪除部分資料用delete,注意帶上where子句,回滾段要足夠大;
如果是整理表內部的碎片,可以用truncate跟上reusestroage,再重新匯入/插入資料。
我話講完!誰贊成?誰反對?