Oracle SQL精妙SQL语句讲解(二)

- 如果存在就更新,不存在就插入用一个语句实现

DROP TABLE t_mg;

CREATE TABLE t_mg(code VARCHAR2(10), NAME VARCHAR2(10));

SELECT * FROM t_mg;

MERGE INTO t_mg a

USING (SELECT ‘the code‘ code, ‘the name‘ NAME FROM dual) b

ON (a.code = b.code)

WHEN MATCHED THEN

UPDATE SET a.NAME = b.NAME

WHEN NOT MATCHED THEN

INSERT (code, NAME) VALUES (b.code, b.NAME);

-- 抽取/删除重复记录

DROP TABLE t_dup;

CREATE TABLE t_dup AS SELECT ‘code_‘||ROWNUM code,
dbms_random.string(‘z‘,5)NAME FROM dual CONNECT BY ROWNUM<=10;

INSERT INTO t_dup SELECT ‘code_‘||ROWNUM code, dbms_random.string(‘z‘,5)
NAMEFROM dual CONNECT BY ROWNUM<=2;

SELECT * FROM t_dup;

SELECT * FROM t_dup aWHERE a.ROWID <> (SELECT
MIN(b.ROWID) FROM t_dup b WHERE a.code=b.code);

SELECT b.code, b.NAME

FROM (SELECT a.code,

a.NAME,

row_number() over(PARTITION BY a.code ORDER BY a.ROWID) rn

FROM t_dup a) b

WHERE b.rn > 1;

-- IN/EXISTS的不同适用环境

-- t_orders.customer_id有索引

SELECT a.*

FROM t_employees a

WHERE a.employee_id IN

(SELECT b.sales_rep_id FROM t_orders b WHERE b.customer_id = 12);

SELECT a.*

FROM t_employees a

WHERE EXISTS (SELECT 1

FROM t_orders b

WHERE b.customer_id = 12

AND a.employee_id = b.sales_rep_id);

--t_employees.department_id有索引

SELECT a.*

FROM t_employees a

WHERE a.department_id = 10

AND EXISTS

(SELECT 1 FROM t_orders b WHERE a.employee_id = b.sales_rep_id);

SELECT a.*

FROM t_employees a

WHERE a.department_id = 10

AND a.employee_id IN (SELECT b.sales_rep_id FROM t_orders b);

-- FBI

DROP TABLE t_fbi;

CREATE TABLE t_fbi AS

SELECT ROWNUM rn, dbms_random.STRING(‘z‘,10) NAME , SYSDATE + dbms_random.VALUE*
10 dt FROM dual

CONNECT BY ROWNUM <=10;

CREATE INDEX idx_nonfbiON t_fbi(dt);

DROP INDEX idx_fbi_1;

CREATE INDEX idx_fbi_1 ON t_fbi(trunc(dt));

SELECT * FROM t_fbiWHERE trunc(dt) =
to_date(‘2006-09-21‘,‘yyyy-mm-dd‘) ;

-- 不建议使用

SELECT * FROM t_fbi WHERE to_char(dt, ‘yyyy-mm-dd‘) = ‘2006-09-21‘;

-- LOOP中的COMMIT/ROLLBACK

DROP TABLE t_loop PURGE;

create TABLE t_loop AS SELECT * FROM user_objects WHERE 1=2;

SELECT * FROM t_loop;

-- 逐行提交

DECLARE

BEGIN

FOR cur IN (SELECT * FROM user_objects) LOOP

INSERT INTO t_loop VALUES cur;

COMMIT;

END LOOP;

END;

-- 模拟批量提交

DECLARE

v_count NUMBER;

BEGIN

FOR cur IN (SELECT * FROM user_objects) LOOP

INSERT INTO t_loop VALUES cur;

v_count := v_count + 1;

IF v_count >= 100 THEN

COMMIT;

END IF;

END LOOP;

COMMIT;

END;

-- 真正的批量提交

DECLARE

CURSOR cur IS

SELECT * FROM user_objects;

TYPE rec IS TABLE OF user_objects%ROWTYPE;

recs rec;

BEGIN

OPEN cur;

WHILE (TRUE) LOOP

FETCH cur BULK COLLECT

INTO recs LIMIT 100;

-- forall 实现批量

FORALL i IN 1 .. recs.COUNT

INSERT INTO t_loop VALUES recs (i);

COMMIT;

EXIT WHEN cur%NOTFOUND;

END LOOP;

CLOSE cur;

END;

时间: 2024-10-05 02:39:48

Oracle SQL精妙SQL语句讲解(二)的相关文章

Oracle SQL精妙SQL语句讲解(一)

DROP TABLEt_change_lc; CREATE TABLE t_change_lc (card_code VARCHAR2(3), q NUMBER, bal NUMBER); INSERT INTOt_change_lc SELECT '001' card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dualCONNECT BY ROWNUM <= 4 UNION SELECT '002' card_code, R

第十二课:Python语句讲解二

一.复习1. 控制流的基本组成部分 条件,执行代码块2. if的基本格式 if expression: statement(s) 3. 控制流的条件表达式(expression)结果, 必须为True真, 语句才能执行下去,这一点切记.4. 冒号永远不要忘记. 尽量用4个空格,不用TAB 制表符 if not True: # 不能写 if False: print 4; 二.while语句1. while的基本格式 while expression: statement(s) 2. while的

精妙sql语句_学习

说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 说明:显示文章.提交人和最后回复时间 SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from ta

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

精妙SQL语句 基础

精妙SQL语句SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句,整理一份<精妙SQL速查手册>,不吝赐教! 一.基础1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname 3.说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC s

Oracle数据库常用Sql语句大全

一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --)  SELECT (字段名1, 字段名2, --) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY' 如果字段值里包含单引号' 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过

oracle学习笔记 SQL语句执行过程剖析讲课

oracle学习笔记 SQL语句执行过程剖析讲课 这节课通过讲述一条SQL语句进入数据库 和其在数据库中的整个的执行过程 把数据库里面的体系结构串一下. 让大家再进一步了解oracle数据库里面的各个进程.存储结构以及内存结构的关联关系. 首先来讲整个体系中有客户端.实例和数据库 数据库里有三类文件 控制文件ctl.数据文件dbf.日志文件log 实例中SGA有六大池子 第一大内存区shared pool即共享池 第二大内存区buffer cache 第三块是redo log 我们主要讲上面的三

Oracle数据库的sql语句性能优化

在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要问题之一.系统优化中一个很重要的方面就是sql语句的优化.对于海量数据,劣质sql语句和优质sql语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就行,而是要写出高质量的sql语句,提高系统的可用性. Oracle的sql调优第一个复杂的主题,甚至需要长

Oracle SQL语言DML语句与事务_超越OCP精通Oracle视频教程培训28

Oracle SQL语言DML语句与事务_超越OCP精通Oracle视频教程培训28 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第3/5套:Oracle SQL语言DML语句与事务.主要学习Oracle数据库SQL语句INSERT命令,学习使用UPDATE命令,学习使用DELETE命令,学习创建PL/SQL对象,事务概念与控制,锁的检测和锁争用,了解撤销数据. Oracle SQL语言DML语句与事务管理,课