天天看點

【資料庫】SQL更新資料之增删改

資料庫中的資料變更,主要有三種:插入資料inset、修改資料update、删除資料delete。這幾種操作都是開發人員常用的操作,本文将對這幾種操作進行簡要講解。

insert操作及注意事項;

update操作及注意事項;

delete操作及注意事項;

1、insert操作

insert操作用于向表中插入新的資料,insert操作既可以單條插入,也可以與子查詢結合使用實作批量插入。

1.1單條插入

對于insert操作來說,單條插入是最常用的方式,其文法形式如下所示。

insert into 表名(列名1, 列名2,列名3.....列名n)

values(值1,值2,值3.....值n)

在insert操作中,列名清單中的各列需要以逗号分隔;而值清單指定各列的值,列名與值需要一一對應。

insert into students(stuent_id, student_name,student_age,status)

values(12,'張三',12,'act')

其中,insert into students 用于向表students中插入新的資料;student_id,student_name, student_age,status指定列名清單;values(12,'張三',12,'act')則為各列指定要插入的值。

當然,如果insert語句所指定的列名清單包含了表中的所有列,那麼可以列名清單省略,如下:

insert into  values(12,'張三',12,'act');

1.2批量插入

子查詢中,可以在插入語句中使用子查詢,以實作批量插入,接下來還有另外一個例子:

表c_students的資料結構及内容如下所示:

select * from c_students;

student_id    student_name

可以利用如下SQL語句向其中插入新的資料,新資料來自表students中student_id處于前10的學生資訊。

insert into c_students(student_id,student_name)

select student_id, student_name

from students

where student_id <=10;

說明:insert into c_students用于向表c_students中插入資料;select student_id, student_name from students where student_id <=10則指定要插入的資料。在這裡,新插入的資料來自select語句標明的結果集合,注意,此處沒有values關鍵字,這也是單條插入與批量插入的差別所在。

此時,表c_students中已成功插入了10條記錄。

1.3注意事項與技巧

insert操作文法簡單,也是開發人員掌握的最熟練的SQL語句之一,在實際開發過程中,有以下問題和技巧需要注意。

A. 應該養成使用列名清單的習慣

在一條插入語句中,即使為表中所有列都指派,也不應該省略列名清單。在一個應用系統中,很難保證資料表結構不發生改變。

【資料庫】SQL更新資料之增删改

報錯:insert語句執行時,缺少足夠的值。

B. 快速獲得列名清單

對于表結構比較簡單的資料表,例如c_students,一一羅列其列名并不困難,但是當資料結構複雜,列的數目較大時,一一羅列所有的列名耗時耗力且極易出錯,此時,我們應該使用工具獲得列名清單。以PL/SQL Devloper為例,相應的步驟如下所示。

(1)在PL/SQL Develpoler右側的對象清單中找到對應的表。以表tmp_user_objects為例,在對象清單中的位置下圖:

(2)右擊tmp_user_objects下的columns分支,将彈出快捷菜單,如下圖:

【資料庫】SQL更新資料之增删改

(3)選擇快捷菜單中的Copy comma separated選項,可以将列名清單以字元串的形式複制到黏貼闆中。各列之間使用comma(逗号)進行分割。

【資料庫】SQL更新資料之增删改

(4)打開任意的文本編輯器,将列名清單黏貼到文本編輯器中,即可。

2.update操作

update操作用于更新已有資料。

2.1 update更新單列

update操作的文法形式如下:

update 表名 set 列 = 新值

其中,update指令用于更新表中資料,其後緊跟表名;set指令用于重新設定列值,其後緊跟列名,并用等号指定新值。

例子:在表students中,列status的值均為小寫形式。可以利用update語句将其轉換為大寫形式。

update students set status = upper(status);

其中,set status = upper(status)用于為表students中的status列賦予新值,新值為原列值的大寫形式。

2.2 update更新多列

使用update語句,同樣可以更新多列,其文法如下所示。

update 表名 set 列1 = 新值1, 列2=新值2,....

在set指令之後,可以為多列同時指派,而這些列之間使用逗号進行分隔。

例子:對于表students中的學生資訊,可以在修改列status的同時,修改列student_age的值。例如:除了将status進行大寫轉換之外,還需要将學生年齡student_age增加1,相應的SQL語句如下所示。

update students set student_age = student_age +1, status = upper(status);

set student_age = student_age +1, status = upper(status)用于設定表students中列student_age與列status的新值。當兩個列都被成功更新之後,可以查詢表中實際資料進行驗證。

2.3注意事項

對于update操作,最容易被使用者忽視的就是添加where 條件,在上面的例子中,所進行的操作實際是非常危險的。因為沒有添加任何限制條件,是以oracle将更新表中的所有資料。而實際應用中,往往隻需更新部分資料,是以,對于重要資料的update操作,首先添加where關鍵字是一個好的習慣,盡管有時并不需要過濾條件。

當然,如果要修改的資料表非常重要,首先進行備份是最為穩妥的方式,接着遵守如下步驟,将極大的減少使用者出錯的幾率。

(1)首先搜尋表中的記錄,并确認這些記錄是預期進行修改的資料。

select * from students where student_id = 1;

當我們預期修改student_id為1的記錄時,可以首先利用where student_id=1的條件獲得記錄,以确認預期修改的資料。

(2)利用update語句,并結合where條件修改資料。

update students set status = 'CXL' where student_id = 1;

where student_id =1所指定的條件與步驟(1)中經過确認的where 條件相同。

(3)檢視修改後的資料,确認無誤之後,再送出修改;否則,復原操作。

SQL>select * from students where student_id = 1;

SQL>commit;   commit指令用于修改确認之後送出資料。送出之後,不可復原。

3、delete操作

delete操作用于删除表中資料。除了delete語句之外,truncate指令同樣可以删除表中資料。本段落将說明delete操作及delete操作與truncate操作的差別。

3.1 delete操作

delete操作用于删除表中的資料,其使用文法如下所示。

delete from 表名

delete from 指定從哪個表中删除資料,因為删除動作的作用對象為記錄級别。是以,無須定列名資訊。

例子:我們可以利用delete指令删除students中employee_id大于10的記錄,相應的SQL語句如下:

delete from students where student_id > 10:

如同update 語句,在使用delete語句時,添加where 子句是一個好的習慣。這樣可以避免删除表中的所有資料。

3.2 delete 操作與truncate table 操作

除了delete指令,oracle還可以利用truncate table指令删除表中的資料,但是truncate table語句與delete語句是有本質差別的:

delete語句與insert、update語句同屬于DML-資料操作語言的範疇,當資料修改之後,可以通過復原操作,忽略所做的資料修改。

而truncate table語句則是資料DDL---資料定義語言的範疇,當資料被删除之後,無法復原。

例子:通過truncate table 指令删除表students的資料。

truncate table students;

分析查詢結果可知,當執行了truncate table 指令之後,表students中的資料将被完全删除。

delete操作與truncate table操作具有不同的應用場合,當删除部分資料時,應該使用delete語句,并添加where條件;删除全部資料時,應該使用truncate table語句。同時,truncate table 删除全表資料時,效率也要高于delete語句。