Oracle Day04 子查询

1.子查询解决什么问题: 当一个简单的查询查询不到结果的时候,可以使用子查询来丰富查询的条件以达到显示结果的目的。

  子查询的格式: 用一个小括号包含,然后在里面写sql语句
2.子查询的注意事项:

  1).注意一定要有小括号。
  2).一定要注意书写格式,不要混乱。
  3). 子查询可以放在select,from ,where having后面。
    4). 注意子查询一定不能放在group by的后面。
  5). 子查询和主查询可以不是同一张表,只要子查询的结果在主查询中能用就可以。
  6). 子查询中一般都不排序,但是在TOP-N中需要排序 。
  7). 一般是先执行子查询操作,再执行主查询操作,但是在相关子查询中先执行主查询,再执行子查询。
  8). 对于子查询的结果,如果是单行只能用单行操作符;如果是多行,只能用多行操作符。
  9). 自查中的null处理。

3.例

  1)-- 子查询放在select后面

     select ename,job,(select sal from emp where empno=7566) 子查询 from emp;

    注意:放在select后面的时候结果只能是单行的。

  2)-- from后面放置子查询   重点掌握

    -- 查询员工的姓名 工资 job

    select * from  (
         select ename,job,sal from emp
             );

  3)-- where 后面跟子查询

    select * from emp

    where sal > (
           select sal from emp where ename = (
             select ename from emp where empno = 7566
              )
            );

    注意: 子查询不能过多的去嵌套,一般嵌套三层,加多了会影响性能。

  4)order by 后面不能跟子查询,语法上是可以跟的,但是跟了不起作用。

  5)--子查询和主查询可以不是同一张表,只要子查询的结果在主查询中能用就可以

     -- 查询部门名称为SAL的所有的员工信息

    select *
      from emp
      where deptno=(
           select deptno from dept where dname=‘SALES‘
             );

  6)--对于子查询的结果,如果是单行只能用单行操作符;如果是多行,只能用多行操作符。

    单行操作符: ><= <= !=
    -- 查询部门号不为30的员工信息
    select * from (select * from emp where deptno != 30);

    select * from (select * from emp where deptno <> 30);

    -- <> 用来表示不等于

     多行操作符 in, not in,any,all.
     -- 查询和SCOTT用户和CLARK用户共同部门的所有员工

    select * from emp

      where deptno in(
             select deptno from emp where ename=‘SCOTT‘ or ename=‘CLARK‘
            );

    

时间: 2024-10-06 12:54:43

Oracle Day04 子查询的相关文章

Oracle【子查询】

Oracle子查询:当一个查询依赖于另外一个查询的结果的时候,就需要使用子查询.单行子查询 :筛选条件不明确,需要执行一次查询且查询结果只有一个字段且字段值只有一个.注意:where子句中允许出现查询语句,该查询语句称为子查询.使用:select 内容 from 表名 where 字段名 比较运算符 子查询语句 1 --查询所有比雇员'CLARK'工资高于员工的信息 2 select * from emp where sal>(select sal from emp where ename='C

oracle数据库子查询的结果需要使用多次解决办法

with c as (select a.trandt,sum(a.tranam) tranam from tran a group by a.trandt )--将子查询抽取出来,以后可以直接用.该方法只适用于oracle,mysql不支持 select c.trandt, sum(d.tranam) from c inner join c d on c.trandt >= d.trandt group by c.trandt select c.trandt, sum(d.tranam) fro

一个例子讲述Oracle Any子查询

问题: 查询出Emp表中比任意一个销售员("SALESMAN")工资低的员工姓名.工作.工资. 分析: 销售员在Emp表中有很多条记录,每个人工资不相等,如果返回"比任意员工的工资还低"的条件,返回比"最高工资还低"即可. 如果用子查询做,子查询中就会返回多条记录.用普通的关系符(>.<等)运行就会出错. 这时候需要用关键字ANY.ANY放在比较运算符后面,表示"任意"的意思. 代码演示:ANY子查询 <sp

一个例子讲通Oracle All子查询

问题: 查询出比所有销售员的工资都高的员工姓名,工作,工资. 分析: ANY可以表示任意的,但这个问题要求比所有销售员工资都高,那么就要使用另外一个关键字ALL. ALL与关系操作符一起使用,表示与子查询中所有元素比较. 代码演示:ALL子查询 <span style="font-size:18px;">SQL> SELECT ENAME,JOB,SAL FROM EMP 2 WHERE SAL>ALL (SELECT SAL FROM EMP WHERE JO

oracle 单行子查询

子查询在SELECT.UPDATE.DELETE语句内部可以出现SELECT语句.内部的SELECT语句结果可以作为外部语句中条件子句的一部分, 也可以作为外部查询的临时表.子查询的类型有: 1. 单行子查询:不向外部返回结果,或者只返回一行结果. 2. 多行子查询:向外部返回零行.一行或者多行结果. 单行子查询代码演示:查询出销售部(SALES)下面的员工姓名,工作,工资.该问题可以用联接查询实现,由于所需的结果信息都在Emp表中, 可以先从Dept表中查询出销售部对应的部门号,然后根据当前部

oracle标量子查询

SQL> conn scott/scott Connected. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values(1,'a1'); 1 row created. SQL> insert into a values(2,'a2

Oracle - 为子查询提供动态结果集

曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询. SELECT * FROM TBL WHERE ID IN ('用户ID0,用户ID1,用户ID2') 不就可以解决问题吗? 但实际情况是,结果集无法通过一个简单的SELECT就可以得到. 让我明确一下需要解决的问题: 我们给FUNCTION传递这样的一个String参数后如何让它动态RETURN一个结果集供其他SELEC

彻底搞懂oracle的标量子查询

oracle标量子查询和自定义函数有时用起来比较方便,而且开发人员也经常使用,数据量小还无所谓,数据量大,往往存在性能问题. 以下测试帮助大家彻底搞懂标量子查询. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values (1,'a1'); 1

子查询、集合查询

子查询.集合查询 1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY 3.DISTINCT 子句 3.1.普通用法 3.2.做聚合函数的参数 4.总结 1.子查询 1.1.子查询简介 子查询是一个嵌套在 SELECT.INSERT.UPDATE 或 DELETE 语句或其他子查询中的查询.任何允许使用表达式的地方都可以使用子查询,换句话说,子查询几