一、插入 insert 操作:

1. 复制表结构但不新增数据:

-- 复制表结构但不插入数据
create table emp_new as select * from emp where 1 = 2;
select * from emp_new;

2. 利用 with check option,配合视图,能够为插入数据操作做一些限制:

-- with check optiom 限制数据的插入
insert into (select empno, deptno, empname, empsalary, empdesc
from emp
where emp.deptno <> 'dept02'-- with check option
)
values('emp008', 'dept02', 'Ross', 7000, '对行业发展趋势有较强的洞察力。有统筹全局能力');

运行报错:ORA-01402:视图 WITH CHECK OPTIDN违反 where子句

3. 多表插入:

这里讲三种多表插入:a. 无条件 insert;b. 有条件 insert;c. insert first。

  • 无条件 insert all

先将 emp 和 emp_bak 清空,再运行下边 sql:

-- 无条件 insert all
insert all
into emp_new1
into emp_new2
select * from emp;

此语是将 emp 的数据同一时候插入到 emp_new1、emp_new2 表里,运行 select * from emp_new1 的结果例如以下(emp_new2 的数据集也是如此):

  • 有条件 insert all
-- 有条件 insert all
insert all
when empsalary < 5000
then into emp_new1
when empsalary > 3000
then into emp_new2
select * from emp;

运行上边 sql 后,工资(empsalary)小于 5000 的员工信息插入 emp_new1。工资(empsalary)大于 3000 的员工信息插入 dept_new2。当中 empsalary 为 4000 的同一时候插入了 emp_new1 和 emp_new2,有时候须要插入指定的表。这个在下边讲

  • insert first

insert first  假设前边有条件符合。后边的表就不会插入相应的行:

-- insert first
insert first
when empsalary < 5000
then into emp_new1
when empsalary > 3000
then into emp_new2
when empsalary > 3000
then into emp_new3
select * from emp;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

emp_new2 不会插入 empsalary 为 4000 的这条记录,emp_new3 没有记录插入。

二、更新 update 操作:

1. 利用 select 子查询进行 update。须要注意避免全表更新:

数据准备,先将 emp_new1 中全部记录的 empdesc 置为 “未填写”

如今准备依据 emp_new1 表中的记录去更新 emp 表中 empno 相应记录的 empdesc,好多人会写成例如以下 sql:

-- 利用 select 进行 update 进行了全表更新
update emp
set emp.empdesc =
(select empdesc
from emp_new1
where emp.empno = emp_new1.empno
);

上边的结果说明,这个 update 操作的 sql 进行了全表扫描。

对 empno 没有匹配到的记录,均被更新为 null

其实应该加上 where 语句才是正确的:

update emp
set emp.empdesc =
(select empdesc
from emp_new1
where emp.empno = emp_new1.empno
)
where exists (select 1
from emp_new1
where emp.empno = emp_new1.empno
)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

2. merge into 语句:

针对上边的语句,能够用 merge into 语句

-- merge into 的实现方法
merge into emp
using (select *
from emp_new1
) e
on (e.empno = emp.empno)
when matched then
update set emp.empdesc = e.empdesc;

执行结果和 1 中结果一样,假设做推断。推荐使用 merge into 方法。

由于 merge into 仅仅訪问一次 emp_new1。

三、删除 delete 操作

1. 删除反复记录:

方法有非常多种,这里仅仅说一种,利用分析函数分组。推断 分组序号是否大于 1.

delete
from emp
where rowid in (select rid
from (select rowid as rid,
row_number() over(partition by empsalary order by empno asc) as seq
from emp
)
where seq > 1
);

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

可是,假设须要删除全然同样的两条数据中的一条,须要在 partition by 后边加上全部列名,否则删除哪条数据并不确定,删掉记录是和 order by 语句相关的。

Oracle SQL 查询优化.Part4的更多相关文章

  1. Oracle SQL 硬解析和子游标

    Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一 ...

  2. Oracle SQL性能优化技巧大总结

    http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...

  3. Oracle SQL执行缓慢的原因以及解决方案

     以下的文章抓哟是对Oracle SQL执行缓慢的原因的分析,如果Oracle数据库中的某张表的相关数据已是2亿多时,同时此表也创建了相关的4个独立的相关索引.由于业务方面的需要,每天需分两次向此表中 ...

  4. Oracle SQL Developer 连接 MySQL

    1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...

  5. Oracle sql连接

    inner-join                    left-outer-join                 right-outer-join                 full- ...

  6. 解决Oracle SQL Developer无法连接远程服务器的问题

    在使用Oracle SQL Developer连接远程服务器的时候,出现如下的错误 在服务器本地是可以正常连接的.这个让人想起来,跟SQL Server的一些设计有些类似,服务器估计默认只在本地监听, ...

  7. Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...

  8. Oracle SQL explain/execution Plan

    From http://blog.csdn.net/wujiandao/article/details/6621073 1. Four ways to get execution plan(anyti ...

  9. 处理 Oracle SQL in 超过1000 的解决方案

    处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错.这主要是oracle考虑性能问题做的限制.如果要解 ...

随机推荐

  1. html5 的 webScoket 和 C# 建立Socket连接

    最近使用的web项目中,需要服务器直接触发前端显示效果. 所以研究了一下websocket: 名词解释: WebSocketWebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样 ...

  2. Ant自动打包

    在ant的官网http://ant.apache.org进行下载后apache-ant-1.8.2包 解压(存放的路径不要有中文字符) 把ant里的lib设置到环境变量:E:\Android\apac ...

  3. updatepanel的使用【他人经验+原创 完整例子】

    原文发布时间为:2009-05-16 -- 来源于本人的百度文章 [由搬家工具导入] 刚上传的代码,不知道能不能下载:[源码包含所有ajax控件的简单使用] http://www.xmaspx.com ...

  4. 自定义JavaScript字典类jsdictionary.js

    /* Dictionary类:本类实现了字典功能,所有方法.属性都模仿System..Collection.Generic.Dictionary类 构造函数: Dictionary() 属性: Com ...

  5. [java]编程的智慧(转)

    编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,把简单的事情 ...

  6. linux下kodi没有声音的解决

    前几天,心血来潮,就安装了manjaro的pre3版本,由于是mini kde版本的,就随手安装了kodi,可以用来看视频,听音乐和看图片. 结果在所有插件都折腾好了之后发现,在屏幕的右上角有一个喇叭 ...

  7. i2c 协议解析【转】

    转自:http://blog.csdn.net/g_salamander/article/details/8016698 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.基本概念 主机    ...

  8. Java发送邮件----自己封装的方法

    发送邮件的封装类: package com.email; import java.util.Properties; import javax.mail.Authenticator; import ja ...

  9. 怎样在action中获得值栈ValueStack中的值

    1,实现RequestAware接口 //模拟对象    User model=new User();    user.setName=“lisi”;2,ValueStack value=(Value ...

  10. [置顶] zabbix告警信息-lykchat信息发送系统

    lykchat信息发送系统 lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送 ...