본문 바로가기

데이터베이스/Oracle

서브쿼리(SubQuery) (2)

--(2) INLINE VIEW : FROM절에서 사용하는 서브쿼리

--사원의 사번, 이름, 급여를 출력하시오. 많은 급여를 받는 사원부터 출력한다.
SELECT employee_id, first_name, salary
FROM employees
ORDER BY salary DESC;

--ROWNUM : 행번호, 1부터 시작

가짜컬럼, 오라클에 내장되어있는 컬럼명, 어느 테이블에서든 사용 가능

--사원의 행번호, 사번, 이름, 급여를 출력하시오.
SELECT ROWNUM, employee_id, first_name, salary
FROM employees;

--TOP-N Query

--사원의 사번, 이름, 급여를 출력하시오. 많은 급여를 받는 사원 5명만 출력한다.
SELECT ROWNUM, employee_id, first_name, salary
FROM employees
ORDER BY salary DESC;

ORDER BY보다 SELECT가 먼저 실행. 행번호 먼저 발급되고 정렬이 되다보니 행번호가 섞여있음

→ 정렬부터 먼저 해보기
실행순서 : SQL에서 FROM절은 반복문이 내장되어 있음. 테이블/서브쿼리 결과값을 한행 한행 이동.

                  그걸 하는 주체 = 커서. 한 행 한 행 이동함. 
                  FROM절에 의해 커서 1행으로 감 

SELECT ROWNUM, employee_id, first_name, salary
FROM (SELECT employee_id, first_name, salary
      FROM employees
      ORDER BY salary DESC)
WHERE ROWNUM BETWEEN 1 AND 5;

서브쿼리 → 메인쿼리 FROM절 → WHERE절 → SELECT절 → 커서 다음 행 넘어감 → 비교는 ROWNUM이랑, WHERE절 만족 → SELECTTION함 (추출) → SELECT절 →  SELECT행에서 ROWNUM 사용했으니 자동 1씩 증가 → 다음 행으로 이동 ROWNUM 6까지 계속 진행 → WHERE절 불만족 → SELECT 안감 → 다음 행 넘어감  → WHERE절 불만족 → SELECT 안감 → 끝까지

 

--사원의 사번, 이름, 급여를 출력하시오.
--많은 급여를 받는 사원부터 정렬하여 11~20번째 사원만 출력한다.
SELECT ROWNUM, employee_id, first_name, salary
FROM (SELECT employee_id, first_name, salary
      FROM employees
      ORDER BY salary DESC)
WHERE ROWNUM BETWEEN 1 AND 5; (X) --0건.
--이거 안됨. 만족을 못해서 ROWNUM은 계속 1
SELECT *
FROM (SELECT ROWNUM rn, employee_id, first_name, salary
      FROM (SELECT employee_id, first_name, salary
            FROM employees
            ORDER BY salary DESC)
      )
WHERE rn BETWEEN 11 AND 20;
--전체행을 정렬까지 하고 ROWNUM 발급, rn을 별칭으로 안주면 ROWNUM 날아감
--이렇게 하면 107행이 아닌 10개만 받으니 퍼포먼스 빨라짐
SELECT *
FROM (SELECT ROWNUM rn, a.*
      FROM ( SELECT *
             FROM employees
             ORDER BY salary DESC) a
      )
WHERE rn BETWEEN 11 AND 20;
--별칭 부여해서 간결화

--(3) Scala SubQuery : SELECT절에서 사용하는 SubQuery

--사원의 사번, 부서번호, 부서명을 출력하시오
SELECT employee_id, e.department_id, department_name
FROM employees e JOIN departments d ON (e.department_id = d.department_id);
--↓ Scala SubQuery로 변환
SELECT employee_id, department_id
      ,(SELECT department_name
        FROM departments
        WHERE department_id = employees.department_id
        )
FROM employees;

--이렇게도 가능
SELECT employee_id, department_id
      ,(SELECT department_name
        FROM departments
        WHERE department_id = e.department_id
        )
FROM employees e;

JOIN과 Scala SUBQUERY 둘 다 사용가능하다면, 출력해줘야하는 컬럼이 여러 테이블에 분포한다면 JOIN 사용 권장

'데이터베이스 > Oracle' 카테고리의 다른 글

데이터 제어 언어  (0) 2023.08.22
서브쿼리 예제  (0) 2023.08.22
서브쿼리(SubQuery) (1)  (0) 2023.08.22
집합연산자  (0) 2023.08.22
JOIN 예제  (0) 2023.08.22