SQL 的类型
1.DML(data manipulation Language 数据操作语言): insert update delete select 2.DDL(Data Definition Language 数据定义语言): create table,alter table,drop table,truncate table create/drop view,sequence(序列),index,synonym(同义词) 3.DCL(Data Control Language 数据控制语言): grant(授权) revoke(撤销权限)插入空值:
隐式方式:在列名表中省略该列的值 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); 已创建 1 行。 SQL> -- PreparedStatement pst = "insert into emp(empno,ename,sal,deptno) values(?,?,?,?)"; SQL> --地址符 & &相当于?例:
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) 已创建 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) 已创建 1 行。&可以应用于多处:
代表一列: 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; 表已创建。 SQL> --一次性将emp中,所有10号部门的员工插入到emp10中 SQL> insert into emp10 select * from emp where deptno=10;海量拷贝数据:
1.数据泵(datapump) ---> plsql 2.SQL*Loader 3.(数据仓库)外部表 4.可传输的表空间语法:
update table set column=value[,column=value,...] [where condition]; 可以一次更新多条数据使用where子句指定需要更新的数据:
update employees set department id=70 where employee_id=113;如果省略where子句,则表中的所有数据都将被更新。
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;使更新基于另一个表中的数据:
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 employees where department_id= (select department_id from departments where department_name like'%public%');delete和truncate
区别:
1.delete逐条删除;truncate先摧毁表,再重建 2.delete是DML(可以回滚),truncate是DDL(不可以回滚)(最根本的区别) 3.delete不会释放空间 truncate会 4.delete可以闪回 truncate不可以 (flashback)通过闪回 可以撤销一个已经提交了的操作 5.delete会产生碎片;truncate不会碎片:
效率:
比较删除5000条数据所需时间: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.15undo数据(还原数据)
事务的标志:
1.起始标志:事务中第一条DML语句 2.结束标志:提交: 显式 commit 隐式 正常退出(exit),DDL(隐含了提交功能),DCL 回滚: 显式 rollback 隐式 非正常退出,掉电,宕机commit和rollback语句的优点:
1.确保数据完整新 2.数据改变被提交之前预览 3.将逻辑上相关的操作分组控制事务:
回滚到保存点:
使用savepoint语句在当前事务中创建保存点。 使用rollback to savepoint语句回滚到创建的保存点。
SQL> create table testsavepoint 2 (tid number, tname varchar2(20)); SQL> set feedback on SQL> insert into testsavepoint values(1,'Tom'); 已创建 1 行。 SQL> insert into testsavepoint values(2,'Mary'); 已创建 1 行。 SQL> --定义保存点 SQL> savepoint a; 保存点已创建。 SQL> select * from testsavepoint; TID TNAME ---------- -------------------- 1 Tom 2 Mary 已选择 2 行。 SQL> insert into testsavepoint values(3,'Maake'); 已创建 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中事务的隔离级别: 1.read commited(默认) 2.serializable 3.read only(oracle独有的)
SQL> set transaction read only; 事务处理集。 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 行出现错误: ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作