7장 서브쿼리 : SELECT 문 안에 있는 SELECT 문

·2024년 1월 4일
0

모두의 SQL

목록 보기
6/10

서브쿼리란?

  • 서브쿼리

    • SELECT 문 안에 다시 SELECT 문이 기술된 형태의 쿼리
    • 서브쿼리의 결과는 메인 쿼리의 조건으로 사용됨
  • 서브쿼리의 종류

    서브쿼리 종류설명
    단일 행 서브쿼리하나의 행을 검색하는 서브쿼리
    다중 행 서브쿼리하나 이상의 행을 검색하는 서브쿼리
    다중 열 서브쿼리하나 이상의 열을 검색하는 서브쿼리
  • 서브쿼리의 종류에 따라 사용하는 연산자의 종류

    연산자 구분종류사용처
    단일 행 연산자=, >, >=, <, <=, <>, !=단일 행 서브쿼리, 다중 열 서브쿼리
    다중 행 연산자IN, NOT IN, EXISTS, ANY, ALL다중 행 서브쿼리, 다중 열 서브쿼리

단일 행 서브쿼리

  • 단일 행 서브쿼리

    • 서브쿼리 SELECT 문에서 얻은 한 개 행의 결과값을 메인 쿼리로 전달하는 서브쿼리
    • 메인 쿼리와 서브쿼리를 연결하는 연산자로는 단일 행 연산자를 사용함 (하나의 행을 처리하는 연산자)
    • 조건식인 WHERE 절에 기술되는 열의 개수와 데이터 타입은 메인 쿼리와 서브 쿼리가 서로 같아야 함
  • employees 테이블의 last_name이 ‘De Haan’인 직원과 salary가 동일한 직원에는 누가 있는지 단일 행 서브쿼리를 이용해서 출력하기

    SELECT *
    FROM DEMPLOYEES
    WHERE SALARY = (SELECT SALARY FROM EMPLOYEES WHERE LAST_NAME = 'De Haan');

다중 행 서브쿼리

  • 다중 행 서브쿼리

    • 하나 이상의 결과 행을 메인 쿼리에 전달하는 경우에 사용
    • 다중 행 연산자 사용
  • 다중 행 연산자의 종류

    다중 행 연산자설명
    IN같은 값IN(10, 20) → 10이나 20이 포함
    NOT IN같은 값이 아님NOT IN(10, 20) → 10이나 20이 포함되지 않음
    EXISTS값이 있으면 반환EXISTS(10) → 10이 존재하면 참
    ANY최소한 하나라도 만족하는 것(OR)
    <, = 등 비교 연산자와 같이 사용ANY(10, 20) → 10이나 20이 포함
    ALL모두 만족하는 것 (AND)
    <, = 등 비교 연산자와 같이 사용ALL(10, 20) → 10과 20이 포
  • employees 테이블에서 department_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 salay에 해당하는 직원이 누구인지 다중행 서브쿼리를 이용해 찾아보기

    SELECT *
    FROM EMPLOYEES A
    WHERE A.SALARY IN (SELECT MIN(SALARY) 최저급여 FROM EMPLOYEES GROUP BY DEPARTMENT_ID)
    ORDER BY A.SALARY DESC;

    그룹 함수 MIN을 이용해서 DEPARTMENT_ID별 최저 SALARY를 조회하는 서브쿼리를 이용하여 다중행을 조회한 다음 메인 쿼리로 전달함
    다중 행 서브쿼리이므로 등호(=) 연산자를 사용하지 않고 다중 행 연산자인 IN을 사용함
    IN 연산자는 하나 이상의 행을 받아 처리하는 연산자
    메인 쿼리에서는 다중 행의 SALARY 값을 결과값이자 조건식으로 받아 일치하는 직원을 출력함

다중 열 서브쿼리

  • 다중 열 서브쿼리

    • 메인 쿼리와 서브쿼리를 비교하는 WHERE 조건식에서 비교되는 열이 여러 개일 때 사용하는 서브쿼리
  • employees 테이블에서 job_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 job_id별 salary에 해당하는 직원이 누구인지 다중열 서브쿼리를 이용해 찾아보기

    SELECT *
    FROM EMPLOYEES A
    WHERE (A.JOB_ID, A.SALARY) IN (SELECT JOB_ID, MIN(SALARY) 그룹별급여 FROM EMPLOYEES GROUP BY JOB_ID)
    ORDER BY A.SALARY DESC;

    그룹 함수 MIN을 사용하여 JOB_ID별 최저 SALARY를 찾아내고 해당 값을 다중 열 서브쿼리를 통해 메인 쿼리에 전달하여 해당 직원이 누구인지 찾는 SELECT 문
    다중 열이자 다중 행이기 때문에 조건식에 IN 연산자를 사용함
    다중 열 서브쿼리를 사용하려면 조건식의 메인 쿼리와 서브쿼리의 각 열이 일대일로 대응해야 하며 데이터 타입도 동일해야 함

FROM 절 서브쿼리 : 인라인 뷰

  • FROM 절에도 서브쿼리를 사용할 수 있음
  • FROM 절에 서브쿼리를 사용하면 특정 조건식을 갖는 SELECT 문을 테이블처럼 사용할 수 있음 → 마치 가상 테이블(뷰)와 같은 역할을 한다고 해서 인라인 뷰라고도 부름
  • 직원 중에서 department_name이 IT인 직원의 정보를 인라인 뷰를 이용해 출력하기
    SELECT *
    FROM EMPLOYEES AS A, (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE DEPARTMENT_NAME = 'IT') AS B
    WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
    departments 테이블에서 department_name이 IT인 데이터 값을 조회하는 SELECT 문을 마치 테이블처럼 FROM 절에 기술함 이는 department_id가 60이라는 데이터 값을 갖는 테이블과 같다고 할 수 있음 서브쿼리에 B라는 별칭을 줘서 employees 테이블과 department_id로 동등 조인하였고, 이로서 IT부서에 속한 모든 직원을 출력함 이처럼 서브쿼리를 FROM 절에 기술하면 SELECT 문을 정교하게 작성할 수 있음

0개의 댓글