- 최종목적을 위해서 중간계산결과값이 필요할 때
- 쿼리안에 포함된 또다른 쿼리를 서브쿼리라고 한다.
- 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 |