--(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 사용 권장