20241011(금) DB - SUBQUERY

Dodo Lee·2024년 10월 11일

[ SUBQUERY ]

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

0. 목차

1) 단일행(단일열) 서브쿼리
2) 다중행(단일열) 서브쿼리
3) 다중열 서브쿼리
4) 다중행 다중열 서브쿼리


1. 단일행(단일열) 서브쿼리

  • 서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
  • 단일행 서브쿼리 앞에는 '비교 연산자' 사용
  • <, >, <=, >=, =, !=/<>/^=

예시) 노옹철 사원의 급여보다 많이 받는 직원의
사번, 이름, 부서명, 직급명, 급여 조회

SELCT EMP_ID , EMP_NAME , DEPT_TITLE , JOB_NAME , SALARY
FROM EMPLOYEE
NATURAL JOIN
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE SALARY >
(SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME='노옹철');

2. 다중행(단일열) 서브쿼리

  • 서브쿼리의 조회 결과 값의 개수가 여러행인 경우
  • 일반 비교 연산자 사용 X
    ※사용 연산자
    1) IN / NOT IN
  • 여러개의 열과 값 중에서 한 개라도 일치하지 하는 값이 있는지 없는지
    2) >ANY / <ANY
  • 여러 값 중 한 개라도 작거나 큰지
    3) >ALL / <ALL
  • 모든 값 보다 큰지 작은지
    4) EXISTS / NOT EXISTS
  • 값이 존재 하는지 아닌지

예시)
차장 직급의 급여 중 가장 큰 값보다 많이 받는 과장 직급의 직원의
사번, 이름, 직급, 급여 조회

SELECT EMP_ID , EMP_NAME, JOB_NAME , SALARY
FROM EMPLOYEE
NATURAL JOIN JOB
WHERE JOB_NAME = '과장'
AND SALARY >ALL
(SELECT SALARY
 FROM EMPLOYEE
 JOIN JOB USING(JOB_CODE)
 WHERE JOB_NAME = '차장');

3. 다중열 서브쿼리

  • 서브쿼리 SELECT 절에 나열된 컬럼 수가 여러개 일 때

예시)
2000년도에 입사한 사원의 부서와 직급이 같은 사원의
사번, 이름, 부서코드, 직급코드, 입사일 조회

SELECT EMP_ID , EMP_NAME , DEPT_CODE , JOB_CODE , HIRE_DATE
FROM EMPLOYEE
WHERE (DEPT_CODE , JOB_CODE) =
(SELECT DEPT_CODE , JOB_CODE
 FROM EMPLOYEE
 WHERE EXTRACT (YEAR FROM HIRE_DATE) = 2000);

4. 다중행 다중열 서브쿼리

  • 서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때

예시)
본인이 소속된 직급의 평균 급여를 받고 있는 직원의
사번, 이름, 직급코드, 급여 조회
(단, 급여와 급여 평균은 만원단위로 계산)

SELECT EMP_ID , EMP_NAME , JOB_CODE , SALARY
FROM EMPLOYEE
WHERE (JOB_CODE , SALARY) IN
(SELECT JOB_CODE , TRUNC(AVG(SALARY), -4)
 FROM EMPLOYEE
 GROUP BY JOB_CODE);
profile
연습생

0개의 댓글