Oracle SQL ANY和ALL语句

Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理。

Some表示满足其中一个的含义,是用or串起来的比较从句。

例如:SELECT * FROM emp WHERE empno = ‘hmz‘ OR dept = ‘10‘

Any也表示满足其中一个的含义,也是用or串起来的比较从句。 Some和Any的区别就是:Some用在“=”的比较关系中。

英文中的否定句中使用any肯定句中使用some,这一点是一样的。

some和any都有“一些”的意思 some用在肯定句中,any用在否定句或疑问句中。 【注1】但表示期望得到肯定回答的疑问句中用some。 【注2】any还有“任何”的意思,some没有

比较:She‘s too old to do any work.她年事已高,干不了什么活了。

She‘s old enough to do some work.她已长大了,可以干些活了。

All则表示满足其中所有查询结果的含义,使用and串起来的比较从句。

【实例】

查询比部门号为10的员工中的任何一个员工工资都要高的员工的姓名和个人工资。

也就是说只要比部门号为10中工资最少的员工高就满足条件。

SELECT ename,sal FROM emp WHERE sal > ANY(SELECT sal FROM emp WHERE deptno = 10);

这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。

例如: SELECT ename,sal FROM emp WHERE sal = SOME(SELECT sal FROM emp WHERE deptno = 30) AND deptno NOT IN (SELECT deptno FROM emp WHERE deptno = 30);

含义是找到和30号部门员工的任何一个人工资相同的那些员工。

最后一个关键字all的用法就是要与子查询的每一结果都要匹配。

SELECT ename,sal FROM emp WHERE sal > ALL(select sal from emp where deptno = 20);

上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员

工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工。

总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果

集“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系。

SQL> select * from emp;
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     1600.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
14 rows selected

SQL> select * from emp order by deptno;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
14 rows selected

SQL> select ename,deptno,sal from emp where sal > any (select sal from emp where deptno=10);
ENAME      DEPTNO       SAL
---------- ------ ---------
KING           10   5000.00
FORD           20   3000.00
SCOTT          20   3000.00
JONES          20   2975.00
BLAKE          30   2850.00
CLARK          10   2450.00
ALLEN          30   1600.00
TURNER         30   1500.00
8 rows selected

SQL> select ename,deptno,sal from emp where sal > all (select sal from emp where deptno=10);
ENAME      DEPTNO       SAL
---------- ------ ---------

SQL> select ename,deptno,sal from emp where sal > all (select sal from emp where deptno=20);
ENAME      DEPTNO       SAL
---------- ------ ---------
KING           10   5000.00

SQL> 
SQL> select ename,deptno,sal from emp where sal < all (select sal from emp where deptno=10);
ENAME      DEPTNO       SAL
---------- ------ ---------
WARD           30   1250.00
MARTIN         30   1250.00
ADAMS          20   1100.00
JAMES          30    950.00
SMITH          20    800.00

SQL>
SQL>
SQL>
SQL> select ename,deptno,sal from emp where sal < any (select sal from emp where deptno=10);
ENAME      DEPTNO       SAL
---------- ------ ---------
SMITH          20    800.00
JAMES          30    950.00
ADAMS          20   1100.00
WARD           30   1250.00
MARTIN         30   1250.00
MILLER         10   1300.00
TURNER         30   1500.00
ALLEN          30   1600.00
CLARK          10   2450.00
BLAKE          30   2850.00
JONES          20   2975.00
SCOTT          20   3000.00
FORD           20   3000.00
13 rows selected

SQL> select sal from emp where deptno=10
  2  ;
      SAL
---------
  2450.00
  5000.00
  1300.00

SQL> select ename,deptno,sal from emp where sal < any (select sal from emp where deptno=20);
ENAME      DEPTNO       SAL
---------- ------ ---------
SMITH          20    800.00
JAMES          30    950.00
ADAMS          20   1100.00
WARD           30   1250.00
MARTIN         30   1250.00
MILLER         10   1300.00
TURNER         30   1500.00
ALLEN          30   1600.00
CLARK          10   2450.00
BLAKE          30   2850.00
JONES          20   2975.00
11 rows selected

SQL> select sal from emp where deptno=20;
      SAL
---------
   800.00
  2975.00
  3000.00
  1100.00
  3000.00

SQL> select ename,deptno,sal from emp where sal < all(select sal from emp where deptno=20);
ENAME      DEPTNO       SAL
---------- ------ ---------

SQL> 

<ANY是比最大的还要小

>ANY是比最小的还要大

<ALL是比所有值都要小,即比最小的还要小

>ALL是比所有值都要大,即比最大的值还要大

时间: 2024-10-03 07:08:12

Oracle SQL ANY和ALL语句的相关文章

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第4/5套:Oracle SQL语言之查询语句.主要学习Oracle数据库SQL查询限制排序.Oracle SQL联接查询.Oracle SQL子查询等. 视频学习地址: http://edu.51cto.com/course/course_id-8047.html Oracle SQL语

Oracle SQL语言DML语句与事务_超越OCP精通Oracle视频教程培训28

Oracle SQL语言DML语句与事务_超越OCP精通Oracle视频教程培训28 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第3/5套:Oracle SQL语言DML语句与事务.主要学习Oracle数据库SQL语句INSERT命令,学习使用UPDATE命令,学习使用DELETE命令,学习创建PL/SQL对象,事务概念与控制,锁的检测和锁争用,了解撤销数据. Oracle SQL语言DML语句与事务管理,课

oracle sql语句取得本周本月本年的数据

[sql] --国内从周一到周日 国外是周日到周六  select to_char(sysdate-1,'D') from dual;--取国内的星期几 去掉减一取国外的星期-- [sql] --取本周时间内的数据  select * from table  where DTIME >=trunc(next_day(sysdate-8,1)+1) and DTIME<=trunc(next_day(sysdate-8,1)+7)+1 ;     select * from table  whe

oracle sql语句

##########基本操作##########启动数据库:su - oraclesqlplus / as sysdbaSQL> startup 对scott用户解锁:SQL> conn / as sysdbaSQL> alter user scott identified by tiger account unlock; 连接到指定的数据库用户:SQL> conn scott/tiger 实现操作系统开机数据库自动open:vi /etc/oratab--------------

oracle mysql sql serve where in 语句的不同

类似这样的语句在mysql  oracle 是可以执行成功的, select * from classfirst where (classid ,classname) not in (select classid, classname from classfirst where classid=2 ) 但是在sql server 中提示以下错误 消息 4145,级别 15,状态 1,第 1 行在应使用条件的上下文(在 ',' 附近)中指定了非布尔类型的表达式. 所以在日常的使用中对于sql  s

oracle sql 基础(二):select 语句

为了从数据库中查询数据,你需要用SQL语言中使用最多的SELECT语句.我们分别介绍SELECT语句的基础语法.子查询.从多表中查询数据,然后再进行实例解析. 一.SELECT语句的基础语法 SELECT语句就像叠加在数据库表上的过滤器,即选择查询用于定位数据库特定的列和行.下面是SELECT语句的基础语法.  SELECT [ALL|DISTINCT SELECT_LIST FROM {table_name|view_name} [WHERE search_condition] [GROUP

Oracle Sql语句优化

1.最高效的删除重复记录方法 (因为使用了ROWID)   例子:  DELETE FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID) FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO); 2.在含有子查询的 SQL 语句中 , 要特别注意减少对表的查询   例子:  SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = (SELECT TAB_NAME,DB_V

获取oracle sql语句中绑定变量值的方法

在诊断 sql的性能问题时,我们有时候需要获取其绑定变量的实际值,然后将此实际值带入到sql语句当中,用原来的sql构成select语句(带where条件),实际的执行一下,看一下选择性如何. 本文就是说获取其绑定变量值的方法.本文的编写得到枯荣长老的帮助,在此表示感谢. 本文适用于与oracle 10G或者更高版本的db. alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss'; set linesize 400 col sql_

db2和oracle sql 语句中计算两个时间差的语法

db2 sql语句中计算两个日期相差的语法 结束日期为:2015-10-10  11:30:00 开始日期为:2015-09-09  10:40:00 (1)timestampdiff(8,char(结束时间-开始时间) )(加时分秒计算,会舍去零数)值为744小时 (2)(days(结束时间)-days(开始时间))*24 +hour(结束时间)-hour(开始时间) (不加时分秒计算)值为745小时 (3)Days(结束日期)-days(开始日期)的值为31天 (4)Day(结束日期)-da