SQL can use standard comparison operators (<, >, =, and so on) with subqueries returning any number of rows by using ANY or ALL between the comparison operator and the subquery.
ANY means the result is true for at least one value returned by the subquery.
The following table illustrates the definitions of ANY and ALL using iterated OR and AND constructs.
In the table, the symbol, #, represents any standard comparison operator: <, >, =, >=, <=, or <>.
V1, V2, V3, and so on represent the values returned by the subquery.
X # ANY(subquery) | X # ALL(subquery) |
---|---|
(X # V1) OR | (X # V1) AND |
(X # V2) OR | (X # V2) AND |
(X # V3) OR | (X # V3) AND |
The following code illustrates an example of using the ANY operator, showing all emp with a monthly salary that is higher than at least one manager.
select e.empno, e.ename, e.job, e.msal from emp e where e.msal > ANY (select x.msal from emp x where x.job = 'MANAGER');
SQL> SQL>-- w ww. j a va 2 s . c o m SQL> drop table emp; Table dropped. SQL> create table emp( 2 empno NUMBER(4) primary key, 3 ename VARCHAR2(8) not null , 4 init VARCHAR2(5) not null , 5 job VARCHAR2(8) , 6 mgr NUMBER(4) , 7 bdate DATE not null , 8 msal NUMBER(6,2) not null , 9 comm NUMBER(6,2) , 10 deptno NUMBER(2) default 10) ; SQL> SQL> insert into emp values(7001,'SMITH','N', 'TRAINER', 7902,date '1975-12-17', 1800 , NULL, 20); SQL> insert into emp values(7002,'ALLEN','JAM','SALESREP',7006,date '1971-05-20', 1600, 300, 30); SQL> insert into emp values(7003,'WARD', 'TF' ,'SALESREP',7006,date '1972-03-02', 1250, 500, 10); SQL> insert into emp values(7004,'JACK', 'JM', 'MANAGER', 7009,date '1977-04-02', 2975, NULL, 20); SQL> insert into emp values(7005,'BROWN','P', 'SALESREP',7006,date '1976-09-28', 1250, 1400, 30); SQL> insert into emp values(7006,'BLAKE','R', 'MANAGER', 7009,date '1973-11-01', 2850, NULL, 10); SQL> insert into emp values(7007,'CLARK','AB', 'MANAGER', 7009,date '1975-06-09', 2450, NULL, 10); SQL> insert into emp values(7008,'SCOTT','DEF','TRAINER', 7004,date '1979-11-26', 3000, NULL, 20); SQL> insert into emp values(7009,'KING', 'CC', 'DIRECTOR',NULL,date '1972-10-17', 5000, NULL, 10); SQL> insert into emp values(7010,'BREAD','JJ', 'SALESREP',7006,date '1978-09-28', 1500, 0, 30); SQL> insert into emp values(7011,'ADAMS','AA', 'TRAINER', 7008,date '1976-12-30', 1100, NULL, 20); SQL> insert into emp values(7012,'JONES','R', 'ADMIN', 7006,date '1979-10-03', 8000, NULL, 30); SQL> insert into emp values(7902,'FORD', 'MG', 'TRAINER', 7004,date '1979-02-13', 3000, NULL, 20); SQL> insert into emp values(7934,'MARY', 'ABC','ADMIN', 7007,date '1972-01-23', 1300, NULL, 10); SQL> SQL> SQL> select e.empno, e.ename, e.job, e.msal 2 from emp e 3 where e.msal > ANY (select x.msal 4 from emp x 5 where x.job = 'MANAGER'); EMPNO | ENAME | JOB | MSAL --------- | -------- | -------- | --------- 07004.00 | JACK | MANAGER | 02975.00 07006.00 | BLAKE | 02850.00 07008.00 | SCOTT | TRAINER | 03000.00 07009.00 | KING | DIRECTOR | 05000.00 07012.00 | JONES | ADMIN | 08000.00 07902.00 | FORD | TRAINER | 03000.00 6 rows selected. SQL>