서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리
⭐ 사용 가능 연산자 : IN, ANY, ALL, EXISTS
IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면
ANY : 여러 개의 결과값 중에서 한 개라도 크거나 작을 경우
가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?
ALL : 여러 개의 결과값이 모든 값보다 크거나 작을 경우
가장 큰 값보다 큰가? / 가장 작은 값 보다 작은가?
EXISTS : 값이 존재하는가?
메인쿼리가 사용하는 테이블 값을 서브쿼리가 이용해서 결과를 만드는 서브쿼리
메인쿼리의 테이블 값이 변경되면 서브쿼리의 결과 값도 변경되는 구조
SELECT절에 사용되는 단일 행 서브쿼리
보통 상관 서브쿼리와 함께 사용됨
SELECT EMP_NAME, DEPT_CODE,
(SELECT EMP_NAME FROM EMPLOYEE WHERE JOB_CODE = 'J1') 대표
FROM EMPLOYEE;
FROM 절에서 서브쿼리를 사용하는 경우로,
서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신 사용
SELECT EMP_NAME, SALARY FROM
(SELECT * FROM EMPLOYEE ORDER BY SALARY DESC)
WHERE ROWNUM <= 5;
서브쿼리에 이름을 붙여주고 인라인 뷰로 사용 시 서브쿼리의 이름으로 FROM절에 기술
실행 속도가 빨라진다는 장점이 있음
SELECT ROWNUM 순위, EMP_NAME 이름, SALARY 급여 FROM
(SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC);
🔻 WITH 사용
WITH SALARY_RANK AS (SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC)
SELECT ROWNUM 순위, EMP_NAME 이름, SALARY 급여 FROM SALARY_RANK;
RANK( ) OVER
: 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위
SELECT RANK() OVER (ORDER BY SALARY DESC) 순위,
EMP_NAME, SALARY FROM EMPLOYEE;
DENSE_RANK( ) OVER
: 공동 1위가 2명이어도 다음 순위는 2위
SELECT DENSE_RANK() OVER (ORDER BY SALARY DESC) 순위,
EMP_NAME, SALARY FROM EMPLOYEE;
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME,
CASE
WHEN EMP_ID IN (SELECT DISTINCT MANAGER_ID FROM EMPLOYEE
WHERE MANAGER_ID IS NOT NULL)
THEN '사수'
ELSE '사원'
END 구분
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE);