SUBQUERY

2021. 11. 8. 09:28Oracle

반응형
[SUBQUERY]
-- 쿼리문 안에 또 다른 쿼리문

-- 1) 신짱구 사원의 부서코드 조회
SELECT DEPT_CODE
  FROM EMPLOYEE
 WHERE NAME = '신짱구'; --> D9

-- 2) 부서코드가 D9인 사원들 조회 
SELECT NAME
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D9';

-- 위의 두 쿼리문을 하나의 쿼리문으로
-- 신짱구 부서코드와 같은 사원 이름 조회
SELECT NAME
  FROM EMPLOYEE
 WHERE DEPT_CODE = (SELECT DEPT_CODE
                     FROM EMPLOYEE
                    WHERE NAME = '신짱구');
                    
                    
-- @서브쿼리 구분
-- 서브쿼리 종류에 따라 연산자 사용이 달라짐

-- 1. 단일행 서브쿼리 (SINGLE ROW SUBQUERY)
--    서브쿼리의 조회 결과값의 갯수가 1개일 때 (1행 1열)
--    일반 비교연산자 사용가능
--    = != ^= > < >=, ... 


-- 2. 다중행 서브쿼리 (MULTI ROW SUBQUERY)
--    서브쿼리를 수행한 결과값이 여러 행일 때 (컬럼은 하나)
    
--    - IN 서브쿼리 : 여러개의 결과값 중에서 한개라도 일치하는 값이 있다면 
    
--    - > ANY 서브쿼리 : 여러개의 결과값 중에서 '한 개라도' 클 경우 
--                      (여러개의 결과값 중에서 가장 작은값 보다 클 경우)
--    - < ANY 서브쿼리 : 여러개의 결과값 중에서 '한 개라도' 작을 경우 
--                      (여러개의 결과값 중에서 가장 큰 값 보다 작을 경우)
    
--        비교대상 > ANY (값1, 값2, 값3)
--        비교대상 > 값1 OR 비교대상 > 값2 OR 비교대상 > 값3
    
--    - > ALL 서브쿼리 : 여러개의 '모든' 결과값들 보다 클 경우 
--    - < ALL 서브쿼리 : 여러개의 '모든' 결과값들 보다 작을 경우 
    
--        비교대상 > ALL (값1, 값2, 값3)
--        비교대상 > 값1 AND 비교대상 > 값2 AND 비교대상 > 값3


[INLINE-VIEW]
-- 서브쿼리를 수행한 결과를 테이블처럼 사용

SELECT ROWNUM, E.* -- ROWNUM: 조회된 순서대로 1부터 순번 부여
  FROM (SELECT EMP_NAME, SALARY, DEPT_CODE
          FROM EMPLOYEE
         ORDER 
            BY SALARY DESC) E
  WHERE ROWNUM <= 5;
-- 전 직원 중 급여가 가장 높은 상위5명 조회


[WINDOW FUNCTION]
-- 순위 계산 함수
-- SELECT절에서만 사용 가능

-- RANK() OVER(정렬기준) : 공동 순위 이후의 등수를 공동 순위만큼 건너뛰고 순위 부여
--                         EX) 공동 1위가 2명이면 그 다음 순위는 3위
-- DENSE_RANK() OVER(정렬기준) : 공동 순위 있어도 뛰어넘지않고 순위 부여
--                               EX) 공동 1위가 2명이더라도 그 다음 순위는 2위 
    

SELECT NAME, SALARY, RANK() OVER(ORDER BY SALARY DESC) "순위"
  FROM EMPLOYEE;
-- 급여가 높은 순대로 순위 부여
반응형

'Oracle' 카테고리의 다른 글

JOIN  (0) 2021.11.03
GROUP BY, HAVING, 집합연산자  (0) 2021.11.02
DML SELECT  (0) 2021.10.28
오라클 SQL 계정 생성 및 권한 부여  (0) 2021.10.20