Oracle SQL 查询优化.Part4
一、插入 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的更多相关文章
- Oracle SQL 硬解析和子游标
Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一 ...
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- Oracle SQL执行缓慢的原因以及解决方案
以下的文章抓哟是对Oracle SQL执行缓慢的原因的分析,如果Oracle数据库中的某张表的相关数据已是2亿多时,同时此表也创建了相关的4个独立的相关索引.由于业务方面的需要,每天需分两次向此表中 ...
- Oracle SQL Developer 连接 MySQL
1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...
- Oracle sql连接
inner-join left-outer-join right-outer-join full- ...
- 解决Oracle SQL Developer无法连接远程服务器的问题
在使用Oracle SQL Developer连接远程服务器的时候,出现如下的错误 在服务器本地是可以正常连接的.这个让人想起来,跟SQL Server的一些设计有些类似,服务器估计默认只在本地监听, ...
- Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...
- Oracle SQL explain/execution Plan
From http://blog.csdn.net/wujiandao/article/details/6621073 1. Four ways to get execution plan(anyti ...
- 处理 Oracle SQL in 超过1000 的解决方案
处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错.这主要是oracle考虑性能问题做的限制.如果要解 ...
随机推荐
- html5 的 webScoket 和 C# 建立Socket连接
最近使用的web项目中,需要服务器直接触发前端显示效果. 所以研究了一下websocket: 名词解释: WebSocketWebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样 ...
- Ant自动打包
在ant的官网http://ant.apache.org进行下载后apache-ant-1.8.2包 解压(存放的路径不要有中文字符) 把ant里的lib设置到环境变量:E:\Android\apac ...
- updatepanel的使用【他人经验+原创 完整例子】
原文发布时间为:2009-05-16 -- 来源于本人的百度文章 [由搬家工具导入] 刚上传的代码,不知道能不能下载:[源码包含所有ajax控件的简单使用] http://www.xmaspx.com ...
- 自定义JavaScript字典类jsdictionary.js
/* Dictionary类:本类实现了字典功能,所有方法.属性都模仿System..Collection.Generic.Dictionary类 构造函数: Dictionary() 属性: Com ...
- [java]编程的智慧(转)
编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,把简单的事情 ...
- linux下kodi没有声音的解决
前几天,心血来潮,就安装了manjaro的pre3版本,由于是mini kde版本的,就随手安装了kodi,可以用来看视频,听音乐和看图片. 结果在所有插件都折腾好了之后发现,在屏幕的右上角有一个喇叭 ...
- i2c 协议解析【转】
转自:http://blog.csdn.net/g_salamander/article/details/8016698 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.基本概念 主机 ...
- Java发送邮件----自己封装的方法
发送邮件的封装类: package com.email; import java.util.Properties; import javax.mail.Authenticator; import ja ...
- 怎样在action中获得值栈ValueStack中的值
1,实现RequestAware接口 //模拟对象 User model=new User(); user.setName=“lisi”;2,ValueStack value=(Value ...
- [置顶]
zabbix告警信息-lykchat信息发送系统
lykchat信息发送系统 lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送 ...