oracle sql 语句

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 层次查询

posted on 2006-08-07 18:15 康文 阅读(400) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜