20241014(월) DB - SUBQUERY

Dodo Lee·2024년 10월 14일

[ SUBQUERY ]

  • 하나의 SQL문 안에 포함된 또 다른 SQL(SELECT)문
  • 메인쿼리를 위해 보조 역할을 하는 쿼리문

0. 목차

5) 상[호연]관 서브쿼리
6) 스칼라 서브쿼리
7) 인라인 뷰 (INLINE-VIEW)
8) WITH
9) RANK() OVER / DENSE_RANK() OVER


5. 상[호연]관 서브쿼리

상관 쿼리는 메인쿼리가 사용하는 테이블값을 서브쿼리가 이용해서 결과를 만듦
메인쿼리의 테이블값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조

상관쿼리는 먼저 메인쿼리 한 행을 조회하고
해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행함

** 해석순서가 기존 서브쿼리와 다르게
메인쿼리 1행 -> 1행에 대한 서브쿼리 수행
메인쿼리 2행 -> 2행에 대한 서브쿼리 수행
...
메인쿼리의 행의 수 만큼 서브쿼리가 생성되어 진행됨

SELECT EMP_ID , EMP_NAME , DEPT_TITLE , MANAGER_ID 
FROM EMPLOYEE MAIN
LEFT JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE)
WHERE MANAGER_ID =
(SELECT EMP_ID
 FROM EMPLOYEE SUB
 WHERE SUB.EMP_ID = MAIN.MANAGER_ID);

6. 스칼라 서브쿼리

SELECT절에 사용된 서브쿼리 결과로 1행만 반환함
SQL에서 단일 값을 '스칼라' 라고 함
즉, SELECT 절에 작성되는 단일행 단일열 서브쿼리를 스칼라 서브쿼리라고 함

SELECT  EMP_NAME , JOB_CODE , SALARY ,
(SELECT CEIL(AVG(SALARY))
 FROM EMPLOYEE SUB
 WHERE SUB.JOB_CODE = MAIN.JOB_CODE) 평균
FROM EMPLOYEE MAIN
ORDER BY JOB_CODE;

7. 인라인 뷰 (INLINE-VIEW)

FROM 절에서 서브쿼리를 사용하는 경우로
서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신 사용

SELECT *
FROM
(SELECT EMP_NAME 이름, DEPT_TITLE 부서
 FROM EMPLOYEE
 JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID))
WHERE 부서 = '기술지원부';

8. WITH

서브쿼리에 이름 붙여주고 사용 시 이름을 사용하게 함
인라인뷰로 사용될 서브쿼리에 주로 사용됨
실행속도가 빨라진다는 장점이 있음

WITH TOP_SAL AS
(SELECT EMP_NAME, SALARY
 FROM EMPLOYEE
 ORDER BY SALARY DESC)
SELECT ROWNUM, EMP_NAME, SALARY
FROM TOP_SAL
WHERE ROWNUM<=10;

9. RANK() OVER

: 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너 뛰고 순위 계산
EX) 공동 1위가 2명이면 다음 순위 2위가 아니라 3위

SELECT RANK() OVER(ORDER BY SALARY DESC) 순위,EMP_NAME, SALARY
FROM EMPLOYEE;
profile
연습생

0개의 댓글