- SELECT (SELECT ... FROM ... WHERE ...) -- SCALA QUERY
- FROM (SELECT ... FROM ... WHERE ...) -- INLINE VIEW
- WHERE COL = (SELECT ... FROM ... WHERE ...) -- SUB QUERY
INNER JOIN : 여러 테이블을 연결해서 여러테이블의 정보 동시 조회
SELECT COL -> COL 자리에 SCALA QUERY -> 하지만 이건 성능떨어져서 사용하면 좋지 않음.
FROM TABLE -> TABLE 자리에 INLINE VIEW
WHERE COL 연산자 값 -> 값 자리에 쓰는게 SUB QUERY
SUB QUERY 서브쿼리
사실 SUB QUERY도 => JOIN
: 여러 테이블을 연결해서 한 테이블의 정보 조회
SELECT 쿼리 안의 SELECT 쿼리 (WHERE 에서 사용할 때)
조회하려는 대상을 정확히 알지 못할 때, 조회하려는 대상이 하나 이상일 때 사용한다.
예>
SELECT *
FROM TABLE
WHERE COLUMN = (SELECT COLUMN FROM TABLE
WHERE 조건)
;
-- SUB QUERY 이용
-- 부서명 'IT' 부서에서 근무중인 사원들의 정보를 조회.(IT부서의 부서번호를 모르는 상황)
-- * SUB QUERY를 먼저 작성 (우리가 알기 위해 필요한 코드를 먼저 작성)
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME = 'IT')
;
-- 지역번호가 1700인 부서에서 근무중인 사원들의 모든 정보를 조회. (지역번호가 1700인 부서의 번호를 모르는 상황)
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE LOCATION_ID = 1700)
;
-- 평균 연봉보다 많이 받는 사원들의 사원번호, 이름, 성, 연봉을 조회한다. (SUB QUERY)
SELECT EMPLOYEE_ID
, FIRST_NAME
, LAST_NAME
, SALARY
FROM EMPLOYEES
WHERE SALARY > (SELECT AVG(SALARY)
FROM EMPLOYEES)
;
직무가 변경된 사원의 모든 정보를 조회한다. (SUB QUERY, INNER JOIN)
-- 여기서 SUB QUERY 방법이 더 좋음
SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID
FROM JOB_HISTORY)
;
SCALA QUERY
-- SCALA QUERY를 이용해 모든 사원들의 JOB_ID와 JOB_TITLE을 조회한다.
SELECT EMPLOYEE_ID
, JOB_ID
, (SELECT JOB_TITLE -- 스칼라 쿼리의 결과는 반드시 1개의 컬럼만 작성
-- 스칼라 쿼리의 결과는 반드시 1개의 ROW만 조회
FROM JOBS J
WHERE J.JOB_ID = E.JOB_ID) AS JOB_TITLE
FROM EMPLOYEES E
ORDER BY EMPLOYEE_ID
;
-- 68. 114번 직원의 모든 상사들의 이름, 성, 상사사원번호, 상사사원명을 조회한다. (SCALA QUERY)
SELECT LEVEL
, EMPLOYEE_ID
, FIRST_NAME
, LAST_NAME
, (SELECT FIRST_NAME
FROM EMPLOYEES MAN
WHERE MAN.EMPLOYEE_ID = EMP.MANAGER_ID) AS MANAGER_FIRST_NAME
FROM EMPLOYEES EMP
START WITH EMPLOYEE_ID = 114
CONNECT BY PRIOR MANAGER_ID = EMPLOYEE_ID
;