[27일 차] : Oracle - SELECT문(5), 서브쿼리

서하루·2022년 11월 18일
0

(2) Oracle 공부기록

목록 보기
6/11

[학습목표]

  • 서브쿼리
  • 단일행 서브쿼리
  • 다중행 서브쿼리
  • 다중열 서브쿼리
  • 다중행 다중열 서브쿼리

✅ 서브쿼리 (SUBQUREY)

- 하나의 SQL문 안에 포함된 또 다른 SELECT문

- 메인 SQL문을 보조역할 하는 쿼리문


📢 서브쿼리의 구분

  • 단일행 [단일열] 서브쿼리 : 서브쿼리의 조회 결과값이 오로지 1개일 때
  • 다중행 [단일행] 서브쿼리 : 서브쿼리의 조회 결과값이 여러행일 때
  • [단일행] 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 한 행이고 컬럼 여러개일 때
  • 다중행 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 여러 행, 여러 컬럼일 때


📚 1. 단일행 서브쿼리(SIGLE ROW SUBQUERY)

=> 서브쿼리의 조회 결과값이 1개일 때

=> 일반비교연산자 사용가능 [=, !=, >,<,<=,>=]

간단한 예시 (1)


1) 노옹철사원의 부서코드를 알아내는 쿼리문 작성 => 'D9'
2) 부서코드가 D9인 사원을 알아내는 쿼리문 작성 => 총 3명나옴
3) 1+2 쿼리문을 합치기 => 전 사원들 중에서 부서코드가 노옹철사원과 같은 부서인 사원 조회하기


간단한 예시(2)


1) 전체 사원의 평균 급여 알아내는 쿼리문 작성 => 약 3백만원
2) 급여가 평균급여 이상인 사원 알아내는 쿼리문 작성 => 8명
3) 1+2 쿼리문을 합치기 => 전 사원들 중에서 급여가 평균급여보다 많은 사원 조회


간단한 예시(3)


1) 메인 쿼리문을 작성하고 급여가 평균급여보다 작은 사원 조회


JOIN을 해서 서브쿼리 작성 가능
-- (3) 노옹철사원의 급여보다 더 많이 받는 사원의 사번, 이름, 부서코드, 급여, 부서명 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT D ON (E.DEPT_CODE = D. DEPT_ID) --부서명 알아냄
WHERE SALARY > (SELECT SALARY
FROM EMPLOYEE
WHERE EMP_NAME = '노옹철');

어려운 예시(1)


1) 부서코드를 그룹으로 묶은 후, 부서별 급여합 중에서도 가장 큰 값 한개 조회
2) 부서별 급여합 중에 1번 값인 부서 조회
3) 1+2 쿼리문을 합치기 => 부서코드로 그룹짓고 그 중 급여의 합이 가장 큰 부서코드 조회



📚 2. 다중행 서브쿼리(MULTI ROW SUBQUERY)

=> 서브쿼리의 조회 결과값이 여러행일 때(컬럼은 한개)

=> 일반비교연산자 사용불가능
  • IN 서브쿼리 : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있으면 조회됨
    EX) 비교대상 IN (값1, 값2 ''') => 비교대상 = 값1 OR 비교대상 = 값2

대소비교 연산자 앞에 ANY / ALL 작성 가능

  • > ANY 서브쿼리 : 여러 개의 결과값 중에서 "한 개라도" 클경우 조회
    (= 여러 개의 결과값 중에서 가장 작은 값보다 클 경우 조회됨)
  • < AND 서브쿼리 : 여러 개의 결과값 중에서 "한 개라도" 작은 경우 조회
    (= 여러 개의 결과값 중에서 가장 큰 값보다 작을 겨우 조회됨)

EX) 비교대상 > ANY 서브쿼리(값1, 값2 ''') => 비교대상 > 값1 OR 비교대상 > 값2


  • > ALL 서브쿼리 : 여러 개의 "모든" 결과값들보다 클 경우
  • < ALL 서브쿼리 : 여러 개의 "모든" 결과값들보다 작을 경우

EX) 비교대상 > ALL 서브쿼리(값1, 값2 ''') => 비교대상 > 값1 AND 비교대상 > 값2



간단한 예시(1)


1) 유재식과 윤은해 사원의 직급을 조회
2) 위 직급과 같은 사원들을 조회
3) 1+2 쿼리문을 합치기 => 직급코드가 유재식과 윤은해와 같은 사원 조회

어려운 예시(2)


1) 직급명을 알아내야하므로 JOIN하고 직급명이 차장인 직원의 급여가
2) 부장보다 많은 사원



📚 3. 다중열 서브쿼리

=> 결과값은 한 행이지만, 나열된 컬럼의 수는 여러개일 경우

(WHERE절에 컬럼이 1개 이상인것 !)

간단한 예시(1)

✨DEPT_CODE , JOB_CODE의 서브쿼리문 안에서도 순서가 동일해야함 !



📚 4. 다중행 다중열 서브쿼리

=> 서브쿼리 조회 결과값이 여러행, 여러열 일 경우

간단한 예시(1)

✨ 1) 직급코드별 최소급여를 받는 사원들을 조회 (서브쿼리문)
2) 직급코드별 최소급여를 받는 사원들의 정보 조회



📚 5. 인라인뷰

=> FROM절에 서브쿼리를 작성하는 것

=> 서브쿼리를 마치 하나의 테이블처럼 사용함

⭐⭐⭐인라인뷰를 주로 사용하는 경우 ⭐⭐⭐

=> TOP-N분석 (전체 데이터 중 일부 데이터를 조회할 때 사용)

EX) 실시간검색어 1위~10위 / 쇼핑몰 베스트상품 / 쇼핑몰 신상품


예시 (1)

✨ 1) 인라인뷰 적용 전 > WHERE 절에 다시한번 조건식을 기술해야함(별칭사용불가)
2) 인라인뷰 적용 후 > FROM절 안에 서브쿼리를 작성함으로써 메인쿼리의 SELECT절에 별칭사용 가능, WHERE절에도 별칭사용 가능, 조건식이 간단해짐 !



📚 6. ROWNUM

=> 오라클에서 제공하는 추가적인 컬럼

=> 조회된 순서대로 1부터 순번을 부여해주는 컬럼

-- 사원들 중, 급여가 가장 높은 상위 5명 조회하기 !

SELECT ROWNUM, E.*
FROM (SELECT EMP_NAME, SALARY, DEPT_CODE
		FROM EMPLOYEE
        ORDER BY SALARY DESC) E -- 별칭 부여 가능 !
WHERE ROUNUM <= 5;

-- 가장 최근에 입사한 사원 5명 조회(사원명, 급여, 입사일)
SELECT EMP_NAME, SALARY, HIRE_DATE
FROM (SELECT *
 		FROM EMPLOYEE
        WHERE HIRE_DATE DESC) E
WHERE ROWNUM <= 5;        

0개의 댓글