Oracle系列:(14)子查询

By | 09月07日
Advertisement

子查询的作用:查询条件未知的事物

查询条件已知的问题:例如:查询工资为800的员工信息

查询条件未知的问题:例如:查询工资为20号部门平均工资的员工信息

一个条件未知的问题,可以分解为多个条件已知的问题

查询工资比WARD高的员工信息

第一:查询WARD的工资?

      select sal from emp where ename = 'WARD';

第二:查询工资比1250高的员工信息?

      select * from emp where sal > 1250;

子查询:

select *
from emp
where sal > (
    select sal
    from emp
    where ename = 'WARD'
);

Oracle系列:(14)子查询

查询'SALES'部门的员工信息(方式一:子查询)

第一:查询部门名为'SALES'的编号?

      select deptno from dept where dname = 'SALES';

第二:查询部门号为30的员工信息?

      select * from emp where deptno = 30;

子查询:

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

Oracle系列:(14)子查询

子查询细节:

1)子查询与父查询可以针对同一张表

2)子查询与父查询可以针对不同张表

3) 子查询与父查询在传统参数时,数量要相同

4) 子查询与父查询在传统参数时,类型要相同

5) 子查询与父查询在传统参数时,含义要相同

查询部门名为'SALES'的员工信息(方式二:多表查询)

select emp.*
from dept,emp
where (dept.deptno=emp.deptno) and (dept.dname='SALES');

查询每个员工编号,姓名,部门名,工资等级(三表查询,这三张表并无外健关联)

select e.empno,e.ename,d.dname,s.grade
from emp e,dept d,salgrade s
where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal);

Oracle系列:(14)子查询

查询工资最低的员工信息(单行子查询,使用=号)

第一:查询出工资最低是多少?

      select min(sal) from emp;

第二:查询工资为800的员工信息?

      select * from emp where sal = 800;

子查询:

select *
from emp
where sal = (
    select min(sal)
    from emp
);

Oracle系列:(14)子查询

查询部门名为'ACCOUNTING'或'SALES'的员工信息(多行子查询,使用in关键字)

第一:查询部门名为'ACCOUNTING'或'SALES'的部门编号?

      select deptno from dept where dname in ('ACCOUNTING','SALES');

第二:查询部门号为10或30号的员工信息?

      select * from emp where deptno in (10,30);

子查询:

select *
from emp
where deptno in (
   select deptno
   from dept
   where dname in ('ACCOUNTING','SALES')
);

Oracle系列:(14)子查询

查询工资比20号部门【任意any】一个员工工资【低<】的员工信息(多行子查询,使用any关键字)

第一:查询20号部门的所有工资?

      select sal from emp where deptno = 20;

第二:查询工资比(800,2975,3000,1100,3000)任意一个低的员工信息?

      select * from emp where sal < any (800,2975,3000,1100,3000);

在oracle看来,<any就等于<集合中最大的那个值

子查询:

select *
from emp
where sal <any (
    select sal
    from emp
    where deptno = 20
);

Oracle系列:(14)子查询

查询工资比30号部门【所有all】员工【低<】的员工信息(多行子查询,使用all关键字)

第一:查询出30部门所有员工的工资?

      select sal from emp where deptno = 30;

第二:查询工资比(1600,1250,1250,2850,1500,950)中所有的工资都低的员工信息?

      select * from emp where sal <all (1600,1250,1250,2850,1500,950);

子查询:

select *
from emp
where sal <all (
    select sal
    from emp
    where deptno = 30
);

Oracle系列:(14)子查询


注意:不容易理解的几个概念

单行函数:输入一个参数,输出一个结果

多行函数:扫描多个参数,输出一个结果

单行子查询:子查询只会返回一个结果,例如:800,父查询用=/<>/>=/<=这些符号来比较

多行子查询:子查询会返回多于一个结果,例如:30,20,父查询用in/any/all这些符号来比较


当多表查询,子查询同时能解决问题时,按如下优先方案选择:

多表查询-->子查询

注意:上述结果不是说多表查询可以替代子查询,某些情况下,只能用子查询解决,例如:oracle分页

Similar Posts:

  • oracle with as子查询用法

    with table as 相当于建个临时表,将一个语句中某些中间结果放在临时表空间的SQL语句,可以将查询中的子查询命名,放到SELECT语句的最前面,此语法从Oracle 9i开始新增. (1).基本语法格式: with temptablename as (select ....) select ... from temptablename (2).多个临时表之间用『,』分开,格式如下: with a as (select did,arg(salary) 平均工资 from work gro

  • oracle中使用子查询插入数据和装载数据

    1.insert into employee select * from emp where deptno=20; 2.insert /*+APPEND*/ into employee select * from emp where deptno=20; 同样是大批量插入数据,第二种比第一种效率高很多.

  • Oracle学习之路(二):oracle多表查询+分组查询+子查询讲解与案例分析+经典练习题

    1.笛卡尔集和叉集 笛卡尔集会在下面条件下产生:省略连接条件.连接条件无效.所有表中的所有行互相连接. 为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件.在实际运行环境下,应避免使用全笛卡尔集. 使用CROSS JOIN 子句使连接的表产生叉集.叉集和笛卡尔集是相同的. 2.Oracle连接类型: Equijoin:等值连接 Non-equijoin:不等值连接 Outer join:外连接 Self join:自连接 使用表名前缀在多个表中区分相同的列.在不同表中具有相同列名的列可以

  • ORACLE 高级子查询

    :: 写多列子查询 :: 在返回空值时描述并解释子查询的行为 :: 写一个在 FROM 子句中的子查询 :: SQL 中使用分级子查询 :: 描述能够用相关子查询解决的问题类型 :: 写相关子查询 :: 用相关子查询更新和删除行 :: 使用 EXISTS 和 NOT EXISTS 操作 :: 使用 WITH 子句 Lesson Aim In this lesson, you learn how to write multiple-column subqueries and subqueries

  • Oracle学习(五)--sql查询(包含子查询)

    这里用到了三个表,emp,dept,salgrade 表的sql文件请前往此链接下载:链接:http://pan.baidu.com/s/1eQiV9uE 密码:oanr 注意阅读"请先读我"文件 结构如下面几个图所示 表中的数据有以下图所示: emp表----员工信息表 dept表-----部门信息表 salgrade表----工资等级表 1.sql查询 案例1:查询员工的编号.姓名.及工资职位 SQL>select empno,ename,sal,job from emp;

  • 让PostgreSQL支持没有别名的子查询(Oracle兼容)

    PostgreSQL里我们随便运行一个不带别名的子查询: postgres=# select * from (select * from pg_class); ERROR:  subquery in FROM must have an alias LINE 1: select * from (select * from pg_class);                       ^ HINT:  For example, FROM (SELECT ...) [AS] foo. postgr

  • The filter pushed in subquery issue in oracle 11G (filter推进子查询)

    the filter pushed in subquery issue in oracle 11g 今天开发的同事来问我一个SQL问题, 在一个字符字段to_number时提示有无效数值, 肉眼看全部为数字格式, 数据库版本 11.2.0.3 当然开始怀疑有不可显示字符(如char(10)), 可以创建个function来验证一下, 脚本如下: CREATE OR REPLACE function IS_NUMBER(str in varchar2) return number IS dummy

  • oracle之子查询常用

    子查询语法格式: select 字段 from table where 表达式 操作(子查询语句) select * from mytest mt where mt.id in (select me.mytest_id from myline me); oracle中sql执行的顺序是从where后最右边开始执行的,所以上面的sql在执行时,先执行子查询, 然后在执行mt.id in()作为where后数据查询的过滤条件.

  • 53.Oracle数据库SQL开发之 子查询——编写包含子查询的UPDATE和DELETE

    53.Oracle数据库SQL开发之 子查询--编写包含子查询的UPDATE和DELETE 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/49805741 UPDATE和DELETE语句中也可以使用子查询. 1.  编写包含子查询的UPDATE 在UPDATE语句中,可以将新列的值设置为单行子查询返回的结果. store@PDB1> update employees set salary=(selectavg(high_sa

  • oracle IN与EXISTS子查询的关系

    在我任职的公司里面,有很多的规范啊手册一类的东西.我们公司oracle语法规范里面有2条我一直就很怀疑(1.子查询结果集小,用IN 2.外表小,子查询表大,用EXISTS),我前几天看了一些文章说每个版本的oracle的CBO有一些的不同,我想试验下,刚才的2条规则.由于我手上只有10G和11G的环境,我只能给大家演示这2个版本的. 通过上面的例子,我发现一般情况下的子查询,用in和extsis在oracle 10G里面执行计划是一样的.接着试验11G 哈哈!用in和extsis在oracle

Tags: