본문 바로가기

DB/오라클

오라클 서브쿼리 ( subquery )

# subquery--알려지지않은 데이터값을 알기위해 사용(나중에 변할수있는값)
                     두 종류의 비교 연산자들이 서브쿼리에 사용된다
                     서브쿼리는 연산자의 오른측에 나타나야한다.
                     서브쿼리는 여러 sql문장에 사용가능하다
                     서브쿼리는 order by절을 포함할수없다

select e.empno,e.ename,m.empno
from (select * from emp)e, emp m-->괄호안의 데이터 부터 처리후 괄호밖의 데이터에 대입함!
where e.mgr=m.empno

# 위치에 따른 명칭
    스칼라 서브쿼리              -  SELECT문에 있는 서브쿼리
    인라인뷰                         - FROM절에 있는 서브쿼리
    서브쿼리(필터서브쿼리)   - WHERE절에 있는 서브쿼리  

# 반환값에 따른 서브쿼리종류
    단일행서브쿼리        -    서브쿼리결과가 1행
    다중행서브쿼리        -    서브쿼리결과가 여러행
    다중컬럼서브쿼리    -    서브쿼리의결과가 여러컬럼




정리하자면
    SUBQUERY의 형태는 4가지  :  ( )가 전부 서브쿼리
    1. WHERE A = ( 단일값 )
    2. WHERE X IN ( 단일칼럼(여러개값일수도있음) )
    3. SELECT (단일값 )
    4. FROM (테이블)

3번인 SELECT에 사용되는 서브쿼리
        스칼라서브쿼리라고함
        반환행의 개수도 0또는 1이어야함
        마치 SELECT절에서 함수처럼 사용됨( 일치하는데이터가 없더라도 NULL값을 리턴할 수 있음)
        보통 코드에 맞는 명칭을 검색할때 주로사용

4번인 FROM절에 사용되는 서브쿼리
    인라인뷰라고함
    보통 쿼리의 재정의라고함( 기존테이블을 재가공하기때문 )
    
1,2번인 WHERE절에 사용되는 서브쿼리
    필터서브쿼리라고함
    상수값이 아닌 그룹에 속하는 2이상의정보를 조건으로 활용하고자할때 사용
    조건식에 IN등을 주로 활용
    주의사항은 불필요한 스캔으로 I/0속도저하를 가져올 수 있음
    
      




* 단일행 서브쿼리
    ex) 44번 부서의 평균 급여보다 많은 급여를 받는 직원들의 직원아이디, 직원명, 급여를 출력하시오.
SELECT
    E.ID, E.NAME, E.SALARY
FROM S_EMP E
WHERE E.SALARY > ( SELECT AVG(SALARY) FROM S_EMP WHERE DEPT_ID=44 )

    ex) 'scott'이라는 직원이 근무하는 부서의 직원값조회
SELECT * 
FROM EMP
WHERE DEPT_ID = (SELECT DEPT_ID FROM EMP WHERE NAME = 'SCOTT' )   


* 다중행 서브쿼리
        위의 예문들은 모두 단일행 서브쿼리이다
        둘 이상의 데이터가 반환될때 연산자를( <, > , <> , = 등..)사용하면 에러남
        둘 이상의 데이터가 반환될 때에는 in , >,   같은 복수행 연산자 사용해야함

    IN 연산자 : 하나의컬럼이 여러개의 '='조건을 가지는 경우사용
    ANY연산자 
    ALL연산자 : 

SELECT NAME, SALARY, DEPT_ID
FROM S_EMP
WHERE NAME IN ( SELECT 


* 다중컬럼 서브쿼리
        서브쿼리결과가 여러칼럼인 경우
        컬럼개수 동일해야함
        괄호 필수 
부서별 최소연봉을 받는 사람의 정보 
SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE (DEPTNO, SAL) IN (    SELECT DEPTNO, MIN(SAL) 
                                            FROM EMP
                                            GROUP BY DEPTNO 
                                        ) 



'DB > 오라클' 카테고리의 다른 글

오라클 관계  (0) 2019.04.03
오라클 조인 ( join )  (0) 2019.04.03
오라클 함수  (0) 2019.04.03
계층형 쿼리  (0) 2019.04.03
오라클 기초  (0) 2019.04.03