1.追加数据
INSERT INTO table[(column[,column...])]
VALUES (value[,value...]);
例1:INSERT INTO dept(deptno,dname,loc)
VALUES (50,'DEVELOPMENT','DETROIT');
例2:INSERT INTO dept
VALUES (50,'DEVELOPMENT','DETROIT');
例3:INSERT INTO dept(deptno,dname)
VALUES (50,'DEVELOPMENT');
1)插入含空值NULL的记录
-隐含法:在列名列表中忽略该列
例:INSERT INTO dept(deptno,dname)
VALUES (60,'MIS');
-显示法:制定NULL关键字
例:INSERT INTO dept
VALUES (50,'DEVELOPMENT',NULL);
2)插入特殊值
-SYSDATE函数记录当前日期和时间
例:INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7196,'GREEN','SALESMAN',7782,SYSDATE,2000,NULL,10);
3)替代变量插入值
例:INSERT INTO dept(deptno,dname,loc)
VALUES (&department_id,'&department_name','&location');
结果:
在要执行的脚本中输入替换变量的值:
变量 值
department_id: 80
department_name: EDUCATION
location: ATLANTA
4)从另一个表复制数据
INSER INTO table [ column(,column)]
subquery;
例:INSERT INTO test
SELECT *
FROM dept
WHERE loc='NEW YORK';
2.修改表中的数据
UPDATE table
SET column=value[,column=value]
[WHERE condition];
例1:使用WHERE子句制订要更新的记录
UPDATE emp
SET deptno=20
WHERE empno=7782;
例2:如果要更新所有记录WHERE子句可以忽略
UPDATE employee
SET deptno=20;
例3:用编号为7499雇员的工作名称及部门编号更新编号为7698雇员相对应的信息
方法一:
UPDATE emp
SET (job,deptno)=
(SELECT job,deptno
FROM emp
WHERE empno=7499)
WHERE empno=7698;
方法二:
UPDATE emp
SET deptno=
(SELECT deptno
FROM emp
WHERE empno=7499)
job =
(SELECT job
FROM emp
WHERE empno=7499)
WHERE empno=7698;
3.删除表中记录
DELETE [FROM] table_name
[WHERE condition];
例1:在WHERE子句中指定哪些记录要被删除
DELETE FROM emp
WHERE job='CLERK';
例2:如果省略WHERE子句,表中所有记录将被删除
DELETE FROM emp;
例3:在DELETE语句中使用子查询可以居于另一个表删除本表记录
DELETE FROM emp
WHERE deptno=
(SELECT deptno
FROM dept
WHERE dname='NEW YORK');
例4:删除记录时的完整性约束错误
DELETE FROM dept
WHERE deptno=10;
结果:
DELETE FROM dept
*
ERROR 位于第 1 行:
ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录日志
4.合并语句
-根据条件对表进行数据更新或插入操作
-如果行存在,进行更新;如果是新行,进行插入操作
MERGE INTO table_name table_alias
USING (talble|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1=col1_val,
col2=col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values)
例:
MERGE INTO copy_dept c
USING dept e
ON (c.deptno=e.deptno)
WHEN MATCHED THEN
UPDATE SET
c.dname=e.dname,
c.loc =e.loc
WHEN NOT MATCHED THEN
INSERT VALUES(e.deptno,e.dname,e.loc);
5.数据库事务
-开始于第一条可执行的SQL语句的执行
-在下列情况下结束:
-COMMIT或ROLLBACK
-DDL或DCL语句被执行
-用户退出
-系统崩溃
1)COMMIT和ROLLBACK优点
-确保数据的一致性
-产生永久性变化之前可以预览数据的变化
-聚合一系列逻辑相关的操作
2)隐含的事务处理
-下列情况下会自动提交:
-执行DDL语句
-执行DCL语句
-正常退出SQL*PLUS,并且没有明确的执行COMMIT或ROLLBACK
-在遇到SQL*PLUS异常结束或系统故障都会自动回滚
3)执行COMMIT或ROLLBACK前的数据状态
-数据变化前的状态是可以被恢复的
-当前用户可以是使用SELECT语句来验证DML操作后的结果
-其他用户不能查看由当前用户的DML操作结果
-受影响记录被锁定,也就是其他用户不能改变受影响记录中的数据
4)执行COMMIT后的状态
-在数据库中数据变化成为永久性的
-先前的数据状态永久性的消失
-所有用户都可以查询提交后的结果
-锁定的记录被释放,可以有效地被其他用户操作
-所有的存储节点被清除
例:提交数据
-产生数据变化
UPDATE emp
SET deptno=10
WHERE empno=7782;
-提交数据变化
COMMIT;
5)回滚到某个标记状态
-在当前事务中使用SAVEPOINT语句创建一个标记状态
-使用ROLLBACK TO SAVEPOINT语句回滚到制定的标记状态
例:SQL>UPDATE...
SQL>SAVAPOINT update_done;
Savepoint created.
SQL>INSERT...
SQL>ROLLBACK TO update_done;
Rollback complete.
6)语句级回滚
-如果一个DML语句在执行过程中出错,那么仅仅是这条语句中的操作被回滚
-Oracle服务器完成一个隐含的保存节点操作
-所有其他变化仍然保留
-用户应该是哟个COMMIT或ROLLBACK语句明确的终止该事务
7)读取的一致性
-读取的一致性可以保证任何时候数据查询的一致
-一个用户所产生的数据变化不会和另一个用户所产生的数据变化相冲突
-确保对于同一数据:
-读取者不用等待写入者
-写入者不用等待读取者
6.锁定
-锁定是一种用于防止多个事务同事访问相同资源而产生的破坏性交互作用的机制
-Oracle锁定
-阻止并发事务之间产生的破坏性交互作用
-不需要用户干预
-自动使用最低级别限制
-锁定时间和事务持续时间相同
-有两种基本模式
-排它(行级锁)
-共享(表级锁)
练习
1.将以下信息添加到emp表中:
empno ename job mgr hiredate sal comm deptno
10 Mirror manager 7839 1980-12-10 3000 20
INSERT INTO emp
VALUES (10,'Mirror','manager',7839,
TO_DATE('1980-12-10','yyyy-mm-dd'),3000,NULL,20)
2.将以下信息添加到dept表中:
deptno dname loc
50 LEADER shenyang
INSERT INTO dept
VALUES (50,'LEADER','shenyang');
3.更新雇员编号为10的雇员薪水为3500,雇佣日期为1979-5-1
UPDATE emp
SET sal=3500
WHERE empno=10;
4.更新dept表部门编号为50的地址为beijing
UPDATE dept
SET loc='beijing'
WHERE deptno=50;
6.用编号为7900的雇员性谁更新编号为10的雇员的薪水
UPDATE emp
SET sal=
(SELECT sal
FROM emp
WHERE empno=7900)
WHERE empno=10;
7.删除工作地点在北京的雇员
DELETE
FROM dept
WHERE deptno=
(SELECT deptno
FROM dept
WHERE loc='beijing');
8.删除部门编号为50的部门信息
DELETE
FROM dept
WHERE deptno=50;
9.将以下信息添加到emp表中:
empno ename job mgr hiredate sal comm deptno
10 Mirror MANAGER 7839 1980-12-10 3000.00 20
INSERT INTO emp
VALUES (10,'Mirror','MANAGER',7839,
TO_DATE('1980-12-10','yyyy-mm-dd'),3000.00,NULL,20);
10.提交所做的改变
COMMIT;
11.将以下信息添加到emp表中
empno ename job mgr hiredate sal comm deptno
11 Word CLERK 7782 2001-01-12 1500.00 30
INSERT INTO emp
VALUES (11,'Word','MANAGER',7782,
TO_DATE('2001-01-12','yyyy-mm-dd'),1500.00,NULL,30);
12.设置savepoint mark1
SAVEPOINT mark1;
13.改变empno为10的job值,由manager改为clerk,薪水由3000.00改为1500.00
UPDATE emp
SET job='CLERK',sal=1500.00
WHERE empno=10;
14.设置savepoint mark2
SAVEPOINT mark2;
15.删除薪水低于1000元的所有员工信息
DELETE
FROM emp
WHREE sal<1000;
16.回退到savepoint mark2
ROLLBACK TO mark2;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luyangever/archive/2008/12/13/3510600.aspx