`

plsql高级操作

sql 
阅读更多

627

---group by 子句的增强

--rollup
使用Rollup 产生常规分组汇总行以及分组小计
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);
▲Rollup 后面跟了n个字段,就将进行n+1次分组,从左到右每次减少一个字段进行分组;
然后进行union

--cube
在Group By 中使用Cube 产生Rollup结果集+ 多维度的交叉表数据源:
SELECT department_id, job_id, SUM(salary)
  FROM employees
WHERE department_id < 60
GROUP BY CUBE(department_id, job_id);
▲Cube 后面跟了n个字段,就将进行2的N次方的分组运算,然后进行;

--grouping函数
当用rollup和cube进行分组时,可以使用grouping函数判断哪些行是针对那些列或者列的组合进行
分组运算的结果的,没有被Grouping到返回1,否则返回0
SELECT department_id DEPTID,
       job_id JOB,
       SUM(salary),
       GROUPING(department_id) GRP_DEPT,
       GROUPING(job_id) GRP_JOB
  FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);

--使用Grouping Set 来代替多次UNION
SELECT department_id, job_id, manager_id, avg(salary)
  FROM employees
GROUP BY GROUPING SETS((department_id, job_id),(job_id, manager_id));



---子查询进阶

--非相关子查询当作一张表来用
SELECT a.last_name, a.salary, a.department_id, b.salavg
  FROM employees a,
       (SELECT department_id, AVG(salary) salavg
          FROM employees
         GROUP BY department_id) b
WHERE a.department_id = b.department_id
   AND a.salary > b.salavg;

--相关子查询,子查询中参考了主表
SELECT last_name, salary, department_id
  FROM employees
outer WHERE salary > (SELECT AVG(salary)
                         FROM employees
                        WHERE department_id = outer.department_id);

--exists 操作
SELECT employee_id, last_name, job_id, department_id
  FROM employees
outer WHERE EXISTS
(SELECT 'X' FROM employees WHERE manager_id = outer.employee_id

--使用with子句
WITH dept_costs AS
(SELECT d.department_name, SUM(e.salary) AS dept_total
    FROM employees e, departments d
   WHERE e.department_id = d.department_id
   GROUP BY d.department_name),
avg_cost AS
(SELECT SUM(dept_total) / COUNT(*) AS dept_avg FROM dept_costs)
SELECT *
  FROM dept_costs
WHERE dept_total > (SELECT dept_avg FROM avg_cost)
ORDER BY department_name;



---递归查询

SELECT LEVEL, column, expr .. .
  FROM table
WHERE condition(s)
START WITH condition(s)
CONNECT BY PRIOR condition(s);
-查询从101开始,从下往上的各级员工。
SELECT employee_id, last_name, job_id, manager_id
  FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id;

--使用level关键字和lpad函数,显示树形层次
SELECT LPAD(last_name, LENGTH(last_name) + (LEVEL * 2) - 2, '_') AS org_chart
  FROM employees
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id


---insert增强

--一个来源插入多个目标表
INSERT ALL INTO sal_history
VALUES
  (EMPID, HIREDATE, SAL) INTO mgr_history
VALUES
  (EMPID, MGR, SAL)
  SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR
    FROM employees
   WHERE employee_id > 200;

--一个来源插入多个目标表(有条件,首次匹配即跳到下一条)
INSERT FIRST WHEN SAL > 25000 THEN INTO special_sal
VALUES
  (DEPTID, SAL) WHEN HIREDATE like
  ('%00%') THEN INTO hiredate_history_00
VALUES
  (DEPTID, HIREDATE) WHEN HIREDATE like
  ('%99%') THEN INTO hiredate_history_99
VALUES
  (DEPTID, HIREDATE) ELSE INTO hiredate_history
VALUES
  (DEPTID, HIREDATE)
  SELECT department_id DEPTID, SUM(salary) SAL, MAX(hire_date) HIREDATE
    FROM employees
   GROUP BY department_id;

--列转行(一行变多行,交叉报表的反操作)。
INSERT ALL INTO sales_info
VALUES
  (employee_id, week_id, sales_MON) INTO sales_info
VALUES
  (employee_id, week_id, sales_TUE) INTO sales_info
VALUES
  (employee_id, week_id, sales_WED) INTO sales_info
VALUES
  (employee_id, week_id, sales_THUR) INTO sales_info
VALUES
  (employee_id, week_id, sales_FRI)
  SELECT EMPLOYEE_ID,
         week_id,
         sales_MON,
         sales_TUE,
         sales_WED,
         sales_THUR,
         sales_FRI
    FROM sales_source_data;





分享到:
评论

相关推荐

    PLSQL高级编程-结构化编程

    本主题“PLSQL高级编程-结构化编程”主要关注如何利用PLSQL进行高效、结构化的程序设计。以下是对这个主题的详细讲解: 一、PLSQL基础 PLSQL由三部分组成:声明部分(DECLARE)、执行部分(BEGIN...END)和异常处理...

    PLSQL高级功能培训示例脚本

    这个“PLSQL高级功能培训示例脚本”压缩包显然包含了用于教育和实践的代码片段,帮助学习者深入理解PLSQL的各种高级特性。下面将详细介绍这些高级功能。 1. **存储过程和函数**:在PLSQL中,存储过程和函数是可重复...

    plsql高级应用以及开发

    在"plsql高级应用以及开发"这个主题中,我们将深入探讨PL/SQL的一些高级特性、最佳实践以及如何利用它们进行高效开发。 1. **块结构**:PL/SQL的基本结构包括声明部分、执行部分和异常处理部分。声明部分用于声明...

    PLSQL高级编程

    根据提供的文件内容,我们可以提取出关于PLSQL高级编程的一些详细知识点。 首先,“PLSQL高级编程”标题指出本书的内容主要涉及Oracle数据库中PLSQL编程的深入知识和应用,重点讲解了函数、包、存储过程和触发器等...

    Oracle8i PLSQL 高级程序设计.pdf

    ```plsql DECLARE -- 声明将在 SQL 语句中使用的变量 v_NewMajor VARCHAR2(10) := 'History'; v_FirstName VARCHAR2(10) := 'Scott'; v_LastName VARCHAR2(10) := 'Urman'; BEGIN -- 更新学生表 UPDATE ...

    PLSQL 操作学习文档

    在“精通Oracle.10g.Pl.SQL编程.pdf”这份文档中,可能会深入讲解Oracle 10g版本下的PLSQL编程,包括更多的高级特性、最佳实践和实际案例。通过系统学习这些内容,你将能够熟练地使用PLSQL Developer进行数据库开发...

    Oracle+PLSQL+高级程序设计

    通过深入学习"Oracle+PLSQL+高级程序设计",开发者不仅可以掌握数据库的基本操作,还能进一步提升在性能优化、并发控制、安全性以及高可用性等方面的专业技能,从而在实际工作中发挥更大的价值。

    PLSQL经典教程

    学习Oracle很好很全的资料,从PLSQL基础操作到高级操作,Oracle的高级编程,涉及全面

    PLSQL高级编程资料

    PL/SQL提供了针对索引表的一系列函数,这些函数可以帮助开发者更好地管理和操作索引表。 **示例代码:** ```plsql DECLARE TYPE emp_table IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER; emps emp_...

    plsql数据库操作工具

    这个“plsql数据库操作工具”很显然指的是PL/SQL Developer的某个版本,可能是9.0.6版,因为文件列表中有`plsqldev906.exe`这个文件。`32位`说明该版本适用于32位操作系统。`chinese.exe`可能包含的是中文语言包,...

    oracle plsql常见操作练习

    总的来说,“Oracle PL/SQL常见操作练习”涵盖了从基础语法到高级特性的广泛内容,是提升数据库管理和开发技能的重要资源。通过学习和实践,你可以更有效地设计、实施和维护Oracle数据库应用程序,提升工作效率。...

    plsql 高级开发、运行、跟踪和调试

    ### PL/SQL 高级开发、运行、跟踪和调试 #### 1.1 为什么引入 PL/SQL 语言 在数据库领域,Oracle 提供了一种强大的编程语言——PL/SQL (Procedural Language for SQL),它结合了 SQL 的强大查询能力和传统编程语言...

    PlSql中的 CnPlugin 插件

    而CnPlugin是针对PLSQL Developer设计的一款增强型插件,它的目标是进一步提升用户的工作效率,通过自定义快捷键等功能,使得日常操作更加便捷。 CnPlugin的核心特点在于其自定义快捷键的能力。在数据库开发过程中...

    高级PLSQL教程讲解

    本高级PLSQL教程将深入探讨这一主题,帮助你提升数据库管理和应用开发的技能。 首先,PLSQL由三个主要部分组成:声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量、游标和过程;执行部分是实际的业务...

    PLSQL developer 64 位

    PLSQL Developer是一款强大的Oracle数据库开发工具,专为64位操作系统设计。这款工具以其直观的用户界面、高效的代码编辑器和全面的调试功能而受到广大数据库管理员和开发者的青睐。在"PLSQLDeveloper_解压版(64位...

    PLSQL操作大全Oracle数据库

    5. PL/SQL高级特性: - 包(PACKAGE):将相关的过程和函数组合在一起,提供更好的代码组织和封装。 - 表类型(TABLE OF):定义可存储多个值的PL/SQL变量,类似数组,方便处理集合数据。 - 异步处理:通过DBMS_...

Global site tag (gtag.js) - Google Analytics