`
hcwj2009
  • 浏览: 26750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle sql

阅读更多
--行列转换 行转列  
DROP TABLE t_change_lc;  
CREATE TABLE t_change_lc (card_code VARCHAR2(3), q NUMBER, bal NUMBER);  
  
INSERT INTO t_change_lc   
SELECT '001' card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM <= 4  
UNION   
SELECT '002' card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM <= 4;  
  
SELECT * FROM t_change_lc;  
  
SELECT a.card_code,  
       SUM(decode(a.q, 1, a.bal, 0)) q1,  
       SUM(decode(a.q, 2, a.bal, 0)) q2,  
       SUM(decode(a.q, 3, a.bal, 0)) q3,  
       SUM(decode(a.q, 4, a.bal, 0)) q4  
  FROM t_change_lc a  
GROUP BY a.card_code  
ORDER BY 1;  
  
--行列转换 列转行  
DROP TABLE t_change_cl;  
CREATE TABLE t_change_cl AS   
SELECT a.card_code,  
       SUM(decode(a.q, 1, a.bal, 0)) q1,  
       SUM(decode(a.q, 2, a.bal, 0)) q2,  
       SUM(decode(a.q, 3, a.bal, 0)) q3,  
       SUM(decode(a.q, 4, a.bal, 0)) q4  
  FROM t_change_lc a  
GROUP BY a.card_code  
ORDER BY 1;  
  
SELECT * FROM t_change_cl;  
  
SELECT t.card_code,  
       t.rn q,  
       decode(t.rn, 1, t.q1, 2, t.q2, 3, t.q3, 4, t.q4) bal  
  FROM (SELECT a.*, b.rn  
          FROM t_change_cl a,  
               (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= 4) b) t  
ORDER BY 1, 2;  
  
--行列转换 行转列 合并  
DROP TABLE t_change_lc_comma;  
CREATE TABLE t_change_lc_comma AS SELECT card_code,'quarter_'||q AS q FROM t_change_lc;   
  
SELECT * FROM t_change_lc_comma;  
  
SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q  
  FROM (SELECT a.card_code,  
               a.q,  
               row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn  
          FROM t_change_lc_comma a) t1  
START WITH t1.rn = 1  
CONNECT BY t1.card_code = PRIOR t1.card_code  
       AND t1.rn - 1 = PRIOR t1.rn  
GROUP BY t1.card_code;  
  
--行列转换 列转行 分割  
DROP TABLE t_change_cl_comma;  
CREATE TABLE t_change_cl_comma  AS  
SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q  
  FROM (SELECT a.card_code,  
               a.q,  
               row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn  
          FROM t_change_lc_comma a) t1  
START WITH t1.rn = 1  
CONNECT BY t1.card_code = PRIOR t1.card_code  
       AND t1.rn - 1 = PRIOR t1.rn  
GROUP BY t1.card_code;  
  
SELECT * FROM t_change_cl_comma;  
  
SELECT t.card_code,  
       substr(t.q,  
              instr(';' || t.q, ';', 1, rn),  
              instr(t.q || ';', ';', 1, rn) - instr(';' || t.q, ';', 1, rn)) q  
  FROM (SELECT a.card_code, a.q, b.rn  
          FROM t_change_cl_comma a,  
               (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= 100) b  
         WHERE instr(';' || a.q, ';', 1, rn) > 0) t  
ORDER BY 1, 2;  
  
  
-- 实现一条记录根据条件多表插入  
DROP TABLE t_ia_src;  
CREATE TABLE t_ia_src AS SELECT 'a'||ROWNUM c1, 'b'||ROWNUM c2 FROM dual CONNECT BY ROWNUM<=5;  
DROP TABLE t_ia_dest_1;  
CREATE TABLE t_ia_dest_1(flag VARCHAR2(10) , c VARCHAR2(10));  
DROP TABLE t_ia_dest_2;  
CREATE TABLE t_ia_dest_2(flag VARCHAR2(10) , c VARCHAR2(10));  
DROP TABLE t_ia_dest_3;  
CREATE TABLE t_ia_dest_3(flag VARCHAR2(10) , c VARCHAR2(10));  
  
SELECT * FROM t_ia_src;   
SELECT * FROM t_ia_dest_1;  
SELECT * FROM t_ia_dest_2;  
SELECT * FROM t_ia_dest_3;  
  
INSERT ALL  
WHEN (c1 IN ('a1','a3')) THEN   
INTO t_ia_dest_1(flag,c) VALUES(flag1,c2)  
WHEN (c1 IN ('a2','a4')) THEN   
INTO t_ia_dest_2(flag,c) VALUES(flag2,c2)  
ELSE  
INTO t_ia_dest_3(flag,c) VALUES(flag1||flag2,c1||c2)  
SELECT c1,c2, 'f1' flag1, 'f2' flag2 FROM t_ia_src;  
  
-- 如果存在就更新,不存在就插入用一个语句实现  
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) NAME FROM dual CONNECT BY ROWNUM<=2;   
  
SELECT * FROM t_dup;  
  
SELECT * FROM t_dup a WHERE 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_nonfbi ON t_fbi(dt);  
  
DROP INDEX idx_fbi_1;  
CREATE INDEX idx_fbi_1 ON t_fbi(trunc(dt));  
  
SELECT * FROM t_fbi WHERE 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;  
  
-- 悲观锁定/乐观锁定   
DROP TABLE t_lock PURGE;  
CREATE TABLE t_lock AS SELECT 1 ID FROM dual;  
  
SELECT * FROM t_lock;  
  
-- 常见的实现逻辑,隐含bug  
DECLARE  
  v_cnt NUMBER;  
BEGIN  
  -- 这里有并发性的bug  
  SELECT MAX(ID) INTO v_cnt FROM t_lock;  
  
  -- here for other operation  
  v_cnt := v_cnt + 1;  
  INSERT INTO t_lock (ID) VALUES (v_cnt);  
  COMMIT;  
END;  
  
-- 高并发环境下,安全的实现逻辑  
DECLARE  
  v_cnt NUMBER;  
BEGIN  
  -- 对指定的行取得lock  
  SELECT ID INTO v_cnt FROM t_lock WHERE ID=1 FOR UPDATE;  
  -- 在有lock的情况下继续下面的操作  
  SELECT MAX(ID) INTO v_cnt FROM t_lock;  
  
  -- here for other operation  
  v_cnt := v_cnt + 1;  
  INSERT INTO t_lock (ID) VALUES (v_cnt);  
  COMMIT; --提交并且释放lock  
END;  
  
-- 硬解析/软解析  
DROP TABLE t_hard PURGE;  
CREATE TABLE t_hard (ID INT);  
  
SELECT * FROM t_hard;  
  
DECLARE  
  sql_1   VARCHAR2(200);  
BEGIN  
  -- hard parse  
  -- java中的同等语句是 Statement.execute()  
  FOR i IN 1 .. 1000 LOOP  
    sql_1 := 'insert into t_hard(id) values(' || i || ')';  
    EXECUTE IMMEDIATE sql_1;  
  END LOOP;  
  COMMIT;  
  
  -- soft parse  
  --java中的同等语句是 PreparedStatement.execute()  
  sql_1   := 'insert into t_hard(id) values(:id)';  
  FOR i IN 1 .. 1000 LOOP  
    EXECUTE IMMEDIATE sql_1  
      USING i;  
  END LOOP;  
  COMMIT;  
END;  
  
  
  
-- 正确的分页算法   
SELECT *  
  FROM (SELECT a.*, ROWNUM rn  
          FROM (SELECT * FROM t_employees ORDER BY first_name) a  
         WHERE ROWNUM <= 500)  
WHERE rn > 480 ;  
  
-- 分页算法(why not this one)  
SELECT a.*, ROWNUM rn  
  FROM (SELECT * FROM t_employees ORDER BY first_name) a  
WHERE ROWNUM <= 500 AND ROWNUM > 480;  
  
-- 分页算法(why not this one)  
SELECT b.*  
  FROM (SELECT a.*, ROWNUM rn  
          FROM t_employees a  
         WHERE ROWNUM < = 500  
         ORDER BY first_name) b  
WHERE b.rn > 480;  
  
-- OLAP  
-- 小计合计  
SELECT CASE  
         WHEN a.deptno IS NULL THEN  
          '合计'  
         WHEN a.deptno IS NOT NULL AND a.empno IS NULL THEN  
          '小计'  
         ELSE  
          '' || a.deptno  
       END deptno,  
       a.empno,  
       a.ename,  
       SUM(a.sal) total_sal  
  FROM scott.emp a  
GROUP BY GROUPING SETS((a.deptno),(a.deptno, a.empno, a.ename),());  
  
-- 分组排序  
SELECT a.deptno,  
       a.empno,  
       a.ename,  
       a.sal,  
       -- 可跳跃的rank  
       rank() over(PARTITION BY a.deptno ORDER BY a.sal DESC) r1,  
       -- 密集型rank  
       dense_rank() over(PARTITION BY a.deptno ORDER BY a.sal DESC) r2,  
       -- 不分组排序  
       rank() over(ORDER BY sal DESC) r3  
  FROM scott.emp a  
  ORDER BY a.deptno,a.sal DESC;  
    
-- 当前行数据和前/后n行的数据比较  
SELECT a.empno,  
       a.ename,  
       a.sal,  
       -- 上面一行  
       lag(a.sal) over(ORDER BY a.sal DESC) lag_1,  
       -- 下面三行  
       lead(a.sal, 3) over(ORDER BY a.sal DESC) lead_3  
  FROM scott.emp a  
ORDER BY a.sal DESC;  


-- 实现一条记录根据条件多表插入

  DROP TABLE t_ia_src;

  CREATE TABLE t_ia_src AS SELECT 'a'||ROWNUM c1, 'b'||ROWNUM c2 FROM dual CONNECT BY ROWNUM<=5;

  DROP TABLE t_ia_dest_1;

  CREATE TABLE t_ia_dest_1(flag VARCHAR2(10) , c VARCHAR2(10));

  DROP TABLE t_ia_dest_2;

  CREATE TABLE t_ia_dest_2(flag VARCHAR2(10) , c VARCHAR2(10));

  DROP TABLE t_ia_dest_3;

  CREATE TABLE t_ia_dest_3(flag VARCHAR2(10) , c VARCHAR2(10));

  SELECT * FROM t_ia_src;

  SELECT * FROM t_ia_dest_1;

  SELECT * FROM t_ia_dest_2;

  SELECT * FROM t_ia_dest_3;

  INSERT ALL

  WHEN (c1 IN ('a1','a3')) THEN

  INTO t_ia_dest_1(flag,c) VALUES(flag1,c2)

  WHEN (c1 IN ('a2','a4')) THEN

  INTO t_ia_dest_2(flag,c) VALUES(flag2,c2)

  ELSE

  INTO t_ia_dest_3(flag,c) VALUES(flag1||flag2,c1||c2)

  SELECT c1,c2, 'f1' flag1, 'f2' flag2 FROM t_ia_src;

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

  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) NAME FROM dual CONNECT BY ROWNUM<=2;

  SELECT * FROM t_dup;

  SELECT * FROM t_dup a WHERE 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_nonfbi ON t_fbi(dt);

  DROP INDEX idx_fbi_1;

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

  SELECT * FROM t_fbi WHERE 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;

分享到:
评论

相关推荐

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    Oracle SQL高级编程

    由于标题和描述是重复的且没有提供实质性的内容,我们无法从中得知具体的Oracle SQL高级编程知识点。但是,从标题我们可以推测该文档可能是关于如何使用Oracle数据库中的SQL语言进行高级编程。Oracle数据库是一个...

    oracle SQL查询工具

    oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...

    Oracle SQL 官方文档

    Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于管理和操作Oracle数据库系统。11g第二版(11G2)是Oracle的一个重要版本,提供了许多增强功能和优化。本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL...

    Oracle Sql基础(beginning oracle sql中文版)

    Oracle SQL是数据库管理员和开发人员用来与Oracle数据库交互的语言,它是SQL标准的扩展,提供了许多特有的功能和优化。本资源“Oracle Sql基础(beginning oracle sql中文版)”旨在为初学者提供一个全面的Oracle ...

    Oracle SQL Developer 使用说明

    Oracle SQL Developer 是一款由Oracle公司推出的强大的数据库管理工具,它为数据库管理员(DBA)、开发者以及数据分析师提供了全面的功能,以高效地管理和操作Oracle数据库。本文档将深入讲解Oracle SQL Developer的...

    Oracle四大宝典之一:Oracle Sql基础 中文版

    第三章 ORACLE SQL 单行函数 第四章 从多表中查询数据 第五章 用组函数合计数据 第六章 子查询 第七章 操纵数据 第八章 创建和管理表 第九章 内置约束 第十章 创建视图 第十一章 其他数据库对象 第十二章 控制用户...

    记使用Oracle SQL Developer 迁移MySql 数据至 Oracle.docx

    本文将详细讲解如何使用Oracle SQL Developer工具进行这样的迁移过程,以及如何解决在迁移过程中遇到的问题。 首先,确保你拥有正确的工具。在这个案例中,你需要MySQL 5.6.37、Oracle 11g以及Oracle SQL Developer...

    Oracle SQL Developer Data Modeler:PDM创建指南

    内容概要:本文详细介绍了如何使用Oracle SQL Developer Data Modeler工具进行物理数据模型(PDM)的设计与创建。主要内容包括软件的安装配置,创建PDM的概念详解,基本功能操作方法以及模型设计的原则与最佳实践。...

    精通OracleSQL第2版.zip

    《精通Oracle SQL(第2版)》是一本深入解析Oracle数据库查询语言的专业书籍,由Oracle ACE和OakTable团队的专家共同撰写,集成了他们的丰富经验和专业知识。这本书旨在帮助读者掌握Oracle SQL的高级技巧,提升在...

    OracleSQL的优化.pdf

    Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...

    Oracle-SQL.rar_oracle_oracle sql_sql

    在“Oracle-SQL.rar”这个压缩包中,包含了一份名为“Oracle SQL.ppt”的文件,这可能是一个PowerPoint演示文稿,用于详细讲解Oracle数据库的基础知识和SQL语言的使用。下面,我们将深入探讨一些Oracle SQL的基础...

    oracle sql developer数据库连接成功后打不開表

    ### Oracle SQL Developer数据库连接成功后无法打开表的问题分析与解决 #### 问题概述 在使用Oracle SQL Developer工具时,部分用户可能会遇到一个较为常见的问题:虽然已经成功连接到Oracle数据库,但是在左侧的...

    Oracle SQL:经典练习题(附答案)

    Oracle SQL是数据库管理和数据分析的重要工具,尤其在处理Oracle数据库时不可或缺。本文提供的经典练习题旨在帮助初学者熟悉SQL语句的编写,特别是针对Oracle数据库特有的功能。以下将详细讲解涉及的知识点。 1. **...

    oracle sqldeveloper连接mysql、SQLServer第三方dll

    解决oracle sqldeveloper无法连接mysql、SQLServer问题,sqlDeveloper是ORACLE数据库开发工具,自带的是无法连接MS SQL Server以及mysql的,想连接的话需要第三方工具。 使用方法: 解压出来后将2个jar放入jlib...

    OracleSQLDeveloper

    Oracle SQL Developer 是一款由Oracle公司推出的免费数据库管理工具,它为数据库管理员(DBA)和开发人员提供了一个全面的集成环境,以便于管理和操作Oracle数据库。这个工具的强大之处在于其直观的用户界面和广泛的...

    oraclesql判断值为空-Oracle-sqlserver的空值(null)判断.pdf

    Oracle SQL 判断值为空OrNull 判断 Oracle SQL 中判断值为空或 Null 的方法有多种,在本文中,我们将介绍 Oracle 和 SQL Server 中的空值判断方法。 Oracle 中的空值判断 在 Oracle 中,可以使用 `NVL` 函数来...

Global site tag (gtag.js) - Google Analytics