oracle插入,更新,删除数据
插入,更新,删除数据
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则很快,因为只写少量日志,因此也难以恢复;