插入,更新,刪除數據
oracle提供了功能豐富的數據庫管理語句
包括有效的向數據庫中插入數據的insert語句
更新數據的update語句
以及當數據不再使用時刪除數據的delete語句
更改數據之后一定要使用提交操作,否則只保存在內存中,別人無法查看到更改
- Rollback;
- 回滾
- commit;
- 提交
1插入數據
准備表
SQL> create table person(
2 id number(9) not null,
3 name varchar2(40) not null,
4 age number(9) not null,
5 info varchar2(50) null,
6 primary key(id)
7 );
表已創建。
1.1表的所有字段插入數據
向表中所有宇段插入值的方法有兩種
- 一種是指定所有字段名 ,
- 另一種是完全不指定字段名
語法
INSERT INTO table_name (column_list) VALUES (value_list);
1指定所有字段名
插入數據時,不需要按照表定義的順序插入,只要保證值的順序與列宇段的順序相同就可以
SQL> insert into person(id,name,age,info)
2 values(1,'Green',21,'lawyer');
已創建 1 行。
2完全不指定 字段名
值列表為每一個字段列指定插入值,並且這些值的順序必須和person表中字段定義的順序相同
SQL> insert into person
2 values(2,'Mary',24,'Musician');
已創建 1 行。
當需要插入空值時,可以使用null關鍵字或者''
SQL> insert into person
2 values(3,'meditation',24,null);
已創建 1 行。
1.2為表的指定字段插入數據
在person表中,插入一條新記錄,name值為Willam,age為20
SQL> insert into person(id,name,age)
2 values(4,'Willam',20);
已創建 1 行。
1.3同時插入多行數據
SQL> insert into person(id,name,age)
2 select 5,'Harry',21 from dual
3 union all
4 select 6,'harriet',19 from dual;
已創建2行。
1.4將查詢結果插入到數據中
語法
insert into table_name1(column_list1)
select (column_list2) from table_name2 where (condition)
- table_name1 指定待插入數據的表
- column_list1 指定待插入表中要插入數據的那些列
- table_name2 指定插入數據是從哪個表中查詢出來的
- column_list2 指定數據來源表的查詢列.該列表必須和column_list1 列表中的字段個數相同,數據類型相同
- condition 指定 SELECT 句的查詢條件
准備person_old表
SQL> create table person_old(
2 id number(9) not null,
3 name varchar2(40) not null,
4 age number(9) not null,
5 info varchar2(50) null,
6 primary key(id)
7 );
表已創建。
插入數據
SQL> insert into person_old(id,name,age)
2 select 7,'Evans',23 from dual
3 union all
4 select 8,'Dale',29 from dual;
已創建2行。
將person_old中的兩條數據添加到person中
SQL> insert into person(id,name,age)
2 select id,name,age from person_old;
已創建2行。
SQL> select id,name,age from person;
ID NAME AGE
---------- ----------- ----------
1 Green 21
2 Mary 24
3 meditation 24
4 Willam 20
5 Harry 21
6 harriet 19
7 Evans 23
8 Dale 29
- 從結果可以看到,person表中多了兩條記錄
- id列一般是自增的主鍵,在插入時要保證該字段的唯一性
- 如果不能確定,可以插入的時候忽略該字段,只插入其他字段的值
2更新數據
oracle中使用update語句更新表中的記錄,
可以更新特定的行,或者更新所有的行
語法
update table_name
set column_name1=value1,...column_namen=valuen
where (condition);
更新id值為6的記錄,將age字段改為25,將name字段改為LiMing
SQL> update person
2 set age=25,name='LiMing'
3 where id=6;
已更新 1 行。
更新age值為19~23的記錄,將info字段值改為student
SQL> update person
2 set info='student'
3 where age between 19 and 23;
已更新4行。
SQL> select * from person;
ID NAME AGE INFO
---------- ------------- ---------- ----
1 Green 21 student
2 Mary 24 Musician
3 meditation 24
4 Willam 20 student
5 Harry 21 student
6 LiMing 25
7 Evans 23 student
8 Dale 29
2.2聯表更新
將person表和person_old表中id列相同的數據的 info列改為person表的info列
SQL> select * from person_old;
ID NAME AGE INFO
---------- ---------------- ---------- -----------
7 Evans 23
8 Dale 29
update
SQL> update person_old p1
2 set info=(select info from person p2 where p1.id=p2.id)
3 where exists(select 1 from person p2 where p1.id=p2.id);
已更新2行。
SQL> select id,name,info from person_old;
ID NAME INFO
---------- ------------- ---------
7 Evans student
8 Dale
SQL>
merge into
將person表和person_old表中id列相同的數據的 info列改為person表的info列
SQL> Rollback;
回退已完成。
SQL> select * from person_old;
ID NAME AGE INFO
---------- ------- ---------- ------
7 Evans 23
8 Dale 29
SQL> merge into person_old p1
2 using person p2
3 on(p1.id=p2.id)
4 when matched then
5 update
6 set
7 p1.info=p2.info;
2 行已合並。
SQL> select * from person_old;
ID NAME AGE INFO
---------- -------- ------ ----
7 Evans 23 student
8 Dale 29
SQL>
語句 | 描述 |
---|---|
merge into: | 關鍵字,后跟主表表名 |
using: | 用,后跟源數據,可以是一個表,也可以是一個結果集 |
on: | 關鍵字, 后面括號內跟關聯條件; |
when matched then: | 即當滿足on后條件時,執行更新操作,即后面跟的update; |
when not matched then: | 即當on后的條件不滿足,要執行的操作 |
3刪除數據
delete語句允許使用where子句指定刪除條件
3.1刪除單行數據
SQL> delete from person
2 where id=7;
已刪除 1 行。
SQL> select * from person where id=7;
未選定行
3.2刪除多行數據
SQL> delete from person
2 where info is null;
已刪除3行。
SQL> select * from person where info is null;
未選定行
SQL> delete from person
2 where id between 4 and 8;
已刪除2行。
SQL> select * from person
2 where id=4;
未選定行
3.3刪除全部數據
SQL> select count(1) from person;
COUNT(1)
----------
2
SQL> delete from person;
已刪除2行。
SQL> select count(1) from person;
COUNT(1)
----------
0
3.4truncate清除表中所有數據
SQL> Rollback;
回退已完成。
SQL> select count(1) from person;
COUNT(1)
----------
8
SQL> truncate table person;
表被截斷。
SQL> select count(1) from person;
COUNT(1)
----------
0
3.5truncate和delete區別
- delete是DML語句,需要提交; truncate 是DDL語句,不需要提交;
- delete可以刪除一行或者多行數據,truncate是針對全表數據;
- 當數據量比較大時,delete會比較慢,因為要寫日志,方便數據恢復.truncate則很快,因為只寫少量日志,因此也難以恢復;