고래씌
[Oracle] 5-1. DML(SELECT) - SUBQUERY(서브쿼리) 본문
1. SUBQUERY 서브쿼리
- 하나의 주된 SQL 안에 포함된 또 하나의 SELECT문
- 메인 SQL문을 위해서 보조 역할을 하는 SELECT문
=> 주로 조건절에서 많이 쓰인다.
▶ 간단 서브쿼리 예시 1)
- 노옹철 사원과 같은 부서인 사원들
① 먼저 노옹철 사원의 부서코드를 조회
② 부서코드가 D9인 사원들 조회
③ 위 두단계 합치기
▶ 간단 서브쿼리 예시 2)
- 전체 사원의 평균 급여보다 더 많은 급여를 받고있는 사원들의 사번, 이름, 직급코드 조회
① 전체 사원의 평균 급여 구하기
② 급여가 3047000원 이상인 사원들 조회
③ 위 두단계 합치기
2. 서브쿼리 구분
: 서브쿼리를 수행한 결과값이 몇행 몇열이냐에 따라서 분류됨
- 단일행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때(한칸의 컬럼값으로 나올때)
- 다중행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행일 때
- (단일행) 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 열일 때
- 다중행 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러행 여러 열일때
=> 서브쿼리를 수행한 결과가 몇행 몇열이냐에 따라 사용가능한 연산자가 달라짐
1) 단일행 단일열 서브쿼리 (SINGLE ROW SUBQUERY)
: 서브쿼리의 주회 결과값이 오로지 1개일때
- 사용가능한 연산자 => =, !=, <=, >=, ...
▶ 전 직원이 평균 급여보다 더 적게 받는 사원들의 사원명, 직급코드, 급여 조회
=> 파란색 밑줄 친 부분만 따로 실행해보면 ...
아래와 같은 값이 출력된다. 이보다 더 적은 급여를 받는 사원이 있다면 출력하게 된다.
▶ 최저 급여를 받는 사원의 사번, 사원명, 직급코드, 급여, 입사일 조회
▶ 노옹철 사원의 급여보다 더 많이 받는 사원들의 사번, 이름, 부서코드, 급여 조회
- ANSI 구문
▶ 부서별 급여 합이 큰 부서 하나만을 조회, 부서코드, 부서명, 급여의 합
(서브쿼리, GROUP BY, JOIN)
2) 다중행 서브쿼리(MULTI ROW SUBQUERY)
▶ 서브쿼리의 조회 결과값이 여러행일 경우
- IN(10, 20, 30) 서브쿼리 : 여러개의 결과값 중에서 하나라도 일치하는 것이 있다면
-> OR < ANY(10, 20, 30) 서브쿼리 : 여러개의 결과값 중에서 "하나라도" 크거나 작을 경우,
-> OR < ALL (10,20,30) : 여러개의 결과값의 모든 값보다 크거나 작을 경우
▶ 각 부서별 최고 급여를 받는 사원의 이름, 직급코드, 급여 조회
① 각 부서별 최고급여 조회 (다중행, 단일열)
② 위 급여를 받는 사원들 조회
③ 두 쿼리문을 합치기
▶ 선동일 또는 유재식 사원과 같은 부서인 사원들을 조회하시오(사원명, 부서코드, 급여)
▶ 대리 직급임에도 불구하고 과장 직급의 급여보다 많이 받는 사원들 조회(사번, 이름, 직급명, 급여)
① 과장 직급들의 급여들 조회
② 위의 급여목록들보다 하나라도 높은 급여를 받는 직원들을 조회
☞ JOB_NAME = '과장'; -- 220000, 250000, 376000 값보다 하나라도 높은 값이 있다면 반환하라.
▶ 과장 직급임에도 불구하고 모든 차장직급의 급여보다도 더 많이 받는 직원 조회(사번, 이름, 직급명, 급여)
3) (단일행) 다중열 서브쿼리
: 서브쿼리 조회 결과가 값은 한행이지만, 나열된 칼럼은 여러개인 경우
▶ 하이유 사원과 같은 부서코드, 같은 직급코드에 해당되는 사원들 조회
(사원명, 부서코드, 직급코드, 고용일)
① 하이유 사원의 부서코드, 직급코드 먼저 조회
☞ 부서코드 'D5' 직급코드 'J5' 출력
② 부서코드가 D5이면서 J5 직급인 사원들 조회
③ 위 두 쿼리문을 하나의 코드로 합치기
☞ 다중열 서브쿼리(비교할 값의 순서를 맞춰서 칼럼값을 나열)
(비교대상칼럼1, 비교대상칼럼2) = (비교할값1, 비교할값2 => 서브쿼리 형식으로 제시해야만 함.)
④ 다중열 서브쿼리
▶ 박나라 사원과 같은 직급코드, 같은 사수사번을 가진 사원들의 사번, 이름, 직급코드, 사수사번을 조회
단일행 다중열 서브쿼리 이용하여 작성
4) 다중행 다중열 서브쿼리
: 서브쿼리 조회 결과가 여러행 여러 컬럼일 경우
▶ 각 직급별 최소급여를 받는 사원들 조회(사번, 이름, 직급코드, 급여)
① 각 직급별 최소급여를 조회
② 위 목록들 중에 일치하는 사원을 찾기
②-1) 조건 나열 (OR)
☞ 하지만, 이렇개 OR 연산자를 이용하여 다 쓰기에는 매우 번거롭다. 서브쿼리를 활용하자!
② -2) 다중행 다중열 서브쿼리
▶ 각 부서별 최고 급여를 받는 사원들 조회(사번, 이름, 부서코드, 급여)
부서가 없을 경우 부서코드는 없음으로 조회하시오.
'Database > Oracle' 카테고리의 다른 글
[Oracle] DB 실습문제 2(Function) (0) | 2023.11.27 |
---|---|
[Oracle] DB 실습문제 1(Basic) (0) | 2023.11.27 |
[Oracle] 4-3. DML(SELECT) - JOIN ③ (카테시안 곱/교차 조인, 비등가 조인, 자체조인, 다중 조인) (0) | 2023.11.27 |
[Oracle] 4-2. DML(SELECT) - JOIN ② (OUTER JOIN, FULL OUTER JOIN) (0) | 2023.11.27 |
[Oracle] 4-1. DML(SELECT) - JOIN ① (INNER JOIN) (0) | 2023.11.24 |