본문 바로가기

IT/Oracle

오라클 6탄 (SCOOP) 서브쿼리

SELECT * FROM emp;

SELECT * FROM DEPT;


SELECT EMPNO, ENAME, JOB, SAL

  FROM EMP

 WHERE SAL >= (

  SELECT SAL

                  FROM EMP

                 WHERE ENAME = 'SCOTT'

                );

 ;

--EMP 테이블에서 사원번호가 7521의 업무와 같고, 급여가 7934보다 많은 사원의 정보를

--사원번호, 이름 담당업무, 입사일자, 급여 순으로 출력하시오

SELECT EMPNO, ENAME, JOB, HIREDATE, SAL

  FROM EMP

 WHERE JOB = (

  SELECT JOB

                FROM EMP

               WHERE EMPNO = 7521

               )

   AND SAL > (

    SELECT SAL

                FROM EMP

               WHERE EMPNO = 7934

               );;;

--AND SAL = SELECT SAL // >(단일행 함수) 이기 때문에 검색이 하나만 가능하다.


--EMP테이블에서 급여의 평균보다 적은 사원의 정보를

--사원번호, 이름,  담당업무, 급여, 부서번호 순으로 출력하시오

;;

SELECT EMPNO, ENAME, JOB , HIREDATE, SAL

  FROM EMP

 WHERE SAL > ( 

  SELECT AVG(SAL)

  FROM EMP

                 ) ;


--EMP 테이블에서 20번 부서의 최소 급여보다 많은 부서를 출력하시오

;;

SELECT DEPTNO, MIN(SAL)

  FROM EMP

 GROUP BY DEPTNO

HAVING MIN(SAL) > (

SELECT MAX(SAL)

                      FROM EMP

                     WHERE DEPTNO = 20

                    );

--그룹바이에서 조건주는 것은 HAVING

;;

SELECT SAL FROM EMP WHERE DEPTNO = 20;

--확인작업 MIN(최소값이 없으면) 5개가 출력이 된다


SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO

  FROM EMP

 WHERE SAL IN ( 

  SELECT MIN(SAL)

                 FROM EMP

                GROUP BY DEPTNO

                );

--각 부서의 비교값을 비교하는데에 있어서 단일행 연산자가 아닌 IN을 사용한다 1:4 / = <-X

--IN을 쓰면 4개의 출력값을 1개로 4번 비교하는 절차가 발생한다. 


--사원테이블에서 업무별로 최소 급여를 받는 사원의 정보를 사원번호, 이름, 업무, 입사일자

--급여, 부서번호 순으로 출력하시오

SELECT EMPNO, ENAME, JOB , HIREDATE, SAL

  FROM EMP

 WHERE (JOB,SAL) IN (

  SELECT JOB, MIN(SAL)

                      FROM EMP

                     GROUP BY JOB

                     );

--WHERE (JOB,SAL)<- 다중열 서브쿼리

-- 문제의 요지에 맞는 두가지 테이블의 값을 가져오려고 할때에는 다중열을 이용한다. 


SELECT EMPNO, ENAME, JOB , HIREDATE, SAL

  FROM EMP

 WHERE DEPTNO != 30 AND SAL > ANY (

  SELECT MIN(SAL)

                                        FROM EMP

                                       GROUP BY JOB

                                       );

--ANY는 최소값으로 구하는 것이다. 서브쿼리 안에 있는 실행결과들을 가지고 SAL>과 비교

--DEPTNO != 30 <- 30이 아닌 것을 빼준다. 

--최대값 ALL / ALL을 비교하는

;;;

SELECT EMPNO, ENAME, JOB , HIREDATE, SAL

  FROM EMP

 WHERE DEPTNO != 30 AND SAL > ALL (

  SELECT SAL

                                        FROM EMP

                                       WHERE DEPTNO = 30

                                       );


--보고를 받을 수 있는 사원의 정보를 출력하라 ( 부하직원이 있는 사람)  

 SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO

   FROM EMP E

  WHERE EXISTS (

   SELECT SAL

                  FROM EMP

                 WHERE E.EMPNO = MGR 

                 )

 ORDER BY EMPNO;

-- MGR = 사원번호 / E.EMPNO 사원번호 = MGR (상사의 사원번호) 

-- EXISTS 존재하다 ( 하나라도 있으면 찍어라) 

-- 부하직원이 있다.

;

SELECT EMPNO, MGR FROM EMP ORDER BY MGR ASC, EMPNO ASC;


--다중열 서브쿼리

위에 있음