广告
返回顶部
首页 > 资讯 > 数据库 >Oracle专题8之Oracle的子查询
  • 947
分享到

Oracle专题8之Oracle的子查询

2024-04-02 19:04:59 947人浏览 独家记忆
摘要

1、oracle的子查询的概述 什么是子查询? 子查询是指嵌入在其他sql语句中的SELECT语句,也称之为嵌套查询。 可以使用子查询的位置:where、select列表、havin&#

1、oracle的子查询的概述

  • 什么是子查询?
  • 子查询是指嵌入在其他sql语句中的SELECT语句,也称之为嵌套查询。
  • 可以使用子查询的位置:where、select列表、having、from。

    a、在where子句中使用子查询

  • 示例:查询出和FORD是相同职位的员工:select * from emp where job = (select job from emp where ename='FORD');
    SQL> select * from emp where job = (select job from emp where ename='FORD');
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7951 EASON      ANALYST         7566 01-12月-17           3000
                    20
                7788 SCOTT      ANALYST         7566 19-4月 -87           3000
                    20
                7902 FORD       ANALYST         7566 03-12月-81           3000
                    20

    b、在select子句中使用子查询

  • 示例:查询出每个部门的编号、名称、位置和部门人数。示例:select deptno, dname, loc, (select count(empno) from emp where emp.deptno = dept.deptno) count from dept;
    SQL> select deptno, dname, loc, (select count(empno) from emp where emp.deptno = dept.deptno) count from dept;
    DEPTNO DNAME          LOC                COUNT
        10 ACCOUNTING     NEW YORK               3
        20 RESEARCH       DALLAS                 6
        30 SALES          CHICAGo                6
        40 OPERATioNS     BOSTON                 0

    c、在having子句中使用子查询

  • 举例:查询员工信息表,按照部门编号进行分组,要求显示员工的部门编号、平均工资,查询条件时平均工资大于30号部门的最高工资。
    SQL> select deptno, avg(sal) from emp group by deptno having avg(sal) > (select max(sal) from emp where deptno = 30);
            DEPTNO   AVG(SAL)
                    10 2916.66667

    d、在from子句中使用子查询

  • 把子查询的结果看成一张新的表。示例:查询并显示高于部门平均工资的雇员信息。
    SQL> select ename, job, sal from emp, (select deptno, avg(sal) avgsal from emp group by deptno) dept where emp.deptno = dept.deptno and sal > avgsal;
    ENAME      JOB              SAL
    EASON      ANALYST         3000
    ALLEN      SALESMAN        1600
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850
    SCOTT      ANALYST         3000
    KING       PRESIDENT       5000
    FORD       ANALYST         3000
    已选择7行。

    2、Oracle的主查询和子查询

  • 什么是主查询和子查询?
    Oracle专题8之Oracle的子查询

    a、一个主查询可以有多个子查询

  • 举例:显示职位和7521的职位相同并工资大于7934这个员工工资的员工信息。
    SQL> select * from emp where job = (select job from emp where empno = 7521) and sal > (select sal from emp where empno = 7934);
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300
                    30
                7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0
                    30

    b、子查询的执行顺序

  • 一般先执行子查询,再执行主查询,但相关子查询例外。
  • 举例:查询员工表中小于平均工资的员工信息。
    SQL> select empno, ename, sal from emp where sal < (select avg(sal) from emp);
             EMPNO ENAME             SAL
                7369 G_EASON           800
                7499 ALLEN            1600
                7521 WARD             1250
                7654 MARTIN           1250
                7844 TURNER           1500
                7876 ADAMS            1100
                7900 JAMES             950
                7934 MILLER           1300
    已选择8行。

    c、相关子查询

  • 当子查询需要引用主查询的表列时,Oracle会执行相关查询。
  • 相关子查询是先执行主查询,在执行子查询。
  • 示例:查询工资高于部门平均工资的雇员名、工资和部门号:
    SQL> select ename, sal, deptno from emp e where sal > (select avg(sal) from emp where deptno = e.deptno);
    ENAME             SAL     DEPTNO
    EASON            3000         20
    ALLEN            1600         30
    JONES            2975         20
    BLAKE            2850         30
    SCOTT            3000         20
    KING             5000         10
    FORD             3000         20
    已选择7行。

    d、主查询和子查询可以不是同一张表

  • 主查询和子查询可以查询的不是同一张表。
  • 示例:查询部门名称时ACCOUNTING的员工信息。
    SQL> select * from emp where deptno = (select deptno from dept where dname='ACCOUNTING');
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7782 CLARK      MANAGER         7839 09-6月 -81           2450
                    10
                7839 KING       PRESIDENT            17-11月-81           5000
                    10
                7934 MILLER     CLERK           7782 23-1月 -82           1300
                    10

    3、Oracle的子查询:单行子查询

  • 子查询的类型:单行子查询和多行子查询。
  • 单行子查询:只返回一行数据的子查询语句。
  • 使用单行比较操作符:
操作符 含义
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
<> 不等于

a、使用单行子查询

  • 示例1:显示与JAMES同部门的所有其他的员工姓名、工资、部门号。
    SQL> select ename, sal, deptno from emp where deptno = (select deptno from emp where ename='JAMES') AND ename <> 'JAMES';
    ENAME             SAL     DEPTNO-
    ALLEN            1600         30
    WARD             1250         30
    MARTIN           1250         30
    BLAKE            2850         30
  • 示例2:查询大于等于公司平均工资的员工的姓名、职位、工资。
    SQL> select ename, job, sal from emp where sal >= (select avg(sal) from emp);
    ENAME      JOB              SAL
    EASON      ANALYST         3000
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850
    CLARK      MANAGER         2450
    SCOTT      ANALYST         3000
    KING       PRESIDENT       5000
    FORD       ANALYST         3000
    已选择7行。
  • 示例3:查询部门名称不是‘SAVE’的员工。
    SQL> select * from emp where deptno <> (select deptno from dept where dname= 'SALES');
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7951 EASON      ANALYST         7566 01-12月-17           3000
                    20
              ......
                7902 FORD       ANALYST         7566 03-12月-81           3000
                    20
                7934 MILLER     CLERK           7782 23-1月 -82           1300
                    10
    已选择9行。

    b、非法使用单行子查询

  • 示例:select ename, job, sal from emp where sal = (select max(sal) from emp group by deptno);
    SQL> select ename, job, sal from emp where sal = (select max(sal) from emp group by deptno);
    select ename, job, sal from emp where sal = (select max(sal) from emp group by deptno)
    第 1 行出现错误:
    ORA-01427: 单行子查询返回多个行
  • select max(sal) from emp group by deptno;sql语句返回多行数据。
    SQL> select max(sal) from emp group by deptno;
    MAX(SAL)
      2850
      3000
      5000

    4、Oracle的子查询:多行子查询

  • 多行子查询是指返回多行数据的子查询语句。
  • 使用多行比较操作符:(使用多行子查询时必须使用多行比较操作符。)
运算符 含义
IN 等于列表中的任何一个
ALL 和子查询返回的所有值进行比较
ANY 和子查询返回的任一值进行比较

a、在多行子查询中使用IN操作符

  • 示例:查询工作地点在NEW YORK和CHICAGO的部门所对应的员工信息。
    SQL> select * from emp where deptno in (select deptno from dept where loc='NEW YORK' or loc = 'CHICAGO');
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7934 MILLER     CLERK           7782 23-1月 -82           1300
                    10
                ......
                7698 BLAKE      MANAGER         7839 01-5月 -81           2850
                    30
                7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400
                    30
    已选择9行。

    b、在多行子查询中使用ALL操作符

  • 示例:查询高于30号部门所有员工工资的员工名、工资和部门号。
    SQL> select ename, sal, deptno from emp where sal > all(select sal from emp where deptno = 30);
    ENAME             SAL     DEPTNO
    JONES            2975         20
    EASON            3000         20
    FORD             3000         20
    SCOTT            3000         20
    KING             5000         10

    c、在多行子查询中使用ANY操作符

  • 示例:查询高于10号部门任意一个员工工资的员工名、工资和部门号。
    SQL> select ename, sal, deptno from emp where sal > any (select sal from emp where deptno = 10);
    ENAME             SAL     DEPTNO
    KING             5000         10
    EASON            3000         20
    ......
    ALLEN            1600         30
    TURNER           1500         30
    已选择9行。

    5、Oracle的子查询需要注意的问题

    a、不可以在group by子句中使用子查询。

  • 示例:select avg(sal) from emp group by (select deptno from emp);
    SQL> select avg(sal) from emp group by (select deptno from emp);
    select avg(sal) from emp group by (select deptno from emp)
    第 1 行出现错误:
    ORA-22818: 这里不允许出现子查询表达式

    b、在TOP-N分析问题中,需对子查询排序

  • 示例:显示员工信息表中工资最高的前五名员工。
    SQL> select rownum, empno, ename, sal from (select * from emp order by sal desc) where rownum <= 5;
            ROWNUM      EMPNO ENAME             SAL
                     1       7839 KING             5000
                     2       7951 EASON            3000
                     3       7902 FORD             3000
                     4       7788 SCOTT            3000
                     5       7566 JONES            2975

    c、单行子查询的空值问题

  • 示例:select ename, job, from emp where job = (select job from emp wehre ename = 'Ruby');
    SQL> select ename, job from emp where job = (select job from emp where ename = 'Ruby');
    未选定行
  • 如果子查询返回到的是一个空值,那么主查询将不会查询到任何结果。

    d、多行子查询的空值问题

  • 示例:select * from emp where empno not in (select mgr from emp);
    SQL> select mgr from emp;
                 MGR
                7566
                null
                ......
                7839
                7566
                7698
                已选择15行。
     SQL> select * from emp where empno not in (select mgr from emp);
    未选定行
  • 多行子查询中如果出现空值,则主查询将不会查询到任何结果。
    SQL> select * from emp where empno not in (select mgr from emp where mgr is not null);
             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
            DEPTNO
                7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0
                    30
                7951 EASON      ANALYST         7566 01-12月-17           3000
                    20
             ......
                7934 MILLER     CLERK           7782 23-1月 -82           1300
                    10
                7900 JAMES      CLERK           7698 03-12月-81            950
                    30
    已选择9行。
您可能感兴趣的文档:

--结束END--

本文标题: Oracle专题8之Oracle的子查询

本文链接: https://www.lsjlt.com/news/43219.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle专题8之Oracle的子查询
    1、Oracle的子查询的概述 什么是子查询? 子查询是指嵌入在其他SQL语句中的SELECT语句,也称之为嵌套查询。 可以使用子查询的位置:where、select列表、havin&#...
    99+
    2022-10-18
  • Oracle专题4之Oracle基本查询
    1、Oracle的基本查询语句 查询概述:查询是使用最频繁的一个操作,可以从一个表中查询数据,也可以从多个表中查询数据,本节主要围绕单表查询的操作。 基本查询的语法格式:SELECT * | {...
    99+
    2022-10-18
  • Oracle专题7之多表查询
    什么是多表查询? 多表查询就是从多个表中获取数据。 1、笛卡尔集 笛卡尔集是集合中的一种。假设A和B都是集合,A和B的笛卡尔集用 A B来表示。即A B所形成的集合叫做笛卡尔集。 下表中,部门表员工表...
    99+
    2022-10-18
  • Oracle 笔记之子查询
    子查询当我们的一个操作需要基于另一个查询记过,那么就先行执行的这个查询就是子查询子查询分为:单行单列子查询:查的结果只有一行,且只有一个字段多行单列子查询:查询出来的结果有多行,但只有一列 多行多列子查询查...
    99+
    2022-10-18
  • Oracle 查询转换之子查询展开
    概念:子查询展开(Subquery Unnesting)是优化器处理带子查询的目标sql的一种优化手段,它是指优化器不再将目标sql中子查询当作一个独立的处理单元来单独执行,而是将该子查询转换为它自身和外部...
    99+
    2022-10-18
  • Oracle专题3之Oracle数据表的
    Oracle SQL Developer是Oracle官方出品的免费图形化开发工具,相对于SQL * Plus来说,图形化的界面便于操作,不必记忆大量的命令,输出结果美观。它的基本功能有结果的格式化输出、编辑器自动提示、代码优化、显示...
    99+
    2023-01-31
    数据表 专题 Oracle
  • Oracle专题5之Oracle的单行函数
    SQL函数是什么?SQL函数是Oracle数据库的内置函数,并且可用于各种SQL语句。SQL函数包含单行函数和多行函数。 1、字符函数 字符函数的输入为字符类型,其返回值是字符类型或者是数字类型。 字符函...
    99+
    2022-10-18
  • Oracle专题6之Oracle的分组函数与数组分组
    在关系数据库中,使用数据分组可以取得表数据的汇总信息。数据分组是通过分组函数、Group by以及having等子句共同实现的。 1、分组函数 SQL函数包含单行函数和多行函数。分组函数属于多行...
    99+
    2022-10-18
  • 怎么理解Oracle数据库中的多表查询,分组查询,子查询
    本篇内容介绍了“怎么理解Oracle数据库中的多表查询,分组查询,子查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2022-10-18
  • Oracle 查询锁之间的依赖关系
      ...
    99+
    2022-10-18
  • Oralce专题10之Oracle的其他数据库对象
    1、Oracle的数据库对象:序列 a、什么是序列? 序列(sequence):是一种用于自动生成唯一数字的数据库对象。主要用于提供主键值。 b、怎样创建序列? 创建序列的语法格式: CREATE SEQ...
    99+
    2022-10-18
  • Oracle专题1之Oracle概述、Oracle数据库的体系结构以及常用命令
    1、Oracle概述-  Oracle Database,简称为Oracle。是美国ORACLE(甲骨文)公司的一款对象关系型的数据库管理系统(ORDBMS)。目前在数据库市场上占有主要份额。- ...
    99+
    2022-10-18
  • MySQL与PHP的基础与应用专题之数据查询
    目录概述条件查询例1例2运算符IN例1例2运算符Like例1例2概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 条件查询 我们可以使用关键词Where...
    99+
    2022-11-13
  • MySQL与PHP的基础与应用专题之数据查询语句
    目录概述ORDER BY例 1例 2LIMIT例 1例 2GROUP BY例 1例 2HAVING例 1例 2GROUP_CONCAT例 1例 2DISTINCT例 1例 2...
    99+
    2022-11-13
  • mysql和Oracle 查询某个时间之内的数据
    查询最近一个月的数据 mysql SELECT id,title,endtime from classroom where years = 2022 and date_sub(CURDATE(), interval 1 m...
    99+
    2023-08-18
    oracle mysql 数据库
  • Oracle 12CR2查询转换之星型转换的方法
    这篇文章主要为大家展示了“Oracle 12CR2查询转换之星型转换的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle 12CR2查询转换之星型转...
    99+
    2022-10-18
  • 1.1.1 NBU备份之Oracle问题故障的排查
    1. Create debug folders under the following directories on database client: All log directories should...
    99+
    2022-10-18
  • Oracle专题2之用户、权限、角色以及表空间的管理
    1、用系统用户登录Oracle 只有用合法的用户才能够访问Oracle数据库。Oracle默认的系统用户:sys/system、sysman、scott。 a、系统用户说明 sys:这个账户相当于SQL ...
    99+
    2022-10-18
  • Oracle从入门到精通 关于简单查询的问题
    视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 如果要进行查询,肯定使用的时DML中的查询部分支持,相对于简单查询而言,通俗的理解,就是全部记录都查询,但是可...
    99+
    2022-10-18
  • Oracle提升查询性能之-简单范围分区表的创建
    分区表的优点: 1.提高查询性能:只需要搜索特定分区,而非整张表,提高了查询速度。 2.节约维护时间:单个分区的数据装载,索引重建,备份,维护远远小于整张表的维护时间。下面就让我们来创建一张分区表 第一步:...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作