ORACLE--子查询

上一篇 / 下一篇  2016-01-09 15:48:38 / 个人分类:Oracle数据库从入门到精通

oacle基础知识

1、创建表空间

2、创建用户

3、创建一个表

4、数据库标准语言(DDL、DML、TCL、DQL、DCL)

5、数据库相关运算符(特别注意||运算符)

6、ORACLE相关函数及语法使用(group by、 order by、 having等等相关)

http://www.w3school.com.cn/sql/sql_delete.asp

oracle进阶1

1、非关联子查询(子查询中不会涉及到主查询中的列)


非关联子查询的执行过程:

先执行子查询,子查询的返回结果作为主查询的条件,再执行主查询。

子查询只执行一遍。

若子查询返回的结果为多个值,ORACLE会自动去掉重复值之后,再将结果返回给主查询。

子查询可以返回单行结果,可以返回多行结果,也可以不返回结果

1)如果子查询未返回任何行,则主查询也不会返回任何结果(空值)

SQL> select * from emp where sal>(select sal from emp where empno=8000);

Warning: connection was lost and re-established

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 

2如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符(正常)

SQL> select * from emp where sal>(select sal from emp where empno=7934);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7499 ALLEN      SALESMAN   7698 1981/2/20     1760.00    300.00     30

 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30

 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10

 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

 7839 KING       PRESIDENT       1981/11/17    5000.00               10

 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

 

3如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符(多值,非法)

SQL> select * from emp where deptno=(select deptno from dept );

select * from emp where deptno=(select deptno from dept )

ORA-01427:单行子查询返回多个行

 

子查询如果返回多行结果时,可以使用一下的运算符处理结果:

1any即任何一个。如果在where条件中加入>any,意思是大于任何一个,也就是大于最小的

SQL> select * from emp where deptno>any(select deptno from dept );

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30

 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

 7499 ALLEN      SALESMAN   7698 1981/2/20     1760.00    300.00     30

 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30

 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30

 7900 JAMES      CLERK      7698 1981/12/3      950.00               30

 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

 7369 SMITH      CLERK      7902 1980/12/17     800.00               20

 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

 

2some即一些。和any的用法基本相同。用any的地方都可以用some代替。不过some大多用在=操作中。表示等于所选集合中的任何一个。当然any也可以用于=操作中,效果和some相同。

SQL> select * from emp where deptno=some(select deptno from dept );

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7369 SMITH      CLERK      7902 1980/12/17     800.00               20

 7499 ALLEN      SALESMAN   7698 1981/2/20     1760.00    300.00     30

 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30

 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30

 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30

 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10

 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

 7839 KING       PRESIDENT       1981/11/17    5000.00               10

 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

 7900 JAMES      CLERK      7698 1981/12/3      950.00               30

 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

 

3all即所有。如果在where条件中加入>all,意思是大于每一个,也就是大于最大的。

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

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

 7839 KING       PRESIDENT       1981/11/17    5000.00               10

 

4In

SQL> select * from emp t where t.deptno in (10,20);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7369 SMITH      CLERK      7902 1980/12/17     800.00               20

 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10

 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

 7839 KING       PRESIDENT       1981/11/17    5000.00               10

 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

注释:不管在什么情况下子查询能够保证放回值是1<=1行,则可采用单行比较符:=、<、>、<=、>=等;

否则要采用多行比较符:IN、> ANY 、> ALL、< ANY、< ALL等。

 

2、关联子查询(子查询会引用外部查询中的一列或多列)

1)、关联子查询执行过程

关联子查询会引用外部查询中的一列或多列.在执行时,外部查询的每一行都被一次一行地传递给子查询.子查询依次读取外部查询传递来的每一值,并将其用到子查询上,直到外部查询所有的行都处理完为止.然后返回查询结果.

 下面例子中,外部查询从emp表中检索出所有的行,并将其传递给内部查询.内部查询依次读取外部查询传递来的每一行数据,并对内部查询中job等于外部查询的中job值的每种产品计算平均价格.:查询第一行job1,把这行数据传递到内部查询,内部查询根据这个编号到产品表中找到同类型的所有行,然后求如平均价格,外部查询再根据这个结果来判断查询条件(外部查询是在执行where语句时用到子查询,子查询执行完后还返回到where子句中).

SQL> select t.ename,t.job,t.sal from emp t where t.sal>(select avg(sal) from emp a where a.job=t.job);

ENAME      JOB             SAL

---------- --------- ---------

ALLEN      SALESMAN    1760.00

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

TURNER     SALESMAN    1500.00

ADAMS      CLERK       1100.00

MILLER     CLERK       1300.00

 

总结:

子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询)。

所有的子查询可以分为两类,即关联子查询和非关联子查询。

非关联子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

关联子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。


TAG: 基础知识

 

评分:0

我来说两句

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

我的存档

数据统计

  • 访问量: 2627
  • 日志数: 4
  • 建立时间: 2016-01-05
  • 更新时间: 2016-01-10

RSS订阅

Open Toolbar