`
黄兆廷
  • 浏览: 8526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle复杂查询操作

阅读更多
oracle复杂查询

使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.
  
  1.1相关子查询
  
  可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询
  
  .where中可以包含一个select语句的子查询
  
  .where中可以包含in,exists语句
  
  .最多可以嵌套16层
  
  .层次过多会影响性能
  
  [例]简单子查询实例
  
  查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目
  
  (按规定只能以一个单位来申请)
  
  SQL> create table univ_subject
  2  (
  3    name         varchar2(12) not null,
  4    per_id        number   not null,
  5   dept_name    varchar2(20)
  6  );
  SQL> insert into univ_subject values('gaoqianjing',1001,'信息工程系');
  SQL> insert into univ_subject values('wangbing',1002,'物理系');
  SQL> insert into univ_subject values('liming',1003,'化学系');
  ===============
  SQL> create table colle_subject
  2   (
  3       colle_name  varchar2(20),
  4       per_id       number
  5   );
  SQL> insert into colle_subject values('电子研究所',1001);
  SQL> insert into colle_subject values('物理研究所',1005);
  ================
  SQL> select name,per_id,dept_name from univ_subject where per_id in
  2  (select per_id from colle_subject);
  
  NAME          PER_ID    DEPT_NAME
  ------------     ---------   --------------------
  gaoqianjing       1001    信息工程系
  
  1.2外连接
  
  [例]外连接实例
  
  招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果某个学生没有特长就显示特长问空.
  
  SQL> create table students
  2  (
  3    st_id  varchar2(20),
  4    name varchar2(10),
  5    age   number(2),
  6    tol_score  number(3)
  7  ) ;
  SQL>  insert into students values('973231','wangbindu',22,501);
  SQL>  insert into students values('973232','zhuzhijing',21,538);
  SQL> insert into students values('973233','gaojing',21,576);
  ===================
  
  SQL> create table student_skill
  2  (
  3   st_id varchar2(20),
  4   skill  varchar2(20)
  5 );
  SQL> insert into student_skill values('973231','篮球');
  SQL> insert into student_skill(st_id) values('973232');
  SQL> insert into student_skill values('973233','足球');
  ===================
  
  SQL>  select a.* , b.skill from students a,student_skill b where a.st_id=b.st_id(+)
  order by a.st_id;
  
  ST_ID        NAME     AGE   TOL_SCORE SKILL
  -------------------- ---------- --------- --------- ----------
  973231        wangbindu   22    501    篮球
  973232        zhuzhijing   21    538
  973233        gaojing    21    576    足球
  
  1.3自我连接
  
  自我连接是在同一个表或视图内进行条件连接.
  
  [例]自我连接实例
  
  查询每个雇员的名字和该雇员的经理的名字:
  
  SQL> select e1.ename||'  work for  '||e2.ename "Employees and their Managers"
  
  2 from scott.emp e1,scott.emp e2 where e1.mgr=e2.empno;
  
  Employees and their Managers
  -------------------------------------------------
  SMITH   work for  FORD
  ALLEN   work for  BLAKE
  WARD   work for  BLAKE
  JONES   work for  KING
  MARTIN  work for  BLAKE
  BLAKE   work for  KING
  CLARK   work for  KING
  SCOTT   work for  JONES
  TURNER work for  BLAKE
  ADAMS   work for  SCOTT
  JAMES   work for  BLAKE
  FORD    work for  JONES
  MILLER   work for  CLARK
  
  1.4UNION , INTERSECT及 MINUS
  
  UNION:      可以将两个以上的表的相类似的查询结果放在一起 (union all则表示返回所有的行)
  
  具体语法:
  
  select ...
  union[all]
  select...
  ==========
  
  INTERSECT: 返回两个表中相同的信息
  具体语法:
  select ...
  intersect
  select...
  ==========
  
  MINUS     : 返回一个表中出现的信息
  具体语法:
  select ...
  minus
  select...
  [例1]UNION操作实例
  SQL> select st_id from students
  2 union
  3 select st_id from student_skill;
  
  ST_ID
  --------------------
  973231
  973232
  973233
  
  [例2]INTERSECT操作实例
  
  列出有特长的学生的学号
  
  SQL> select st_id from students
  2 intersect
  3 select st_id from student_skill;
  ST_ID
  --------------------
  973231
  973233
  
  [例3]MINUS操作实例
  
  列出没有特长学生的学号
  
  select st_id from students
  minus
  select st_id from student_skill;
  ST_ID
  --------------------
  973232
  
  2.创建复杂的视图
  
  许多应用系统有统计等功能,建议最好把这些复杂语句写成视图.下面是几个常用的视图.
  
  2.1分组视图
  
  [例1]简单的分组视图
  
  SQL> create or replace view dept_tot as
  2 select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b
  3 where a.deptno=b.deptno group by a.dname;
  
  查看已建立。
  SQL> select * from dept_tot;
  
  DEPT       TOTAL_SAL
  --------------  ---------
  ACCOUNTING     8750
  RESEARCH      10875
  SALES       9400
  
  [例2]带复杂函数视图
  
  SQL> create or replace view itemtot as
  2 select persion,sum(amount) itemtot from ledger
  3 where actiondate between
  4 to_date('01-MAR-1901','dd-mon-yyyy') and
  5 to_date('31-MAR-1901','dd-mon-yyyy')
  6 and action in('bought','raid') group by persion;
  
  2.2合计视图
  
  [例]合计函数视图实例
  
  SQL> create or replace view emp_no1 as
  2 select deptno,sum(sal) 工资和,sum(comm) 总和
  3 from scott.emp group by deptno;
  SQL> select * from emp_no1;
  DEPTNO  工资和   总和
  -------- --------- ---------
  10     8750
  20     10875
  30     9400   2200
  
  2.3组合视图
  
  [例]带组合函数的视图
  
  SQL> create or replace view byitem as
  2 select l.persion persion.item, amount, 100*amount/item bypersion,100*amount/total bytotal
  3 from ledgent l,itemtotal i,total where l.persion=i.persion where l.persion=i.persion
  4 and actiondate between
  5 to_date('01-MAR-1901','dd-mon-yyyy') and
  6 to_date('31-MAR-1901','dd-mon-yyyy')
  7  and action in('bought','raid') ;
  
  3.家族树
  
  语法:
  select column from table_name start with column=value
  connect by prior 父主键=子主键
  
  3.1排除单一性和分枝
  
  以ORACLE中的EMP表为例
  
  [例]从顶到底列出各雇员的信息
  SQL> select lpad(' ',4*(level-1))||ename name,empno,mgr from emp start with mgr is null
  2 connect by prior empno=mgr;
  
  NAME                 EMPNO    MGR
  ---------             ---------  ---------
  KING                 7839
  JONES                7566      7839
  SCOTT                7788      7566
  ADAMS                7876      7788
  
  3.2遍历至根
  
  [例1]现在要从某个雇员开始向他的上级列出该雇员的层次结构
  
  SQL> col ename for a30;
  SQL> select lpad(' ',4*(level-1))||ename ename,mgr,empno from scott.emp
  2 start with mgr=7788 connect by prior mgr=empno;
  ENAME                MGR   EMPNO
  --------------------------    --------- ---------
  ADAMS                7788    7876
  SCOTT                7566    7788
  JONES                7839    7566
  KING                      7839
  
  [例2]列出所有雇员的层次结构
  
  SQL> select lpad(' ',4*(level-1))||ename ename,empno,mgr from scott.emp
  2 start with mgr is not null
  3 connect by empno=prior mgr;
  
  ENAME               EMPNO    MGR
  ------------------        ---------  ---------
  SMITH                7369     7902
  FORD                7902     7566
  JONES                7566     7839
  KING                7839
  ALLEN                7499     7698
  BLAKE                7698     7839
  KING                7839
  WARD                7521     7698
  BLAKE                7698     7839
  KING                7839
  JONES                7566     7839
  KING                7839
  MARTIN               7654     7698
  BLAKE                7698     7839
  KING                7839
  BLAKE                7698     7839
  KING                7839
  CLARK                7782     7839
  KING                7839
  SCOTT                7788     7566
  JONES                7566     7839

文章转载自网管网:http://www.bitscn.com/pdb/oracle/200604/16924.html
分享到:
评论

相关推荐

    oracle系列教程三+oracle复杂SQL语句.doc

    本文将深入探讨Oracle中的复杂SQL语句,包括查询优化、索引、函数的使用以及如何进行行列转换和去重操作。 首先,了解SQL语句的执行顺序至关重要。在一般的查询中,如`SELECT`、`FROM`、`WHERE`,执行顺序为:先...

    oracle开发复杂查询

    Oracle数据库是世界上最流行的数据库管理系统之一,尤其在处理复杂查询方面表现出强大的功能。本文将深入探讨Oracle9i中常用的复杂查询技术,帮助你提升SQL语言的运用水平。 首先,我们来了解查询的基本结构,它由...

    oracle 常用SQL查询

    以下是一些常用的Oracle SQL查询,这些查询涵盖了从基础的表空间信息到复杂的数据库对象状态和性能监控。 1. **查看表空间的名称及大小**: 这个查询通过`dba_tablespaces`和`dba_data_files`视图获取每个表空间的...

    Oracle提高查询效率的方法

    但是,随着数据量的增加和复杂查询的增加,查询效率可能会下降。因此,提高查询效率是 Oracle 数据库管理员和开发者需要解决的问题。下面是提高 Oracle 查询效率的方法: 1. 优化 SQL 语句:避免使用 NOT IN 操作符...

    Oracle学习查询语句

    在Oracle中,查询语句是数据操作的核心,本篇文章将详细讲解Oracle查询语句的一些关键知识点。 首先,Oracle是大小写敏感的,这意味着在编写SQL语句时,需要特别注意变量名、表名和字段名的大小写。在条件表达式中...

    Oracle 的查询优化

    窗口函数(Window Function)是一种非常强大的函数,它可以用于实现各种复杂的查询操作。在 Oracle 中,窗口函数可以用于实现排名、分组、聚合等操作。 3. 视图消除 视图消除(View Elimination)是一种优化技术,...

    Oracle-SQL基本查询.ppt

    此外,还可以进行连接查询(JOIN)、子查询(嵌套查询)和合并查询(UNION)以实现更复杂的查询逻辑。 在实际应用中,通过SELECT语句,我们可以根据需求从数据库中提取所需信息,使用WHERE子句过滤特定条件,GROUP ...

    oracle子查询PPT课件.ppt

    Oracle子查询是指在SQL语句中嵌套使用SELECT语句,以解决复杂的查询问题。下面是Oracle子查询的知识点总结: 一、子查询的定义和类型 * 子查询是一个完整的SELECT语句,嵌套在另一个SELECT语句中。 * 子查询可以...

    VS学习笔记-连接oracle查询 更新

    这仅仅是Oracle数据库操作的基础,实际开发中可能涉及事务处理、参数化查询、存储过程调用等更复杂的操作。在进一步学习时,建议了解Oracle的数据类型、约束、索引等概念,以及如何处理Oracle特有的异常,以提高代码...

    oracle查询优化

    Oracle SQL 查询优化是提高数据库性能的关键技术之一,尤其在处理大量数据时,优化查询能够显著提升系统的响应速度和资源利用效率。以下是一些关键的优化策略: 1. **选择最有效的表名顺序**:在FROM子句中,Oracle...

    ORACLE分区表操作大全

    Oracle分区表是Oracle数据库中一种优化大数据处理的高级特性,它通过将一个大表分成多个逻辑部分,即分区,来提高查询性能、简化管理和增强可用性。分区技术在处理海量数据时尤其有用,因为它们允许数据库仅扫描与...

    顶级讲师oracle全部课件,最全文档,涉及oracle所有操作,开发必备

    本资源提供了 Oracle 的全面教程,涵盖了 Oracle 的基本使用、函数、存储过程、触发器、复杂查询等高级操作。 基本使用 Oracle 的基本使用包括连接命令、文件操作命令、交互式命令、显示和设置环境变量等。 * ...

    oracle树结构查询方法

    总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...

    第9章 Oracle数据的复杂查询.ppt

    Oracle数据库系统提供了强大的查询能力,本章主要涵盖了Oracle数据的复杂查询技巧,包括多表查询、排序函数和正则表达式查询。以下是对各部分的详细解析: **9.1 多表嵌套查询** 嵌套查询是Oracle查询中的一种重要...

    python连接oracle(附详细操作说明)

    python连接oracle比较复杂,需要下载客户端,并辅助一些配置,该文档是帮助初学者快速使用python傻瓜化操作,来连接oracle

    Oracle中对两个数据表交集查询简介

    Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大、灵活和复杂的系统,本文向大家介绍使用SQL查两个Oracle数据表查询的相同数据的方法。第一种方法:利用操作符intersect,intersect操作符...

    Oracle树查询及相关函数

    Oracle树查询是数据库管理中一种非常实用的技术,它允许我们处理具有层级关系的数据。在Oracle中,树查询主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`语法,这个语法让我们能够按照层级结构遍历数据。本文...

    oracle4的表查询和基本函数.docx

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能来处理复杂的查询和数据操作。本文将深入探讨Oracle4中的表查询和基本函数。 首先,我们关注的是基本查询。在Oracle中,查询多表通常涉及到...

    Oracle操作指南

    Oracle数据库系统是全球广泛使用的数据库管理系统之一,其复杂性和灵活性使得对它的管理和操作需要深入的理解和技巧。本文将围绕Oracle的权限控制和存储位置展开,以帮助用户更好地掌握Oracle的操作。 首先,权限...

    oracle数据库基本操作讲义.pptx

    视图可以简化复杂的查询,提供安全的数据访问层,或者隐藏基础表的结构。 在管理表的策略上,包括选择合适的表空间、分区策略、索引策略等。例如,创建表时可以指定表空间,这有助于管理和分配磁盘空间。分区是将大...

Global site tag (gtag.js) - Google Analytics