精华内容
下载资源
问答
  • Oracle 相关子查询

    千次阅读 2015-06-19 12:13:08
    大家对子查询都非常熟悉,可是我发现,很多人都不知道子查询有两种格式:一种是相关子查询(Correlated Sub-Query),另一种是非相关子查询(Uncorrelated Sub-Query)。下面我们通过一个例子来对比一下这两种子查询...

    -- Start

    我们先来看两个表的定义:

    --用户
    CREATE TABLE EMPLOYEE
    (
    USERID       NUMBER(9,0) NOT NULL,---用户ID
    COMPANYID    NUMBER(9,0),---公司ID
    TELNO        VARCHAR2(12)---用户电话
    );
    ALTER TABLE "EMPLOYEE" ADD CONSTRAINT "PK_EMPLOYEE" PRIMARY KEY ("USERID");
    
    --公司
    CREATE TABLE COMPANY
    (
    COMPANYID NUMBER(9,0) NOT NULL,---公司ID
    TELNO     VARCHAR2(12)---公司电话
    );
    ALTER TABLE "COMPANY" ADD CONSTRAINT "PK_COMPANY" PRIMARY KEY ("COMPANYID");

    大家对子查询都非常熟悉,可是我发现,很多人都不知道子查询有两种格式:一种是相关子查询(Correlated Sub-Query),另一种是非相关子查询(Uncorrelated Sub-Query)。下面我们通过一个例子来对比一下这两种子查询的不同。假设现在让你查询一下公司电话是88888888 的用户有哪些,我们可以使用如下语句:

    --非相关子查询(Uncorrelated Sub-Query)
    SELECT * FROM EMPLOYEE WHERE COMPANYID IN
    (
    SELECT COMPANYID FROM COMPANY WHERE TELNO='88888888'
    );
    
    --相关子查询(Correlated Sub-Query)
    SELECT * FROM EMPLOYEE U WHERE EXISTS
    (
    SELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID
    );

    以上两条语句的用作是相同的,对比后我们发现,相关子查询的子句(也就是括号中的语句:ELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID)依赖外部语句的条件,不能单独执行;而非相关子查询的子句是可以单独执行的。就以上这个例子来说,我们使用相关子查询无论从性能和可读性都不如非相关子查询,下面我们来看一个使用非相关子查询办不到的例子,假设现在让你把用户电话更新成公司电话,怎么办?有些人可能采用如下的方式构造update sql,然后执行,如下:

    SELECT 'UPDATE EMPLOYEE SET TELNO=''' || TELNO || ''' WHERE COMPANYID=' || CHAR(COMPANYID) || ';' FROM COMPANY

    这么做是可以的,但是有点笨(当然,自己觉得挺聪明,因为他可能觉得自己使用了别人不常用或不知道的using sql to make sql),我们还有更好的方法,就是采用相关子查询,如下所示:

    UPDATE EMPLOYEE U SET TELNO=
    (
    SELECT TELNO FROM COMPANY C WHERE U.COMPANYID=C.COMPANYID
    );

    怎么样?是不是感觉自己很厉害,有没有更简单的办法?看看下面的语句吧。

    UPDATE 
    (
    SELECT U.TELNO EMPLOYEE_TELNO, C.TELNO COMPANY_TELNO FROM EMPLOYEE U, COMPANY C WHERE U.COMPANYID=C.COMPANYID
    )
    SET EMPLOYEE_TELNO = COMPANY_TELNO;

    --更多参见:Oracle SQL 精萃

    -- 声明:转载请注明出处

    -- Last edited on 2015-06-19

    -- Created by ShangBo on 2015-06-19

    -- End


    展开全文
  • Oracle 相关子查询理解

    千次阅读 2018-07-28 17:05:27
    相关子查询:执行查询的时候先取得外层查询的一个属性值,然后执行与此属性值相关子查询,执行完毕后再取得外层父查询的下一个值,依次再来重复执行子查询;  不相关子查询:子查询的执行不需要提前取得父查询的...

           相关子查询:执行查询的时候先取得外层查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外层父查询的下一个值,依次再来重复执行子查询;
           不相关子查询:子查询的执行不需要提前取得父查询的值,只是作为父查询的查询条件。

          相关子查询作用其实就是分组,然后选取那些满足条件的记录。当然相关子查询都可以使用group by (非相关子查询)代替,个人喜欢首选相关子查询,看起来比较简洁一点,没有非相关语句繁琐。

    --Oracle相关查询的使用
    --相关子查询作用其实就是分组(可能是统计组内记录数量,求最大值、最小值、平均值,判断组内是否有记录(exists语句)等),
    --然后返回那些满足条件的记录。
    --1
    --下面这条select语句就是以student_no分组,计算平均值,将成绩平均值小于60的学生记录选出来。
    SELECT *
      FROM hand_student_core t_out
     WHERE 60 > (SELECT AVG(t_in.core)
                   FROM hand_student_core t_in
                  WHERE t_out.student_no = t_in.student_no);
    --2
    --下面这条语句则是以student_no分组,求每个学生的最高成绩。
    SELECT *
      FROM hand_student_core t_out
     WHERE t_out.core = (SELECT MAX(t_in.core)
                           FROM hand_student_core t_in
                          WHERE t_out.student_no = t_in.student_no);
    --3
    --这条语句任然是以student_no分组,选取选修少于2门课程的学生记录。
    SELECT *
      FROM hand_student_core t_out
     WHERE 2 > (SELECT COUNT(1)
                  FROM hand_student_core t_in
                 WHERE t_out.student_no = t_in.student_no);
    --4
    --这条语句还是以student_no分组,将没有选修c001课程的学生查询出来。
    SELECT *
      FROM hand_student_core t_out
     WHERE NOT EXISTS (SELECT 'X'
              FROM hand_student_core t_in
             WHERE t_out.student_no = t_in.student_no
               AND t_in.course_no = 'c001');
    --5
    --这次是以course_no分组,将每门课程的最高分查出来。
    SELECT *
      FROM hand_student_core t_out
     WHERE t_out.core = (SELECT MAX(t_in.core)
                           FROM hand_student_core t_in
                          WHERE t_out.course_no = t_in.course_no);

     补充内容:

    --1.按各科平均成绩和及格率的百分数,按及格率高到低的顺序排序,显示(课程号、平均分、及格率)
    --方法一:
    WITH aa AS
     (SELECT c.course_no,
             AVG(c.core) avg1,
             COUNT(*) num1
        FROM hand_student_core c
       GROUP BY c.course_no),
    bb AS
     (SELECT c2.course_no,
             COUNT(*) count1
        FROM hand_student_core c2
       WHERE c2.core >= 60
       GROUP BY c2.course_no)
    SELECT aa.course_no, aa.avg1, nvl2(bb.count1 / aa.num1, bb.count1 / aa.num1, 0)
      FROM aa
      LEFT JOIN bb
        ON aa.course_no = bb.course_no
     ORDER BY nvl2(bb.count1 / aa.num1, bb.count1 / aa.num1, 0) DESC;
     
    --方法二:(优先使用)
    SELECT core1.course_no,
           AVG(core1.core),
           COUNT(CASE
                   WHEN core1.core >= 60 THEN
                    'X'
                 END) / COUNT(*) rate
      FROM hand_student_core core1
     GROUP BY core1.course_no order by rate desc;
    
    --2.查询各科成绩前三名的记录:(不考虑成绩并列情况),显示(学号、课程号、分数)
    SELECT *
      FROM (SELECT core1.student_no,
                   core1.course_no,
                   core1.core,
                   row_number() over(PARTITION BY core1.course_no ORDER BY core1.core DESC) rn
              FROM hand_student_core core1) t
     WHERE t.rn <= 3;
    
    
    

    表结构:

           

    展开全文
  • Oracle - 一般子查询+相关子查询

    千次阅读 2019-04-08 21:45:41
    一般子查询(select查询结果作为另一个查询的条件 => 不含有Exists的SQL查询语句) 相关子查询(含有Exists的SQL查询语句) Example-1: Example-2: 一:执行顺序与原理 ◼ ◼ 普通子查询的执行顺序是...


    一般子查询select查询结果作为另一个查询的条件 => 不含有Exists的SQL查询语句

    相关子查询含有Exists的SQL查询语句

    Example-1:

     Example-2:



     

    一:执行顺序与原理

    ◼ ◼ 普通子查询的执行顺序是:
    ⚫ 首先执行子查询,然后把子查询的结果作为父查询的查询条件的值
    ⚫普通子查询只执行一次,而父查询所涉及的所有记录行都与其查询结果进行比较,
    以确定查询结果集合

    ◼ ◼  相关子查询的执行顺序是:
    首先选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询
    然后父查询根据子查询返回的结果判断此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中。重复执行这一过程,直到处理完父查询表中的每一行数据

    ◼相关子查询的执行次数是由父查询表的行数决定的

    二:相关性

    EXISTS :存在量词,用来测试子查询是否返回结果,带有EXISTS的子查询不返回任何实际数据,
    它只得到逻辑值“真”或“假”,其目标列表达式通常都用*, 给出列名无实际意义。
    当子查询的的查询结果集合为非空时,外层的WHERE子句返回
    真值,否则返回假值。

    NOT EXISTS与此相反

    这里,子查询的查询条件往往依赖于其父查询的某个属性值,所以称为相关子查询

     

    展开全文
  • ORACLE子查询

    2013-05-24 12:53:06
    ORACLE子查询
  • ORACLE子查询的多种用法

    千次阅读 2019-04-07 20:48:32
    第一个是最普通的子查询子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用。子查询一般是返回单行,要是返回多行,就要用到使用多行比较操作符(in,all,any) 二、使用子查询创建...

    一、用于查询

    第一个是最普通的子查询,子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用。子查询一般是返回单行,要是返回多行,就要用到使用多行比较操作符(in,all,any)

     

    二、使用子查询创建表

    这就是把子查询查询出来的数据,创建成一个表,表中的列的数据类型、约束和原来的一样

    例子:CREATE TABLE adele

          AS

          SELECT employee_id , last_name

          From employees

     

    三、在 UPDATE 语句中使用子查询

    在 UPDATE 中使用子查询,使更新基于另一个表中的数据

    例子:UPDSTE employees

         SET    job_id = (SELECT Job_id

    FROM   employees

    WHERE  employee_id = 150),

                Salary = (SELECT salary

    FROM   employees

    WHERE  employee_id = 150)

    WHERE employee_id = 111

     

    四、使用子查询创建视图

    其实这个用法和第二个用法差不多,只是一个是创建表,一个是创建视图

    例子:CREATE OR REPLACE VIEW empview

          AS

          SELECT employee_id , last_name

          From employees

    展开全文
  • Oracle子查询的注意问题

    千次阅读 2016-12-27 22:57:47
    1. 子查询中小括号,子查询要用()包起来 ...2. Oracle子查询书写风格 缩紧、对齐、换行等等,便于观察 3. Oracle可以使用的位置: 可以在where、select、having、from之后使用子查询 如果查询的时候有
  • 什么是子查询? 使用子查询解决问题:谁的工资比SCOTT高? 子查询的语法 子查询(内查询)在主查询之间一次执行完成。\color{red}{子查询(内查询)在主查询之间一次执行完成。}子查询(内查询)在主查询...
  • oracle笔记高级子查询

    2018-10-09 16:49:58
    oracle笔记高级子查询oracle中的高级子查询有点难度,不太好理解,有具体的案例代码!
  • 主要介绍了Oracle数据库中基本的查询优化与子查询优化讲解,举了实例来分析子查询对性能的影响,需要的朋友可以参考下
  • 其实最后得出的结论,就是关联查询速度快于子查询 写这篇的目的主要是把尝试过的方法给记录下,同时复习下有一段时间没有用过的oracle存储过程、自定义函数、包的写法 一、问题说明 为了说清楚问题的核心,我把...
  • oracle笔记子查询

    2018-09-21 08:54:40
    oracle笔记子查询,有子查询相关的知识点笔记和具体的案例代码!
  • Oracle子查询 何为子查询子查询时嵌入在其他SQL语句中的SELECT语句,也称嵌套查询 举例:查询和SMITH是同一个职位的员工 //这是在where子句中使用子查询 Select * From emp Where job = (select job ...
  • 主要介绍了oracle基本查询操作子查询用法,结合实例形式分析了oracle数据库子查询相关概念、原理、语法、使用技巧与操作注意事项,需要的朋友可以参考下
  • oracle复杂相关子查询

    2007-12-06 11:06:03
    复杂相关子查询 动画版
  • 1、查询部分分为主查询和子查询; 2、根据返回值的记录多少分为单行子查询和多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接; 3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,...
  • ORACLE子查询ppt

    2019-12-03 14:27:21
    子查询的类型 1、单行子查询:不向外部的SQL语句返回结果,或者只返回一行 2、多行子查询:向外部的SQL语句返回一行或者多行 1、多列子查询:向外部的SQL语句返回多列 2、关联子查询:引用外部的SQL语句中的一列...
  • Oracle 普通子查询和关联子查询

    千次阅读 2017-09-02 21:22:20
    子查询(普通子查询和关联子查询子查询 = 简单查询 + 限定查询 + 多表查询 + 统计查询的综合体; 所谓子查询:指的就是在一个查询之中嵌套了其他的若干查询,嵌套子查询之后的查询SQL语句如下: SELECT [DISTINCT...
  • ORACLE子查询用法

    千次阅读 2018-08-31 08:48:36
    某个操作需要依赖于另一个SELECT语句的查询结果,那么就将SELECT语句嵌入到该操作语句中,形成子查询。 1、子查询(解决多表查询性能问题)  子查询是在SQL语句内的另外一条SELECT语句,也称为内查询或是SELECT...
  • Oracle 子查询

    2012-12-10 21:42:36
    Oracle 子查询
  • oracle子查询嵌套查询

    千次阅读 2017-08-24 20:07:26
    1.创建表:创建请自己去看以下网址 ... 2.要求:查询出工资比SMITH还要高的所有员工信息 select * from EMP where sal>(select sal from emp where ename='SMITH'); 3.要
  • --子查询(内查询)在主查询之前一次执行完成。 --子查询的结果被主查询(外查询)使用。 --注意事项 子查询要包含在括号内。 将子查询放在比较条件的右侧。 单行操作符对应单行子查询,多行操作符对应多行子查询。...
  • 所谓子查询就是当一个查询的结果是另一个查询的条件时,称之为子查询。本文给大家详细的介绍了关于Oracle中子查询的相关知识,文中的内容也算是自己的一些学习笔记,希望对有需要的朋友们能有所帮助,感兴趣的朋友们...
  • Oracle语法中子查询的多行子查询

    千次阅读 2019-04-18 09:11:49
    子查询(内查询)在主查询之前一次执行完成,子查询的结果被主查询(外查询)使用,子查询要包含在括号内,将子查询放在比较条件的右侧,多行操作符对应多行子查询。 /查询所有选修“计算机导论”课程的成绩表/ ...
  • 单行子查询 只返回一行数据的子查询的语句,使用单行比较操作符=,>,>=,<,<=,<>等 举例: 1显示与JAMES同部门的所有其他的员工姓名、工资、部门号 Select ename,sal,deptno From emp Where ...
  • oracle sql 多表连接和子查询 oracle sql 多表连接和子查询
  • oracle 分组查询 子查询

    千次阅读 2017-10-27 12:02:44
    分组查询 例: 统计平均工资大于2000的部门信息 -- 1.确定要查询的字段及表 select e.sal,d.deptno, d.dname, d.loc from emp e,dept d where e.deptno= d.deptno -- 2.统计平均工资及部门信息 select ...
  • Oracle使用子查询修改表数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:PLSQL Developer,Oracle 作者:陈显其 撰写...
  • Oracle子查询中需要注意的问题 1.不可以在group by子句中使用子查询 Select avg(sal) From emp Group by (select deptno from emp);//在这里使用了多行子查询 这是错误的 2.在TOP-N分析问题中,须对子查询排序 ...
  • Oracle子查询——rownum

    千次阅读 2018-05-14 09:58:09
    1、rownum是oracle专用的关键字。2、rownum与表在一起,表亡它亡,表在它在。3、rownum默认情况下,从表中是查不出来的。4、只有在select语句中,明确写出rownum才能显示出来。5、rownum是number类型,且唯一连续。6...
  • oracle in 子查询不能order by 的解决方案 今天,发现一个超级有意思的问题。查询数据库的时候试可以确定我写的语句没有问题,还找同事也看了几次。查了资料发现是ORDER BY 不能子查询。 具体是这样的:接到上级的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,027
精华内容 52,810
关键字:

oracle相关子查询