一、插入 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. Bzoj 3145 - [Feyat cup 1.5]Str

    bzoj 3145 - [Feyat cup 1.5]Str Description 给你两个长度\(10^5\)级别的串\(S, T\) 求\(S,T\)的最长模糊匹配公共子串 模糊匹配 : 至多一 ...

  2. rpm包安装mysql5.6.*版本

    1.查看是否已经安装Mysql rpm -qa | grep -i mysql #删除已经安装的Mysql程序 rpm -ev *****.rpm 2.检查是否还有残留mysql文件夹 find / ...

  3. Docker(五):镜像

    一,什么是镜像? Docker的镜像文件是由文件系统叠加而成的.最底端是一个引导文件系统,即bootfs.Docker用户几乎永远没有机会和引导文件有什么交互,实际上,当一个容器启动之后,容器就会被移 ...

  4. nslookup命令详解【转】

    转自:http://blog.chinaunix.net/uid-28933499-id-3750357.html NSlookup命令的用法 用了域名服务器后,经常要查询域名的解析情况,nslook ...

  5. idea 快速生成代码的快捷键

     psvm 加ab键   mian方法快速生成 sout 加tab键   输出打印快捷键  alt+insert      快速生成get  set 方法 itar 生成array for代码块 fo ...

  6. RecyclerView的Item和Item内的控件点击处理

    需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...

  7. hihoCoder #1586 : Minimum-结构体版线段树(单点更新+区间最值求区间两数最小乘积) (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description You are give ...

  8. ACM的奇计淫巧_输入挂

    什么是输入挂? 众所周知scanf比cin快的多,那么有没有比scanf更快的东西呢?答案就是输入挂,输入挂利用了告诉读取的函数getchar(),然后再人工处理成整数或浮点,比使用scanf快太多. ...

  9. Java分布式服务框架Dubbo初探(待实践)

    Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...

  10. ios为app应用添加icon

    在工程中打开plist文件,添加,选择icon files,然后添加不同分辨率的icon名称即可.如果clean后再运行程序还是没有看到效果,那么就删除掉app包然后 再次运行就可以看到效果了.