标签:
注:以下所有sql案例均取自"oracle查询优化改写技巧与案例"丛书。SQL> select * from emp;
SQL> select * from dept t;DEPTNO DNAME
create table test( c1 varchar2(10) default '默认1', c2 varchar2(10) default '默认2', c3 varchar2(10) default '默认3', c4 date default sysdate );新增数据如下:
insert into test(c1,c2,c3) values(default,null,'手输值');然后查询test表所有数据:
SQL> select * from test;C1 C2 C3 C4
create or replace view v_test as select c1,c2,c3 from test;视图已创建。
insert into v_test(c1,c2,c3) values('手输c1',NULL,'勿改c4');已创建一行。SQL> select * from test;C1 C2 C3 C4
create table test2 as select * from test;也可以先复制表的定义,再新增数据:
create table test2 as select * from test where 1=2;注意:复制的表不包含默认值等约束信息,使用这种方式复制表后,需要重建默认值以及索引和约束等信息。
SQL> desc test2名称 否为空? 类型
SQL> insert into test2 select * from test;已创建2行。
SQL> select * from test2;C1 C2 C3 C4
SQL> alter table emp add constraints ch_sal check(sal>0);表已更改。
SQL> alter table emp add constraints ch_hiredate check(hiredate>=sysdate);
alter table emp add constraints ch_hiredate check(hiredate>=sysdate)
*
第 1 行出现错误:
ORA-02436: 日期或系统变量在 CHECK 约束条件中指定错误SQL> insert into
(select empno,ename,hiredate
from emp
where hiredate <= sysdate with check option)
values
(9999,'test',sysdate+1);
from emp
*
第 3 行出现错误:
ORA-01402: 视图 WITH CHECK OPTIDN where 子句违规发现报错了,因为里面有关键字“with check option”,所以insert的数据不符合其中的条件(hiredate<=sysdate)时,不就允许使用insert。SQL> insert into
(select empno,ename,hiredate
from emp
where hiredate <= sysdate with check option)
values
(9999,'test',sysdate-1);SQL> select * from emp e where e.hiredate like sysdate-1;
create table emp1 as select empno,ename,job from emp where 1=2; create table emp2 as select empno,ename,deptno from emp where 1=2;
SQL> insert all
into emp1(empno,ename,job) values(empno,ename,job)
into emp2(empno,ename,deptno) values(empno,ename,deptno)
select empno,ename,job,deptno from emp where deptno in (20,30);SQL> select * from emp1;EMPNO ENAME JOB
SQL> select * from emp2;EMPNO ENAME DEPTNO
SQL> delete emp1;
delete emp2;
insert all
when job in('销售','会计') then
into emp1(empno,ename,job) values(empno,ename,job)
when deptno in ('20','30') then
into emp2(empno,ename,deptno) values(empno,ename,deptno)
select empno,ename,job,deptno from emp;已创建10行。SQL> select * from emp1;EMPNO ENAME JOB
SQL> select * from emp2;EMPNO ENAME DEPTNO
SQL> delete emp1;
delete emp2;
/*有条件 insert first*/
insert first
when job in('销售','会计') then
into emp1(empno,ename,job) values(empno,ename,job)
when deptno in ('20','30') then
into emp2(empno,ename,deptno) values(empno,ename,deptno)
select empno,ename,job,deptno from emp;已创建10行。SQL> select * from emp1;EMPNO ENAME JOB
SQL> select * from emp2;EMPNO ENAME DEPTNO
SQL> create table t2 (d varchar(10),des varchar(50));表已创建。
SQL> create table t1 as
select '熊样,精神不佳' as d1,
'猫样,温驯听话' as d2,
'狗样,神气活现' as d3,
'鸟样,向往明天' as d4,
'花样,愿你快乐像花儿一样' as d5
from dual;
表已创建。SQL> select * from t1;D1 D2 D3 D4 D5
SQL> insert all
into t2(d,des) values('周一',d1)
into t2(d,des) values('周二',d2)
into t2(d,des) values('周三',d3)
into t2(d,des) values('周四',d4)
into t2(d,des) values('周五',d5)
select d1,d2,d3,d4,d5 from t1;已创建5行。SQL> select * from t2;D DES
SQL> alter table emp add dname varchar2(50) default 'noname';表已更改。
SQL> update emp p
set p.dname =
(select dname
from dept d where p.mgr=d.deptno
and d.dname in ('管理部门','销售部门'));已更新10行。SQL> select empno,ename,deptno,dname from emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
SQL> roll back;回退已完成。
SQL> update emp p
set p.dname =
(select dname
from dept d where p.mgr=d.deptno
and d.dname in ('管理部门','销售部门'))
where exists
(select d.dname from dept d
where d.deptno = p.mgr
and d.dname in ('管理部门','销售部门')); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAMESQL> create table bonuses (employee_id number,bonus number default 100);表已创建。
insert into bonuses
(employee_id)
(select e.employee_id
from hr.employees e,oe.orders o
where e.employee_id = o.sales_rep_id
group by e.employee_id);
select * from bonuses order by employee_id;
commit;
merge into bonuses d
using (select employee_id,salary,department_id
from hr.employess
where department_id=80) s
on (d.employee_id=s.employss_id)
/*匹配条件d.employee_id=s.employee_id*/
when matched then/*当d表中存在与S对应数据时进行更新或删除*/
update
set d.bonus = d.bonus + s.salary * 0.01
/*where只能出现一次,如果在这里加了where,delete后面的where就无效*/
delete
where (s.salary > 8000) /*删除时,只更新s.salary>8000时的数据*/
when not matched then/*当表中不存在与s对应的数据时进行新增*/
insert
(d.employee_id,d.bonus)
values
(s.employee_id,s.salary * 0.01)
where (s.salary<=8000)/*新增时,只更新s.salary<=8000时的数据,注意这里与以前不同,是d表中不存在对应数据时才新增*/SQL> create table dupes (id integer,name varchar(10));表已创建。
insert into dupes values (1,'NBA'); insert into dupes values (2,'DNA'); insert into dupes values (3,'DNA'); insert into dupes values (4,'SINA'); insert into dupes values (5,'SUN'); insert into dupes values (6,'SUN'); insert into dupes values (7,'SUN');
delete from dupes a where exists (select NULL from dupes b where b.name = a.name and b.id > a.id);
create index idx_name_id on dupes(name,id);
delete from dupes a where exists (select NULL from dupes b where b.name = a.name and b.rowid > a.rowid);
create index idx_name on dupes(name);
SQL> select rowid as rid,
name,
row_number() over(partition by name order by id) as seq
from dupes
order by 2,3;delete
from dupes
where rowid in (select rid
from (select rowid as rid,
row_number() over(partition by name order by id)as seq
from dupes)
where seq > 1);当然还有其他写法,大家自己研究。标签:
原文地址:http://blog.csdn.net/acmman/article/details/51392417