1 检索日期
1 select birthday from ...使用的是日期的默认格式
2 使用YYYY-MM_DD 格式 select to_char(birthday,'YYYY-MM-DD') from ..
2 处理null值
1 使用nvl函数处理null值:nvl 函数用于将null 转变为实际值,其语法格式为nvl(exp1,exp2),如果exp1是null 则反会exp2,否则返回exp1
select nvl(comm,0) as salary from
2 使用nvl2 处理null :nvl2(exp1,exp2,exp3),如果exp1 是null 返回exp3,否则返回exp3,exp2 ,和exp3 不可以是long,并需要和exp1匹配
3 连接字符:select eanme||'is a '|| job as "employee detail" form emp
4 在where 中使用 日期值
select * from hiredate>to_date('1982-01-01','YYYY-MM-DD')
5 在where 子句中使用like
select * from ename like 'S%' select * from ename like '__A%' select * from ename like '%a_%' 字符a为转义符
6 插入数据
insert into emp(empno ,ename,job,hiredate)values(1234,'mary','clerk',to_datee('1983-02-02','YYYY-MM-DD'))
insert into dept values(50,'train','boston')
7 使用子查询插入数据
1 使用子查询
insert into employee (empno,ename,sal,deptno,form emp where deptno=20);
2 使用查询执行直接转载
insert /*+append*/ into employee (empno,ename,sal,deptno)
select ..............(大批量数据直接转载时速度更快一些)
8使用多表插入数据
1 使用all 操作符执行夺标插入
insert all
when deptno=10 then into dept10
when deptno=20 then into dept20
when job='clerk' then into clerk
else into other
select * from emp;
2 使用first 操作符执行多表插入L:如果数据已经满足先前条件,并且已经被插入到某表,那么
该行数据在后续插入中将不会被再次使用。即不会出现既插入到dept10 中又插入到 clerk 中的
情况
insert first
when deptno=10 then into dept10
when deptno=20 then into dept20
when job='clerk' then into clerk
else into other
select * from emp
9 更新数据
1 update emp set job default where cname='scott' 如果存在默认使用默认,否则使用null
2 使用子查询更新数据,可以减少网络开销
update emp set (job,sal,comm)= (select job,sal,comm from emp where ename='cmith')
where ename='scott'
3 复制数据 update employee set deptno=7788 where job=(select job form emp where empno=7788)
10 删除数据
1 delete 使用delete 的时候只删去数据,而不会释放空间,可以回退
2 truncate table emp 不仅删除数据,而起回释放空间,不可一回退
11 使用事务控制语句
1 提交事务 commit
2 回退事务
1 回退部分事务:savepoint a
rollback a
2 回退全部事务 rollback
3 只读事务,只允许运行查询操作。可重复读 set transaction read only
4 顺序事务 set transaction isolation level serializable
12 分组函数,作用于多行,一般情况下于group by 字句结合使用,在使用分组函数时,如果忽略了 groub by 则汇总所有的行
select max(sal),min(sal) from emp
select avg(sal),sum(sal) from emp
select count(*) form emp
select count(emp) from emp
13 使用group by and having
1 select deptno,avg(sal),max(sal) from emp group by deptno
2 select deptno ,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000
分组函数只能出现在选择列表,having 和order 中
当选择表包含有列表达式,和分组函数,那么这些列表和表达式必须出现在group by 字句中
3 rollup 和cube 中 产生横向纵向 的统计结果
在使用rollup操作符时,在生成原有统计结果的基础,还会生成横向小计结果,在使用cube 操作
符时,在软有rollup 统计结果的基础,还会生成纵向小计结果
select deptno,job,avg(sal) from emp group by rollup(deptnojob);
select deptno,job,avg(sal) from emp group by cube(deptnojob);
14 连接查询
在使用连接查询时,必须在where 子句中指定有效的连接条件。如果不指定连接条件,或者指定无效的连接条件
那么会导致生成笛卡尔乘积。
1 select e.name,esal, from emp e,dept d where e.deptno=d.deptno;
2 自然连接:在同一张表之间连接查询
select manager.ename form emp manager,emp worker
where manager.empno=worker.mgr and worker.ename='blanke'
3 内连接由于返回满足连接条件的记录,而外连接则是内连接的扩展,还会返回不满足的连接条件的记录
4 左外连接: 不仅返回满足条件的所有记录,而且还会返回不满足连接条件的连接符左表的其它行
select a.name,b,ename from adpt a left join emp b on a.deptno=b.deptno
5 右外连接 right join
6 完全外连接 不仅返回满足条件的所有行,而且还会返回不满足连接条件的所有其它行
select a.dname,b,ename from dept a full join emp b on a.deptno=b.deptno
15 子查询
1 单行子查询 返回一行数据的子查询语句
select ename,sal,deptno form emp where deptno=(select deptno from emp where ename='scott')
2 多行子查询,返回多行子查询
1) 使用in操作符
select ename ,job,sal,deptno from emp where job in
(select distince job from emp where deptno='10')
2)在多行子查询中使用all操作符
select ename,sal,deptno from emp where sal>all(select sal from emp where deptno='30')
3)在多行子查询中使用any操作符 任何一个结果即可
select ename,sal,deptno from em where sal>any(select sal from emp where deptno='30')
3 多列子查询
select ename,job,sal,deptno from emp where (deptno,job)=(select deptno,job from emp where ename='smith')
1) 成对比较示例
select ename,sal,comm,deptno from emp where (sal,nvl(cpmm.-1)) in (select sal,nvl(comm,-1) from emp where deptno='30')
2) 非成对比较
select ename,sal.comm,deptno from emp where sal_in(select sal from emp where deptno='30')
and nvl(comm,-1) in (select nvl) in (select nvl(comm,-1) from emp where deptno=30)
4 相关子查询
SELECT ENAME,JOB.SAL,DEPTNO FROM EMP FROM EXISTS(SELECT l FROM DEPT WHERE.......)
16 在dml 中使用子查询
1)在insert 中使用
insert into employee(id,name,title,salary)
select ename,job,sal from emp
2)update emp sset (sal,comm)=
(select sal,comm fromm emp where ename='smtp')
where job=(select job from emp where ename='smith')
17 在ddl
1 在create table 语句中使用子查询
create table new_emp(id,name,sql,jog,deptno) as
select empno,ename,sal,job,deptno from emp
18 合并查询
1) union 自动去掉集合中重复的行,定对第一列结果排序
select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job='manager'
2) union all 不会取消重复值
3)intersect 取两个结果继的交集
4) ninus 取两个结果结的差集
19 其它复杂查询
1 层次查询