數據庫中的數據變更,主要有三種:插入數據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. 應該養成使用列名列表的習慣
在一條插入語句中,即使爲表中所有列都賦值,也不應該省略列名列表。在一個應用系統中,很難保證數據表結構不發生改變。
報錯:insert語句執行時,缺少足夠的值。
B. 快速獲得列名列表
對於表結構比較簡單的數據表,例如c_students,一一羅列其列名並不困難,但是當數據結構複雜,列的數目較大時,一一羅列所有的列名耗時耗力且極易出錯,此時,我們應該使用工具獲得列名列表。以PL/SQL Devloper爲例,相應的步驟如下所示。
(1)在PL/SQL Develpoler右側的對象列表中找到對應的表。以表tmp_user_objects爲例,在對象列表中的位置下圖:
(2)右擊tmp_user_objects下的columns分支,將彈出快捷菜單,如下圖:
(3)選擇快捷菜單中的Copy comma separated選項,可以將列名列表以字符串的形式複製到黏貼板中。各列之間使用comma(逗號)進行分割。
(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語句。