1. 多列子查询

    where条件中出现多列与子查询进行比较

    多列子查询分为:成对比较和非成对比较

    成对比较:

    SQL> select ename,sal,job from emp where (deptno,job) in(select deptno,job from emp where ename='SCOTT');
    
    ENAME    SAL JOB
    ------ ----- ---------
    FORD ANALYST
    SCOTT ANALYST

    非成对比较:

    select ename,sal,job from emp
    where deptno=(select deptno from emp where ename='SCOTT')
    and job = (select job from emp where ename='SCOTT') ENAME SAL JOB
    ------ ----- ---------
    SCOTT ANALYST
    FORD ANALYST
  2. 标量子查询表达式

    标量子查询是从一行中返回一列值的子查询

    标量子查询可用于:

    1. DECODE 和CASE的条件和表达式部分

    2. 除了GROUP BY之外的所有SELECT语句

    CASE表达式中使用标量子查询:CASE表达式可以实现if --then-- else的功能

    SQL> select employee_id,last_name,(
       case
    when department_id=(select department_id from departments where location_id=)
    then 'CANDA' else'USA' end ) location
    from employees; EMPLOYEE_ID LAST_NAME LOCAT
    ----------- ------------------------- -----
    OConnell USA
    Grant USA
    Whalen USA
    Hartstein CANDA
    Fay CANDA
    Mavris USA
    Baer USA
    Higgins USA
    Gietz USA
    King USA
    Kochhar USA
    .......................
    107 rows selected.
  3. ORDER BY子句中使用标量子查询
    SQL> select ename,sal,deptno from emp order by (select dname from dept where emp.deptno=dept.deptno);
    
    ENAME             SAL     DEPTNO
    ---------- ---------- ----------
    CLARK
    KING
    MILLER
    JONES
    FORD
    ADAMS
    SMITH
    SCOTT
    WARD
    TURNER
    ALLEN
    JAMES
    BLAKE
    MARTIN rows selected.
  4. 相互关联的子查询

    相互关联子查询用于行-执行-行的处理主查询的每一行子查询都要执行一次:通俗的说就是,主查询--->子查询--->主查询。就是这个执行顺序。

    ---从emp表中查询 薪水大于 部门平均薪水 的用户名,部门编号和薪水,没有大于的则不会被显示出来。
    select ename,deptno,sal
    from emp outer
    where sal>(select avg(sal) from emp inner where outer.deptno=inner.deptno ); ENAME DEPTNO SAL
    ------ ------ -----
    ALLEN
    JONES
    BLAKE
    SCOTT
    KING
    FORD
  5. 再举一个相互关联的例子
    ---查询至少换了两次工作的员工---
    SQL> select employee_id,last_name,job_id from employees e where <=(select count(*) from job_history j where e.employee_id=j.employee_id); EMPLOYEE_ID LAST_NAME JOB_ID
    ----------- ------------------------- ----------
    Whalen AD_ASST
    Kochhar AD_VP
    Taylor SA_REP
  6. 使用EXISTS

    EXISTS 检测子查询中行的存在性

    1.如果值存在于子查询中:
       终止在子查询中的查找
       条件返回TRUE

    2.如果值不存在于子查询中:
       条件返回FALSE
       继续在子查询中的查找

    ---示例:查找是领导的员工
    SQL> select empno,ename from emp outer where exists(select mgr from emp inner where outer.empno=inner.mgr); EMPNO ENAME
    ---------- ----------
    JONES
    BLAKE
    CLARK
    SCOTT
    KING
    FORD rows selected.

    另一种写法:

    SQL> select empno ,ename from emp  where empno in(select mgr from emp);
    
         EMPNO ENAME
    ---------- ----------
    JONES
    BLAKE
    CLARK
    SCOTT
    KING
    FORD rows selected.
  7. 我们来做另一个实验:查找不是领导的员工,也就是最基层的员工了。
    SQL> select empno,ename from emp outer where not exists (select  from emp inner where outer.empno=inner.mgr);
    
         EMPNO ENAME
    ---------- ----------
    SMITH
    ALLEN
    WARD
    MARTIN
    TURNER
    ADAMS
    JAMES
    MILLER rows selected.
    ---这里解释一下:not exists里的整数1的作用,只要是个整数即可,‘abc’字符串也可以。
  8. 关联UPDATE

    使用相互关联的子查询更新一个表的行基于另外一个表的行

    SQL> create table e as select * from emp;
    
    表已创建
    
    SQL> alter table e add  dname varchar2();
    
    表已更改。
    
    SQL> desc e
    名称 是否为空? 类型
    ----------------------------------------- -------- ----------------------------
    EMPNO NUMBER()
    ENAME VARCHAR2()
    JOB VARCHAR2()
    MGR NUMBER()
    HIREDATE DATE
    SAL NUMBER(,)
    COMM NUMBER(,)
    DEPTNO NUMBER()
    DNAME VARCHAR2() SQL> select * from e; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
    ----- ------ --------- ----- -------------- ----- ---------- ------ ----------
    SMITH CLERK -12月-
    ALLEN SALESMAN -2月 -
    WARD SALESMAN -2月 -
    JONES MANAGER -4月 -
    MARTIN SALESMAN -9月 -
    BLAKE MANAGER -5月 -
    CLARK MANAGER -6月 -
    SCOTT ANALYST -4月 -
    KING PRESIDENT -11月-
    TURNER SALESMAN -9月 -
    ADAMS CLERK -5月 -
    JAMES CLERK -12月-
    FORD ANALYST -12月-
    MILLER CLERK -1月 - 已选择14行。 SQL> select * from dept; DEPTNO DNAME LOC
    ------ -------------- -------------
    ACCOUNTING NEW YORK
    RESEARCH DALLAS
    SALES CHICAGO
    OPERATIONS BOSTON SQL> update e set dname=(select dname from dept d where e.deptno=d.deptno); 已更新14行。 SQL> commit; 提交完成。 SQL> select * from e; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
    ----- ------ --------- ----- -------------- ----- ---------- ------ ----------
    SMITH CLERK -12月- RESEARCH
    ALLEN SALESMAN -2月 - SALES
    WARD SALESMAN -2月 - SALES
    JONES MANAGER -4月 - RESEARCH
    MARTIN SALESMAN -9月 - SALES
    BLAKE MANAGER -5月 - SALES
    CLARK MANAGER -6月 - ACCOUNTING
    SCOTT ANALYST -4月 - RESEARCH
    KING PRESIDENT -11月- ACCOUNTING
    TURNER SALESMAN -9月 - SALES
    ADAMS CLERK -5月 - RESEARCH
    JAMES CLERK -12月- SALES
    FORD ANALYST -12月- RESEARCH
    MILLER CLERK -1月 - ACCOUNTING
  9. 相互关联的DELETE

    使用相互关联的DELETE删除一个表的行基于另外一个表的行

    SQL> conn hr/hr
    已连接。 SQL> create table emp as select * from employees; 表已创建。 SQL> select * from tab; TNAME TABTYPE CLUSTERID
    ------------------------------ ------- ----------
    REGIONS TABLE
    COUNTRIES TABLE
    LOCATIONS TABLE
    DEPARTMENTS TABLE
    JOBS TABLE
    EMPLOYEES TABLE
    JOB_HISTORY TABLE
    EMP TABLE
    EMP_DETAILS_VIEW VIEW 已选择9行。 SQL> delete emp where exists(select employee_id from job_history where emp.employee_id=employee_id); 已删除7行。 SQL> roll
  10. WITH子句

    使用WITH子句, 在复杂查询中如果相同的查询块多次出现,可以重复使用

    WITH子句将结果存放到用户的临时表空间中

    WITH子句提高了性能

    select dname,sum(sal) from emp e,dept d where e.deptno=d.deptno
    group by dname
    having sum(sal) >(select sum(total_sal)/count(*)from (select dname,sum(sal) total_sal from emp e,dept d where e.deptno=d.deptno group by dname))
  11. 使用with子句
    with
    dept_costs as(select dname,sum(sal) total_sal from emp e,dept d where e.deptno=d.deptno
    group by dname),
    avg_costs as (select sum(total_sal)/count(*) avg_sal from dept_costs)
    select * from dept_costs where total_sal>(select avg_sal from avg_costs)
    order by dname

高级子查询【weber出品必属精品】的更多相关文章

  1. 全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

    安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装 ...

  2. 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

    <ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...

  3. 使用DML语句【weber出品必属精品】

    DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COL ...

  4. 数据库对象(视图,序列,索引,同义词)【weber出品必属精品】

    视图视图的定义:视图就是一个查询的别名为什么使用视图限制数据的存取 SQL> conn /as sysdba 已连接. SQL> grant create view to scott; 授 ...

  5. 静默安装ORACLE【weber出品必属精品】

    安装配置系统环境安装linux ,所有服务都不选择,只是选择安装开发工具,不要安装防火墙(当然也可以在后面关闭) 打开终端,执行如下命令,检查安装包,没有的都要安装 make, glibc, liba ...

  6. 集合运算符之全集、交集、补集【weber出品必属精品】

    集合的概念 与数学中的全集.交集.补集的概念是一样的 常用的集合运算符 集合运算符的作用:把两个查询构造为一个联合查询 1. 全集:求连个查询的全集 union all:将两个查询的所有数据全部列出, ...

  7. ORACLE SQL单行函数(二)【weber出品必属精品】

    11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type -------------------------------------- ...

  8. ORACLE SQL单行函数(三)【weber出品必属精品】

    16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED ...

  9. 创建存储过程和函数【weber出品必属精品】

    一.什么是存储过程和函数 1. 是被命名的pl/sql块 2. 被称之为pl/sql子程序 3. 与匿名块类似,有块结构: 声明部分是可选的(没有declare关键字) 必须有执行部分 可选的异常处理 ...

随机推荐

  1. How to start the Virtualbox VMs under terminal

    Since we have servral machine on my testbed(fedora), and if I need start some VMs on that, I have to ...

  2. 【转】C++:MessageBox的常见用法

    一    函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口 ...

  3. 莫队算法学习笔记【BZOJ2038:小Z的袜子】【SPOJ3267:D-query】

    很久以前傻乎乎地看来源奇怪的资料的时候被各种曼哈顿弄晕了. 然后现在学会的是分块方法.另新创一个分块方法. 让我们考虑这样一个区间询问问题…… 它有如下的性质: 0,n个数,Q个询问. 1,它没有修改 ...

  4. 深入了解session

    session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同.这里只探讨HTTP S ...

  5. linux pc syncy安装问题

    linux pc 上安装syncy遇到的坑 pycurl安装可以指定curl-config,这个是根据自己机器libcurl安装位置确定,不在默认位置时要指定:python setup.py inst ...

  6. CSAPP--虚拟存储器

    虚拟存储器 虚拟存储器(VM)是对主存的一种抽象概念.是硬件一场,硬件地址翻译,贮存,磁盘文件和内核软件的完美交互.他为每个进程提供了一个大的,一致的和私有的地址空间. 它将贮存堪称一个存储在磁盘上的 ...

  7. 最近写的页面,含有大量的ajax

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib ur ...

  8. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

    最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...

  9. Configuring HTTP and HTTPS

    Configuring HTTP and HTTPS .NET Framework (current version)   Other Versions   WCF services and clie ...

  10. 关于API的设计和需求抽象

    一,先来谈抽象吧,因为抽象跟后面的API的设计是息息相关的 有句话说的好(不知道谁说的了):计算机科学中的任何问题都可以抽象出一个中间层就解决了. 抽象是指在思维中对同类事物去除其现象的.次要的方面, ...