학원수업_Oracle

201027 SUB_QUERY

logloglog 2020. 10. 27. 12:50

- 최종목적을 위해서 중간계산결과값이 필요할 때

- 쿼리안에 포함된 또다른 쿼리를 서브쿼리라고 한다.

- JOIN의 수를 감소시킴

- 서브쿼리는 '( )'안에 기술하며(INSERT문에 섭쿼리사용될때의 예외제외하고), 중첩사용이 가능하다

- 서브쿼리가 연산자와 함께 사용될 경우 연산자 우측에 기술해야 함

- 서브쿼리는 사용되는 위치에 따라 SELECT절, WHERE절에 사용되면 일반서브쿼리,

  FROM절에 사용되면 IN-LINE 서브쿼리라 하며, 인라인 서브쿼리는 독립실행이 가능해야 한다.

- 반환하는 행과 열의 수에 따라 단일행/ 단일열, 단일 행/다중열, 다중행/단일열, 다중행/다중열 서브쿼리로 구분되며,

* 단일행 : =, !=, >, <, >= , <=

  다중행 : IN, ANY, SOME, ALL, EXISTS

- 메인쿼리와 서브쿼리 사이에 조인 발생여부에 따라 관련성있는(상관) 서브쿼리와 관련성 없는 (비상관) 서브쿼리로 구분

 

예 )

상품테이블의 각 상품에 대하여 상품코드, 상품명, 분류명을 조회하시오

(서브쿼리 없이)

SELECT  PROD_ID 상품코드, 
        PROD_NAME 상품명, 
        LPROD_NM 분류명
FROM PROD A, LPROD B
WHERE A.PROD_LGU = LPROD_GU
ORDER BY 1; 

 

서브쿼리는 프롬과 웨어절에 많이 나오고 셀렉트절에 나오는게 흔한경우는 아니다.

SELECT  A.PROD_ID 상품코드, 
        A.PROD_NAME 상품명, 
        (SELECT B.LPROD_NM 
        FROM LPROD B
        WHERE A.PROD_LGU = B.LPROD_GU) 분류명
FROM PROD A;

 

예)

사원테이블에서 전체 직원의 평균 급여보다 많은 급여를 받는 직원정보를 조회하시오. 단 부서순으로 출력하시오

Alias는 사원번호, 사원명, 부서코드, 급여

**서브쿼리에서 해야할 일과 메인쿼리해서 해야 할 일을 구별할 줄 알아야 함
**최종적으로 출력해줘야할 것을 메인쿼리에서, 중간계산을 서브쿼리에서
즉 사원테이블에서 사원번호, 사원명, 부서코드, 급여를 출력해주는게 메인쿼리에서 해 줘야 할 일
서브쿼리는 평균급여..
전체직원의 평균급여는 전체직원이 하나의 그룹이니까 그룹바이절 안쓰는거임
SELECT  A.EMPLOYEE_ID 사원번호,
        A.EMP_NAME 사원명,
        A.DEPARTMENT_ID 부서코드,
        A.SALARY 급여
FROM    EMPLOYEES A
WHERE A.SALARY >= (SELECT ROUND(AVG(SALARY))
                        FROM EMPLOYEES)
ORDER BY 3;

WHERE에 두니까 행의 갯수만큼서브쿼리를 실행해야해서 불안하다. 서브쿼리를 FROM절으로 옮겨보자

SELECT  A.EMPLOYEE_ID 사원번호,
        A.EMP_NAME 사원명,
        A.DEPARTMENT_ID 부서코드,
        A.SALARY 급여
FROM    EMPLOYEES A ,(SELECT ROUND(AVG(SALARY)) AS AVGSAL
                        FROM EMPLOYEES) B 
WHERE A.SALARY >= B.AVGSAL
ORDER BY 3;

프롬절의 서브쿼리를 인라인 서브쿼리라고 한다.

인라인서브쿼리할땐 서브쿼리만 선택해서 실행이 되는지안되는지 반드시 해봐야한다.

서브쿼리를 한번만 수행해도 결과가 나온다

FROM    EMPLOYEES A ,(SELECT ROUND(AVG(SALARY)) AS AVGSAL
                        FROM EMPLOYEES) B 

이때 프롬절에 두개이상의 테이블이 왔으니까 조인해줘야하는데,

WHERE A.SALARY >= B.AVGSAL

이게 바로 조인조건인거임

 

'학원수업_Oracle' 카테고리의 다른 글

테스트2  (0) 2020.10.30
테스트  (0) 2020.10.30
201027  (0) 2020.10.27
201026 외부조인(OUTER JOIN)  (0) 2020.10.26
201026 세미조인  (0) 2020.10.26