지난 포스팅에서 SQL 조인문(JOIN)에 대해서 다뤄봤습니다.
[Database] SQL JOIN | INNER JOIN | LEFT(RIGHT) OUTER JOIN | CROSS JOIN | SELF JOIN | NON EQUI JOIN | SQL 테이블 3개 조인(j
지난 포스팅에서 SQL 집계 함수와 정렬에 대해서 다뤄봤습니다. [Database] SQL GROUP BY | ORDER BY | HAVING | ROLLUP | CUBE | UNION ALL | SQL 집합 연산자 (java로 웹개발하기)(day23) 지난 포스팅에서 SQL..
healthdevelop.tistory.com
이번 시간에는 SQL SUQUERY, RANK 함수에 대해서 다뤄보고자 합니다.
▶ SUBQUERY
SUBQUERY란,,
SELECT 문장 안에 포함된 또 다른 SELECT 문장으로,
메인 쿼리가 실행되기 전 한 번만 실행되며 반드시 괄호로 묶어야 합니다.
서브쿼리와 비교할 항목은
반드시 서브쿼리의 SELECT한 항목의 개수와 자료형을 일치시켜야 합니다.
작성법 및 예시는 아래와 같습니다.
▶ SUBQUERY 유형
SUBQUERY의 유형은 6가지로 분류할 수 있는데요.
위와 같이 구분할 수 있습니다.
그럼 각 서브쿼리 사용법, 서브쿼리 예시를 알아보도록 하죠.
▷ 단일행 서브쿼리
▷ 다중 행 서브쿼리
▷ 다중 열 서브쿼리
▷ 다중 행 다중 열 서브쿼리
▷ WITH
rank 함수도 서브쿼리로 처리가 가능합니다.
▷ RANK() OVER
▷ DENSE_RANK() OVER
그럼 간단한 예제를 살펴봅시다.
SQL(SUBQUERY) 예제
※ 모든 SQL 예제는 테이블을 생성하지 않고 문제만 봐도 풀 수 있습니다!
모든 테이블은 ID로 구분하고 ID로 조인합니다.
(EX- EMPLOYEE.DEPARTMENT_ID = DEPARTMENT.DEPARTMENT_ID)
난이도 ★★★
예제 1
Q : 아래 코드를 참조하여 ROWNUM을 활용해 원하는 SALARY(월급)이 높은 직원 3명을 조회하라.
SELECT ROWNUM, EMPLOYEE_ID, SALARY
FROM EMPLOYEES
WHERE ROWNUM <= 5;
(원하는 결과가 나오지 않음)
풀이 :
SELECT ROWNUM, EMPLOYEE_ID, SALARY
FROM (SELECT ROWNUM,EMPLOYEE_ID,SALARY FROM EMPLOYEES ORDER BY SALARY DESC)
WHERE ROWNUM <=3;
난이도 ★★★
예제 2
Q : 매니저가 존재하는 부서의 사원들을 조회
(DEPARTMENTS, EMPLOYEES,
매니저는 MANAGER_ID로 구분하고 DEPARTMENTS와 EMPLOYEES 테이블에 둘 다 포함되어있다.)
풀이 :
SELECT E.EMPLOYEE_ID,
E.FIRST_NAME || ' ' || E.LAST_NAME AS "NAME",
E.DEPARTMENT_ID,
(SELECT D.DEPARTMENT_NAME
FROM DEPARTMENTS D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID) AS DEPARTMENT_NAME
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE MANAGER_ID IS NOT NULL)
ORDER BY 1;
이상으로 SUBQUERY에 대해 알아봤습니다.
다음 포스팅에선 SQL VIEW(뷰)에 대해 다뤄보고자 합니다.
[Database] SQL VIEW(뷰) | 뷰의 장점 (java로 웹개발하기)(day26)
지난 포스팅에서 SQL 서브쿼리에 대해서 다뤄봤습니다. https://healthdevelop.tistory.com/entry/db7 [Database] SQL RANK(), DENSE_RANK() | 서브쿼리(SUBQUERY) | INLINE VIEW | SQL 순위 구하기 (java로 웹개..
healthdevelop.tistory.com