(Database Programming) SUB QUERY / SCALA QUERY

soosoorim·2024년 2월 26일
0
  • 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 에서 사용할 때)

  • 조회하려는 대상을 정확히 알지 못할 때, 조회하려는 대상이 하나 이상일 때 사용한다.

예>

  • “IT” 부서에서 근무중인 사원들의 정보를 조회 (조회대상(PK)을 모름)
    서브쿼리 대상 IT에 부서에서 근무하려는 사원을 찾기 위해 IT 부서의 부서 번호를 알아야 한다.
    IT 부서의 부서 번호(서브쿼리의 결과)를 찾아 사원의 부서 번호와 조회한다.
  • 지역번호가 1700인 부서에서 근무중인 사원들의 정보를 조회 (대상이 하나 이상)
    서브쿼리 대상 지역번호가 1700인 부서에서 근무중인 사원을 찾기 위해 지역번호가 1700인 부서의 부서번호를 알아야 한다.
    지역번호가 1700인 부서번호(서브쿼리의 결과)를 찾아 사원의 부서 번호와 조회한다.
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
;

0개의 댓글

관련 채용 정보