본문 바로가기

IT/오라클

오라클 수업 6일째 (18.04.03) 서브쿼리

select * from emp;

select * from dept;


select e.ename, d.dname, e.deptno

from emp e, dept d

where e.deptno(+)=d.deptno;


select e.ename, d.dname, e.deptno

from emp e left outer join dept d

on e.deptno=d.deptno;


/*

    서브쿼리(Sub Query) : 서브 쿼리는 하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장

    SQL 문장 = Query 문 = Query = 질의 = SELECT

    

    서브 쿼리는 하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장.

    그렇기에 서브 쿼리를 포함하고 있는 쿼리문을 메인 쿼리, 포함된 또 하나의 쿼리를 서브 쿼리라 함

    서브 쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 둘러쌓아야 함

    서브 쿼리는 메인 쿼리가 실행되기 이전에 한번만 실행이 됨

    

    서브쿼리를 써야되는 이유

    * 조회하려는 대상을 알지 못할 때

    * 조회하려는 대상이 너무 많을 떄

    * 조회하려는 대상이 유동적일 때 사용함


    출처: http://javannspring.tistory.com/42 [지경's 공부공간]

    

    -- SCOTT의 부서명

    -- 쿼리간 결합(중첩)

    

    S1(S2)

    하나의 테이블(쿼리S2)에서 검색한 결과를

    다른 테이블(쿼리S1)에 전달하여 새로운 결과를 검색

    S2가 서브쿼리(SQ)

*/

select (1 + 3) * 5 from dual;


-- 1. 실행결과(20)를 사용자에게 리턴

select deptno 

from emp 

where ename='SCOTT';


-- 2. 20을 주면 실행결과(RESEARCH)를 사용자에게 리턴

select dname

from dept

where deptno=20;


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

-- 2. 서브쿼리(하위질의, 부질의))를 주면 실행결과(20)를 메인쿼리(상위질의, 주질의)에게 리턴

-- 메인커리가 최종 실행결과(RESEARCH)를 사용자에게 리턴

-- 서브쿼리는 메인쿼리가 필요한(참조) 값을 제공(리턴)

-- 서브쿼리 : 테이블을 결합하는 방식이 아닌 쿼리결합

select dname

from dept

where deptno = (select deptno 

                        from emp 

                        where ename='SCOTT');


-- 조인이 서브쿼리보다는 속도, 성능 우위...

-- 반드시 그렇다는 것은 아님 - 퍼포먼스

select ename, deptno

from emp

where deptno = (select deptno 

                        from emp 

                        where ename='SCOTT')

                        and ename <> 'SCOTT';


-- 조인방식

select e.ename, e.deptno 

from emp e, emp m

where e.deptno='20' and m.ename='SCOTT' and e.ename <> m.ename;


-- SCOTT와 동일한 직급을 가진 사원을 출력하는 SQL 문을 작성

-- 서브쿼리

select *

from emp

where job = (select job

                   from emp

                   where ename='SCOTT');

                   

-- SCOTT의 급여와 동일하거나 더 많이 받는 사원 명과 급여를 출력

-- 메인 쿼리 조건 컬럼과 서브쿼리의 선택 컬럼이 같아야 함

-- 서브쿼리

select ename, sal

from emp

where sal >= (select sal from emp where ename='SCOTT');


-- DALLAS에서 근무하는 사원의 이름, 부서 번호를 출력하시오.

select * from emp;

select * from dept;


select ename, deptno

from emp

where deptno=(select deptno

                from dept

                where loc='DALLAS');



select ename, deptno

from emp

where deptno=(select deptno

                from dept

                where loc= UPPER(:loc));



-- SALES(영업부) 부서에서 근무하는 모든 사원의 이름과 급여를 출력

select * from emp;

select * from dept;


select ename, sal

from emp

where deptno = (select deptno

                        from dept

                        where dname='SALES');


-- 소문자를 입력할 경우 대문자로 변환 시키는 함수 사용

select ename, sal

from emp

where deptno = (select deptno

                        from dept

                        where dname=UPPER(:loc));


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

이정봉 샘이 정리 하신 내용




--SCOTT의 부서명

-- 쿼리간 결합(중첩)

/*

S1(S2)

하나의 테이블(쿼리S2)에서 검색한 결과를 

다른 테이블(쿼리S1)에 전달하여 새로운 결과를 검색

S2가 서브쿼리(SQ)

*/

SELECT  DNAME

           FROM  DEPT

  WHERE  DEPTNO = ( SELECT DEPTNO 

     FROM EMP

     WHERE ENAME='SCOTT');

  SELECT (1 + 3) *5

  from dual;

                         

--1. 실행결과(20)를 사용자에게 리턴

SELECT DEPTNO 

     FROM EMP

     WHERE ENAME='SCOTT';

                         

--2. 20을 주면 실행결과(RESEARCH)를 사용자에게 리턴                         

SELECT  DNAME

           FROM  DEPT

  WHERE  DEPTNO =20; 

                         

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

  --2. 서브쿼리(하위질의,부질의)을 주면 실행결과(RESEARCH)를 메인쿼리(상위질의,주질의))에게 리턴

  -- 메인쿼리가 최종 실행결과(RESEARCH)를 사용자에게 리턴 

  -- 서브쿼리는 메인쿼리가 필요한(참조)값을 제공리턴

SELECT  DNAME

           FROM  DEPT

  WHERE  DEPTNO =(SELECT DEPTNO 

     FROM EMP

     WHERE ENAME='SCOTT');

 

-- 조인이 서브쿼리보다 속도,성능 우위 

-- 내부조인 > 외부조인

SELECT ENAME, DEPTNO  

           FROM  EMP

  WHERE  DEPTNO = ( SELECT DEPTNO 

     FROM EMP

     WHERE ENAME='SCOTT')

                         AND ENAME <> 'SCOTT';

                         

SELECT e.ENAME, e.DEPTNO  

FROM  EMP e,EMP c

 WHERE  e.DEPTNO =c.DEPTNO 

 AND e.ENAME='SCOTT'

 AND e.ENAME <>c.ENAME ;

 

 -- 메인쿼리 조건컬럼과 서브쿼리 선택컬럼은 동일

 SELECT ENAME, SAL  

FROM EMP

     WHERE SAL >=(SELECT SAL 

         FROM EMP

          WHERE ENAME ='SCOTT');

                          

SELECT ENAME, DEPTNO 

FROM EMP

WHERE DEPTNO = (SELECT DEPTNO 

           FROM DEPT

   WHERE LOC = :loc);

                       

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

    SELECT ENAME, SAL 

FROM EMP 

     WHERE DEPTNO = (SELECT DEPTNO 

  FROM DEPT 

  WHERE DNAME='SALES');                   

                          

     SELECT EMPNO, ENAME , SAL, HIREDATE

            ,(SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = E.DEPTNO) DNAME

FROM EMP E

WHERE SAL >= 2000;


 SELECT ENAME, SAL  

FROM EMP

     WHERE SAL >=(SELECT SAL 

         FROM EMP

          WHERE ENAME ='SCOTT');

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

--서브쿼리 조인 변환

--메인쿼리 WHERE뒤의 DEPTNO는 조인조건컬럼으로 이동

--서브쿼리 테이블이 메인쿼리 FROM으로 이동

--서브쿼리 WHERE DNAME='SALES'행조건컬럼으로 이동

SELECT ENAME,SAL 

FROM EMP

     WHERE DEPTNO =(SELECT DEPTNO 

  FROM DEPT 

  WHERE DNAME='SALES');                         

                          

SELECT  E.ENAME,E.SAL

FROM EMP E , DEPT D

WHERE D.DEPTNO = E.DEPTNO

AND DNAME='SALES';


- ANSI 표준

SELECT E.ENAME,E.SAL

FROM EMP E INNER JOIN DEPT D

ON D.DEPTNO = E.DEPTNO

WHERE DNAME='SALES';














-- 6. 직속상관이 KING인 사원의 이름과 급여를 출력

select * from emp;

select * from dept;


-- ★★화면에 노출시킬 테이블 하나의 테이블에 있으면 서브쿼리

-- ★★여러개의 컬럼이 서로 다른 테이블로 나눠져 있으면 조인쿼리

-- 공통컬럼은 항상 같을수는 없음

SELECT ENAME, SAL

            FROM EMP

            WHERE MGR=(SELECT EMPNO

            FROM EMP

            WHERE ENAME='KING');



-- 사원테이블에서 최대급여금액와 최대급여를 받는 사원명을 출력

SELECT ENAME, SAL

FROM EMP 

WHERE SAL = (SELECT MAX(SAL) FROM EMP);




--평균 급여를 구하는 쿼리문을 서브 쿼리로 사용하여 

--평균 급여보다 더 많은 급여를 받는 사원을 검색하는 문장은 다음과 같습니다. 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > (SELECT AVG(SAL) FROM EMP);


--WHERE 에는 그룹함수 X

SELECT ENAME, SAL

FROM EMP

WHERE SAL > AVG(SAL);


--다중 행 서브 쿼리

/*

다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가 

하나 이상의 행일 때 사용하는 서브 쿼리입니다. 

다중 행 서브 쿼리는 반드시 다중 행 연산자(Multiple Row Operator)와 

함께 사용해야 합니다.


결과가 2개 이상 구해지는 쿼리문을 서브 쿼리로 

기술할 경우에는 다중 행 연산자와 함께 사용해야 합니다. 

*/


/* 문제 ##########

주어진 문제가 3000 이상 받는 사원이 소속된 

부서(10번, 20번)와 동일한부서에서 근무하는 사원이기에 서브쿼리의 결과 중에서 

하나라도 일치하면 참인 결과를 구하는 IN 연산자와 함께 사용되어야 합니다. 

*/

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO IN (SELECT DISTINCT DEPTNO

                             FROM EMP 

                             WHERE SAL>=3000);


--성능향상

--WHERE 뒤의 DEPTNO는 내부서브쿼리의 조인컬럼으로 이동

--메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참

--하나라도 참이면 비교연산 종료

--EXITS : 서브 쿼리의 WHERE절의 조건이 하나라도 참이면 실행종료

--하나라도 참이면 비교연산(부서번호가 존재한다면 참) 종료

--EXITS(값목록) X EXITS(서브쿼리) 0

--EXITS(서브쿼리 + 조인절)


SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO

                      FROM EMP 

                      WHERE DEPTNO=e.DEPTNO

                      AND SAL>=3000);

                      


SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO

                      FROM EMP 

                      WHERE DEPTNO=30);

                      

select * from emp;

select * from dept;

/* 30번 부서가 보이기 때문에 14개 행 출력

SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO

                      FROM EMP 

                      WHERE DEPTNO=10

                      AND SAL>=3000);


SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO

                      FROM EMP 

                      where SAL>=3000);

*/                      

/*

부서별로 가장 급여를 많이 받는 사원의 정보(사원 번호, 사원이름, 급여, 부서번호)를 출력

(IN 연산자 이용)

*/

select * from emp;


SELECT EMPNO, ENAME, SAL, DEPTNO --사원 번호, 사원이름, 급여, 부서번호

FROM EMP

WHERE SAL IN( SELECT MAX(SAL) --부서별로 가장 급여를 많이 받는 사원의 정보

                                FROM EMP 

                                GROUP BY DEPTNO);

                                

/*

직급(JOB)이 MANAGER인 사람의 속한 부서의 부서 번호와 부서명과 지역을 출력하시오.

*/


select * from emp;

select * from dept;


SELECT DEPTNO, DNAME,LOC 

FROM DEPT

WHERE DEPTNO IN (SELECT DEPTNO 

FROM EMP 

WHERE JOB='MANAGER');


-- ALL 연산자

/*

찾아진 값에 대해서 AND 연산을 해서 모두 참이면 참이 되는 셈

> ALL 은 “모든 비교값 보다 크냐”고 묻는 것이 되므로 

최대값보다 더 크면 참이 됩니다. 


> ALL : 모든 값보다 크냐고 묻는 것이 되므로 최대값보다 더 크면 참

< ALL : 모든 값보다 작냐고 묻는 것이 되므로 최소값보다 더 작으면 참 

> ANY : 임의의 비교값 보다 크냐 묻는 것이 되므로 최소값보다 더 크면 참

< ANY : 임의의 비교값 보다 작냐 묻는 것이 되므로 최대값보다 더 작으면 참


*/

/*

    30번 소속 사원들 중에서 급여를 가장 많이 받는 사원보다 

    더 많은 급여를 받는 사람의 이름, 급여를 출력하는 쿼리문을 작성해 봅시다. 

*/

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ALL(SELECT SAL

                FROM EMP

                WHERE DEPTNO =30);

/* 

위의 서브 쿼리만 실행 시 아래 결과 출력

sal

=====

1600

1250

1250

2850

1500

950

*/

/*

전체 실행시

ENAME, SAL

========

jones, 2975

scott, 3000

ford, 3000

king, 5000

*/

/*

다음은 부서번호가 30번인 사원들의 급여 중 

가장 작은 값(950)보다 많은 급여를 받는 사원의 

이름, 급여를 출력하는 예제를 작성해 봅시다. 

*/


-- 임의의 비교값 보다 크냐 묻는 것이 되므로 최소값 950보다 더 크면 참

-- ANY = SOME

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ANY(SELECT SAL

                FROM EMP

                WHERE DEPTNO =30);

/*

*/

/*

ANY 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상만 일치하면 참입니다.

ANY는 찾아진 값에 대해서 하나라도 크면 참이 되는 셈이 됩니다. 

그러므로 찾아진 값 중에서 가장 작은 값 즉, 최소값 보다 크면 참이 됩니다. 

*/

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ANY (SELECT SAL 

                            FROM EMP 

                            WHERE DEPTNO = 30);


SELECT * FROM EMP WHERE DEPTNO=30;

SELECT ENAME, SAL FROM EMP WHERE SAL > '950';

굵은 글자들은 서로 같은 값을 출력

/*

ENAME,     SAL

===========

ADAMS 1100

MARTIN 1250

WARD 1250

MILLER 1300

TURNER 1500

ALLEN 1600

CLARK 2450

BLAKE 2850

JONES 2975

SCOTT 3000

FORD 3000

KING     5000

*/






SELECT * FROM emp;

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO IN (

            SELECT DISTINCT DEPTNO

            FROM EMP 

            WHERE SAL>=3000);

            

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO='10';

            

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO='20';

            

/*

ENAME, SAL, DEPTNO

==============

SCOTT, 3000, 20

KING, 5000, 10 

FORD, 3000, 20

*/


SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO IN (

                            SELECT DISTINCT DEPTNO

                            FROM EMP 

                            WHERE SAL>=3000);


/*

전체(메인쿼리 + 서브쿼) 실행시

ENAME, SAL, DEPTNO

==============

FORD, 3000, 20

ADAMS, 1100, 20

SCOTT, 3000, 20

JONES, 2975, 20

SMITH, 800, 20

MILLER, 1300, 10

KING, 5000, 10

CLARK, 2450, 10


서브쿼리 실행시

DEPTNO

=====

20

10

*/







=============================== 다시정리


/*

Exists 와 IN 차이점


- EXISTS : 단지 해당 row가 존재하는지만 확인하고, 더 이상 수행되지 않는다. 

- IN : 실제 존재하는 데이터들의 모든 값까지 확인한다.

*/


-- IN = AND

/*

위에서 보신바와 같이 서브쿼리의 결과값은 1800, 2200, 3000만원 이었습니다. 

여기에 IN을 사용하게 되면 서브쿼리의 결과 값과 같은 값을 갖는 모든 데이터를 조회하게 됩니다. 

같은 항목이 한개인 것만 조회를 할 경우에는 '='을 사용하고 여러개일 경우에는 'IN'을 사용하게 되는 것이죠.

*/


SELECT * FROM EMP ORDER BY DEPTNO;


SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO IN (

            SELECT DISTINCT DEPTNO

            FROM EMP 

            WHERE SAL>=3000);

/* 

위의 코드와 아래 코드는 같은 결과이다.        

메인쿼리에서 WHERE가 'DEPTNO' 이기 떄문에

서브쿼리에서 'SAL>=3000'에 해당하는 'DEPTNO'를 보여준 후

메인에 있는 WHERE 절의 'DEPTNO'를 실행한다.


즉 서브에서 3000이상인 값이 

DEPTNO에서 10과 20에만 각각 들어가 있으므로

'10과 20을 몽땅 출력함

*/

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO=10 OR DEPTNO=20;

/*

ENAME, SAL, DEPTNO

===================

FORD 3000 20

ADAMS 1100 20

SCOTT 3000 20

JONES 2975 20

SMITH 800 20

MILLER 1300 10

KING     5000 10

CLARK 2450 10

*/

SELECT DISTINCT DEPTNO

FROM EMP 

WHERE SAL>=3000;

/*

DEPTNO

=======

20

10

*/

SELECT *

FROM EMP 

WHERE SAL>=3000;

/*

EMPNO, ENAME, JOB, MRG, HIREDATE, SAL, COMM, DEPTNO

======================================================

7788 SCOTT ANALYST 7566 82/12/09 3000 20

7839 KING PRESIDENT 81/11/17 5000 10

7902 FORD ANALYST 7566 81/12/03 3000 20

*/


SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO='10';

/*

ENAME, SAL, DEPTNO

===================

CLARK 2450 10

KING 5000 10

MILLER 1300 10

*/

SELECT ENAME, SAL, DEPTNO 

FROM EMP

WHERE DEPTNO='20';

/*

ENAME, SAL, DEPTNO

===================

SMITH 800 20

JONES 2975 20

SCOTT 3000 20

ADAMS 1100 20

FORD 3000 20

*/



select ename, sal, deptno

from emp 

where sal IN (select MIN(sal)

              from emp 

              group by deptno);

-- 위의 쿼리문은 각 DEPTNO의 번호별로 최저 급여를 구하는 쿼리문              

/*

ENAME, SAL, DEPTNO

===================

SMITH 800 20

JAMES 950 30

MILLER 1300 10

*/


SELECT MIN(sal)

FROM emp 

GROUP BY deptno;

/*

MIN(SAL)

==============

950--------30번

800--------20번

1300-------10번

*/

SELECT * FROM EMP

ORDER BY DEPTNO;

/*

EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO

======================================================

7782 CLARK MANAGER 7839 81/06/09 2450 10

7839 KING PRESIDENT 81/11/17 5000 10

7934 MILLER CLERK 7782 82/01/23 1300 10

7566 JONES MANAGER 7839 81/08/02 2975 20

7902 FORD ANALYST 7566 81/12/03 3000 20

7876 ADAMS CLERK 7788 83/01/12 1100 20

7369 SMITH CLERK 7902 80/12/17 800 20

7788 SCOTT ANALYST 7566 82/12/09 3000 20

7521 WARD SALESMAN 7698 81/02/22 1250 500 30

7844 TURNER SALESMAN 7698 81/09/08 1500 0 30

7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30

7900 JAMES CLERK 7698 81/12/03 950 30

7698 BLAKE MANAGER 7839 81/05/01 2850 30

7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30

*/


-- EXISTS : ① 존재하다 ② 있다 ③ 살다 ④ 나타나다

/* 

    EXISTS의 의미는 '존재하다' 입니다. 

    즉 WHERE문에서 존재하면 '참', 존재하지 않는다면 '거짓'이 되죠. 

    EXISTS의 부정은 NOT EXISTS 을 사용합니다. 

    NOT EXISTS을 사용하면 서브쿼리의 결과값이 존재하지 않는경우 출력을 하지 않고, 

    존재한다면 출력을 합니다.

*/



SELECT * 

FROM EMP

WHERE EXISTS (

            SELECT * FROM EMP);

-- 말그대로 exists의 서브쿼리에 데이타가 존재하면 그 값(조건)에 해당하는 테이블의 데이타를 출력하라는 뜻입니다. 

복잡한 느낌을 간단하게 생각하면 될것 같습니다.


이것도 참고 http://20140501.tistory.com/57



SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO

                          FROM EMP 

                          WHERE DEPTNO=10 AND SAL>=3000);

                          

SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (  SELECT DISTINCT DEPTNO

                            FROM EMP 

                            WHERE DEPTNO=e.DEPTNO

                            AND SAL>=3000);                          


/*

아래 코드는 위와 같은 결과 출력


SELECT ENAME, SAL, DEPTNO 

FROM EMP e

WHERE EXISTS (SELECT DISTINCT DEPTNO FROM EMP where SAL>=3000);

*/


-- 메인쿼리

SELECT ENAME, SAL, DEPTNO 

FROM EMP e 

WHERE EXISTS DEPTNO=10 AND SAL>=3000;

/*

ENAME, SAL, DEPTNO

===================

KING, 5000, 10

*/

-- 서브쿼리

SELECT DISTINCT SAL, DEPTNO 

FROM EMP 

WHERE DEPTNO=10 AND SAL>=3000;

/*

DEPTNO, SAL

============

10,         5000

*/

SELECT SAL, DEPTNO 

FROM EMP 

WHERE DEPTNO=10 AND SAL>=3000;



SELECT DISTINCT * FROM EMP ORDER BY DEPTNO, SAL;















-- > ALL

--SALESMAN의 모든 값보다 큰 값. 즉 SALESMAN의 SAL 중 최대값인 1600이 조건이 된다.

SELECT ENAME, SAL 

FROM EMP 

WHERE SAL > ALL (SELECT SAL 

                 FROM EMP 

                 WHERE JOB = 'SALESMAN')

                 ORDER BY SAL;


SELECT ENAME, SAL FROM EMP

WHERE SAL > 1600;


SELECT sal FROM emp WHERE JOB = 'SALESMAN';




-- > ALL

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ALL(SELECT SAL

                FROM EMP

                WHERE DEPTNO =30);



SELECT SAL FROM EMP WHERE DEPTNO = 30;

SELECT * FROM EMP WHERE DEPTNO = 30;





-- < ALL

--SALESMAN의 모든 값보다 작은 값, 즉 SALESMAN의 SAL 중 최소값인 1250이 조건이 된다.

SELECT ENAME, SAL 

FROM EMP 

WHERE SAL < ALL (SELECT SAL 

                 FROM EMP 

                 WHERE JOB = 'SALESMAN')

                 ORDER BY SAL;


SELECT ENAME, SAL FROM EMP

WHERE SAL < 1250;


SELECT sal FROM emp WHERE JOB = 'SALESMAN';








-- > ANY

SELECT ENAME, SAL 

FROM EMP 

WHERE SAL > ANY (SELECT SAL 

                              FROM EMP 

                              WHERE JOB = 'SALESMAN');


select ename, sal from emp

where sal > 1250;

/*

ENAME, SAL

============

ALLEN 1600

JONES 2975

BLAKE 2850

CLARK 2450

SCOTT 3000

KING     5000

TURNER 1500

FORD 3000

MILLER 1300

*/

select sal from emp where job = 'SALESMAN';

/*

SAL

====

1600

1250

1250

1500

*/





-- > ANY

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ANY (SELECT SAL 

                            FROM EMP 

                            WHERE DEPTNO = 30);


SELECT * FROM EMP WHERE DEPTNO=30;

SELECT ENAME, SAL FROM EMP WHERE SAL > '950';

/*

ENAME, SAL

===========

ADAMS 1100

MARTIN 1250

WARD 1250

MILLER 1300

TURNER 1500

ALLEN 1600

CLARK 2450

BLAKE 2850

JONES 2975

SCOTT 3000

FORD 3000

KING     5000

*/



==========================================






=========여기서 부터 아래는 다른 예제 스크랩 및 설명 추가함=============

출처 - http://ttend.tistory.com/291


select * from emp order by deptno;

select ename, sal, deptno

from emp 

where sal IN (select MIN(sal)

from emp 

group by deptno);

/*

EMP 테이블의 DEPTNO 컬럼에서

- 10인 경우의 최소 값이 1300

- 20인 경우의 최소 값이 800

- 30인 경우의 최소 값이 950

*/


/*

전체(메인쿼리+서브쿼리) 실행시

ENAME, SAL, DEPTNO

===============

SMITH, 800, 20

JAMES, 950, 30

MILLER, 1300, 10


서브 쿼리 실행시

MIN(SAL)

=======

950

800

1300

*/




select * from emp order by deptno;

select ename, sal, deptno

from emp 

where sal IN (select MAX(sal)

from emp 

group by deptno);

/*

EMP 테이블의 DEPTNO 컬럼에서

- 10인 경우의 최대값이 5000

- 20인 경우의 최대값이 3000

- 30인 경우의 최대값이 2850

*/


/*

전체(메인쿼리+서브쿼리) 실행시

ENAME, SAL, DEPTNO

===============

BLAKE, 2850, 30

SCOTT, 3000, 20

KING, 5000, 10

FORD, 3000 20


서브 쿼리 실행시

MAX(SAL)

=======

2580

3000

5000

*/



 SELECT ENAME, SAL 

FROM EMP 

WHERE SAL > ANY (SELECT SAL 

                           FROM EMP 

                           WHERE JOB = 'SALESMAN');


select ename, sal from emp

where sal > 1250;

/*

ENAME, SAL

============

ALLEN 1600

JONES 2975

BLAKE 2850

CLARK 2450

SCOTT 3000

KING     5000

TURNER 1500

FORD 3000

MILLER 1300

*/

select sal from emp where job = 'SALESMAN';

/*

SAL

====

1600

1250

1250

1500

*/


-- > ALL : SALESMAN의 모든 값보다 큰 값. 즉 SALESMAN의 SAL 중 최대값인 1600이 조건이 된다.

SELECT ename, sal 

FROM emp 

WHERE sal > ALL (SELECT sal 

                 FROM emp 

                 WHERE JOB = 'SALESMAN')

                 ORDER BY sal;


SELECT ENAME, SAL FROM EMP

WHERE SAL > 1600;


SELECT sal FROM emp WHERE JOB = 'SALESMAN';



SALESMAN 의 SAL 값중 어느 값(ANY)보다 크기만 하면 된다. 

즉 SALESMAN의 SAL 중 최소값인 1250보다 큰 경우가 조건이 된다









-- < ALL : SALESMAN의 모든 값보다 작은 값, 즉 SALESMAN의 SAL 중 최소값인 1250이 조건이 된다.

SELECT ENAME, SAL 

FROM EMP 

WHERE SAL < ALL (SELECT SAL 

                 FROM EMP 

                 WHERE JOB = 'SALESMAN')

                 ORDER BY SAL;


SELECT ENAME, SAL FROM EMP

WHERE SAL < 1250;


SELECT sal FROM emp WHERE JOB = 'SALESMAN';



출처: http://ttend.tistory.com/291