1. 程式人生 > 其它 >mysql系列——DML操作彙總(四)

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,再重新匯入/插入資料。

我話講完!誰贊成?誰反對?