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'
            );

  例1:子查询中的Top-N问题

 select rownum,empno,ename,sal
from (
select rownum r,empno,ename,sal
from emp
order by sal desc)
where rownum<=3;

  例2:

 select empno,ename,sal,avgsal
from emp e,(
select deptno,avg(sal) avgsal
from emp
group by deptno) d
where e.deptno = d.deptno and e.sal > d.avgsal;

  例3:

 select sum(1) "total",
sum(decode(to_char(hiredate,'yyyy'),'',1,0)) "1980",
sum(decode(to_char(hiredate,'yyyy'),'',1,0)) "1981",
sum(decode(to_char(hiredate,'yyyy'),'',1,0)) "1982",
sum(decode(to_char(hiredate,'yyyy'),'',1,0)) "1987"
from emp;

Oracle Day04 子查询的更多相关文章

  1. Oracle 之——子查询 DDL DML 集合 及其他数据对象

    Oracle 学习笔记(二) 知识概要: 1.子查询 2.集合操作 3.DML语句操作 4.其他数据库对象 1.子查询 查询工资比SCOTT高的员工信息 1  select * 2  from emp ...

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

    with c as (select a.trandt,sum(a.tranam) tranam from tran a group by a.trandt )--将子查询抽取出来,以后可以直接用.该方 ...

  3. Oracle【子查询】

    Oracle子查询:当一个查询依赖于另外一个查询的结果的时候,就需要使用子查询.单行子查询 :筛选条件不明确,需要执行一次查询且查询结果只有一个字段且字段值只有一个.注意:where子句中允许出现查询 ...

  4. Oracle之子查询:Top-N问题

    学习了SQL子查询,遇到个Top-N问题,即:加入有张工资表(这里使用Oracle SCOTT用户的emp表),需要查找工资最高的3个员工信息,以下列格式输出: 乍眼一看,这很简单啊,对sal进行排序 ...

  5. oracle之子查询、创建用户、创建表、约束

      子查询                                    子查询可以分为单行子查询和多行子查询   单行子查询           [1] 将一个查询的结果作为另外一个查询的条 ...

  6. Oracle 通过子查询批量添加、修改表数据

    1.通过查询快速创建表 create table test1(id,job,mgr,sal) as () ) ---这是一个分页查询 ok,表创建成功 2.通过查询快速创建视图 create or r ...

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

    曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询. SELECT ...

  8. 数据库Oracle的子查询练习

    1.写一个查询显示与 Zlotkey 的 在同一部门的雇员的 last name和 hire date,结果中不包括 Zlotkey --1.写一个查询显示与 Zlotkey 的 在同一部门的雇员的 ...

  9. .Net程序员学用Oracle系列(14):子查询、集合查询

    1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY ...

随机推荐

  1. ccf cv讲座记录

  2. lsof使用

    用netstat命令去统计服务器目前的网络连接状态 netstat -n|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'   netstat - ...

  3. 写入XML文件

    public static void writeXMLFile(Document doc,String xmlFileName) throws IOException{  OutputFormat f ...

  4. Url有值怎么使用get传值

    原来url有数据 test 我们可以$_GET可以获取出来 一般form表单头用get方式都可以满足大多需求 但有一种情况 url里已经有值的时候 用url就会覆盖原来的值 而数据就会丢失 : 数据又 ...

  5. RF环境搭建

    官网:http://robotframework.org/ 序号 安装包名 安装方法 下载地址 备注 1 python exe文件,直接双击安装 https://www.python.org/down ...

  6. Learning C# by Developing Games with Unity 5.x(2nd)

    项目:https://pan.baidu.com/s/1o7IMcZo using UnityEngine; using System.Collections; namespace VoidGame ...

  7. Linux下各类压缩文件命令小结

    .tar 解包:tar xvf FileName.tar    解包后原始文件仍存在 打包:tar cvf FileName.tar DirName1 Filename1 - 列出内容:tar tvf ...

  8. linux的命令使用记录

    iptables禁止53端口的出包(dns) iptables -A OUTPUT -p udp --dport 53 -j DROP linux查看网络监听端口 netstat -npl 文件复制 ...

  9. fzu Problem 2128 最长子串(KMP + strstr 经典好题)

     Problem Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长.  Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10 ...

  10. js数组、对象、正则

    1.根据给定的条件在原有的数组上,得到所需要的新数组var a = [-1, -1, 1, 2, -2, -2, -3, -3, 3, -3];function f(s, e) {    var re ...