處理數(shù)據(jù)
SQL 的類型
1.DML(data manipulation Language 數(shù)據(jù)操作語言):
insert update delete select
2.DDL(Data Definition Language 數(shù)據(jù)定義語言):
create table,alter table,drop table,truncate table
create/drop view,sequence(序列),index,synonym(同義詞)
3.DCL(Data Control Language 數(shù)據(jù)控制語言):
grant(授權(quán)) revoke(撤銷權(quán)限)
插入 insert:
插入空值:
隱式方式:在列名表中省略該列的值
insert into departments (department_id
department_name)
values (30,'Purchasing');
顯式方式:在values子句中指定空值
insert into departments
values (100,'Finance',null,null);
插入指定的值:
SQL> insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
已創(chuàng)建 1 行。
SQL> -- PreparedStatement pst = "insert into emp(empno,ename,sal,deptno) values(?,?,?,?)";
SQL> --地址符 &
&相當(dāng)于枷遂?
例:
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
輸入 empno 的值: 1002
輸入 ename 的值: 'Mary'
輸入 sal 的值: 2000
輸入 deptno 的值: 30
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',2000,30)
已創(chuàng)建 1 行樱衷。
SQL> /
輸入 empno 的值: 1003
輸入 ename 的值: 'Mike'
輸入 sal 的值: 5000
輸入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1003,'Mike',5000,20)
已創(chuàng)建 1 行。
&可以應(yīng)用于多處:
代表一列:
SQL> select empno,ename,sal,&t
2 from emp;
輸入 t 的值: job
原值 1: select empno,ename,sal,&t
新值 1: select empno,ename,sal,job
代表一個表:
SQL> select * from &t;
輸入 t 的值: dept
原值 1: select * from &t
新值 1: select * from dept
批處理:
SQL> create table emp10 as select * from emp where 1=2;
表已創(chuàng)建酒唉。
SQL> --一次性將emp中矩桂,所有10號部門的員工插入到emp10中
SQL> insert into emp10 select * from emp where deptno=10;
海量拷貝數(shù)據(jù):
1.數(shù)據(jù)泵(datapump) ---> plsql
2.SQL*Loader
3.(數(shù)據(jù)倉庫)外部表
4.可傳輸?shù)谋砜臻g
更新 update:
語法:
update table
set column=value[,column=value,...]
[where condition];
可以一次更新多條數(shù)據(jù)
使用where子句指定需要更新的數(shù)據(jù):
update employees
set department id=70
where employee_id=113;
如果省略where子句,則表中的所有數(shù)據(jù)都將被更新痪伦。
update copy_emp
set department_id=110;
在update語句中使用子查詢
更新114號員工的工作和工資使其與205號員工相同
update employees
set job_id=(select job_id
from employees
where employee_id=205),
salary=(select salary
from employees
where employee id=205)
where employee_id=114;
使更新基于另一個表中的數(shù)據(jù):
update copy_emp
set department_id=(select department_id
from employees
where employee_id=100)
where job_id =(select job_id
from employees
where employee_id=200);
刪除 delete:
delete [from] table
[where condition];
使用where子句指定刪除的記錄:
delete from departments
where department_name='Finance';
如果省略where子句侄榴,則標(biāo)準(zhǔn)功能的全部數(shù)據(jù)將被刪除。
delete from copy_emp;
在delete中使用子查詢网沾,使刪除基于另一個表中的數(shù)據(jù)癞蚕。
delete from employees
where department_id=
(select department_id
from departments
where department_name like'%public%');
delete和truncate
區(qū)別:
1.delete逐條刪除;truncate先摧毀表辉哥,再重建
2.delete是DML(可以回滾)桦山,truncate是DDL(不可以回滾)(最根本的區(qū)別)
3.delete不會釋放空間 truncate會
4.delete可以閃回 truncate不可以
(flashback)通過閃回 可以撤銷一個已經(jīng)提交了的操作
5.delete會產(chǎn)生碎片;truncate不會
碎片:
效率:
比較刪除5000條數(shù)據(jù)所需時間:delete更快
SQL> @d:\temp\testdelete.sql
SQL> select count(*) from testdelete;
COUNT(*)
----------
5000
SQL> set timing on
SQL> delete from testdelete;
已用時間: 00: 00: 00.06
SQL> set timing off
SQL> drop table testdelete purge;
SQL> @d:\temp\testdelete.sql
SQL> select count(*) from testdelete;
COUNT(*)
----------
5000
SQL> set timing on
SQL> truncate table testdelete;
已用時間: 00: 00: 00.15
undo數(shù)據(jù)(還原數(shù)據(jù))
事務(wù)
事務(wù)的標(biāo)志:
1.起始標(biāo)志:事務(wù)中第一條DML語句
2.結(jié)束標(biāo)志:提交: 顯式 commit
隱式 正常退出(exit)醋旦,DDL(隱含了提交功能)恒水,DCL
回滾: 顯式 rollback
隱式 非正常退出,掉電饲齐,宕機
commit和rollback語句的優(yōu)點:
1.確保數(shù)據(jù)完整新
2.數(shù)據(jù)改變被提交之前預(yù)覽
3.將邏輯上相關(guān)的操作分組
控制事務(wù):
回滾到保存點:
使用savepoint語句在當(dāng)前事務(wù)中創(chuàng)建保存點钉凌。
使用rollback to savepoint語句回滾到創(chuàng)建的保存點。
SQL> create table testsavepoint
2 (tid number, tname varchar2(20));
SQL> set feedback on
SQL> insert into testsavepoint values(1,'Tom');
已創(chuàng)建 1 行捂人。
SQL> insert into testsavepoint values(2,'Mary');
已創(chuàng)建 1 行御雕。
SQL> --定義保存點
SQL> savepoint a;
保存點已創(chuàng)建矢沿。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
已選擇 2 行。
SQL> insert into testsavepoint values(3,'Maake');
已創(chuàng)建 1 行饮笛。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
3 Maake
已選擇 3 行咨察。
SQL> rollback to savepoint a;
回退已完成。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
已選擇 2 行福青。
oracle中事務(wù)的隔離級別:
1.read commited(默認)
2.serializable
3.read only(oracle獨有的)
SQL> set transaction read only;
事務(wù)處理集摄狱。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
已選擇 2 行。
SQL> insert into testsavepoint values(3,'Maake');
insert into testsavepoint values(3,'Maake')
*
第 1 行出現(xiàn)錯誤:
ORA-01456: 不能在 READ ONLY 事務(wù)處理中執(zhí)行插入/刪除/更新操作