본문 바로가기

스파르타 코딩클럽/[강의] SQLD 자격증 대비반

[SQLD 자격증 대비반] 챕터 12. 서브쿼리

집합 연산자

  • SELECT를 통해 얻은 결과 간의 집합 연산을 수행
  • 2개 이상의 쿼리 수행 결과를 하나의 결과로 만들어 줌
  • 집합 연산자를 사용하기 위해서는 SELECT 절의 칼럼 수가 동일해야 함
  • ORDER BY는 최종 결과에 대한 정렬 처리이므로 가장 마지막 줄에 한 번만 기술
  • 종류 : UNION, UNION ALL, INTERSECT, MINUS(EXCEPT)

 

서브쿼리

  • 하나의 SQL문 안에 포함되어 있는 또다른 SQL 문을 의미
  • 서브쿼리는 조인과 다르게 자유로운 형태의 참조가 아닌 특정 조건에 맞게 참조해야 함
  • 알려지지 않은 기준을 이용한 검색을 위해 사용되기 때문에 메인쿼리가 서브쿼리를 포함하는 형태
    ➡️서브쿼리는 레벨과 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성

  • 서브쿼리는 소괄호()로 감싸서 사용
  • 단일행 또는 복수행 비교 연산자와 함께 사용 가능
    - 단일행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하
    - 복수행 비교 연산자는 서브쿼리 결과 건수와 관련 X
  • 서브쿼리에서는 ORDER BY절 사용 X

 

서브쿼리 분류

동작 방식에 따른 서브쿼리

  • 연관 서브쿼리
    • 서브쿼리 내에 메인쿼리 칼럼이 사용됨
    • 메인쿼리가 먼저 수행되어 읽힌 데이터를 서브쿼리에 조건이 맞는지 확인하고자 할 때 사용
    • EXISTS 서브쿼리
      - 서브쿼리 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건 의미
      - 항상 연관 서브쿼리로 사용되는데, EXISTS 문은 서브쿼리의 결과가 참이라면 결과 집합에 포함시킴
      - 아무리 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 1건만 찾으면 추가적인 검색 X
  • 비연관 서브쿼리
    • 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태
    • 서브쿼리가 우선 실행되고 그 결과가 메인쿼리의 WHERE 조건으로 이용됨
    • 메인쿼리에 값(서브쿼리가 실행된 결과)를 제공하기 위한 목적으로 사용

반환 형태에 따른 서브쿼리

  • 단일행 서브쿼리(Single Row)
    • 실행 결과가 항상 1건 이하인 서브쿼리
      (2건 이상 반환하면 런타임 오류 발생)
    • 단일행 비교 연산자인 =, <, <=, >, >=, <> 와 함께 사용
  • 다중행 서브쿼리(Multi Row)
    • 실행 결과가 여러 건인 서브쿼리
    • 다중행 비교 연산자인 IN, ALL, ANY, SOME, EXISTS와 함께 사용
      - IN : 서브쿼리 결과에 존재하는 임의의 값과 동일한 조건 
      - ALL : 서브쿼리 결과에 존재하는 모든 값을 만족하는 조건 
      - ANY/SOME : 서브쿼리 결과에 존재하는 어느 하나의 값이라도 만족하는 조건 
      - EXISTS : 서브쿼리 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건
  • 다중칼럼 서브쿼리(Multi Column)
    • 실행 결과로 여러 칼럼을 반환하는 서브쿼리
    • 메인쿼리의 조건절에 여러 칼럼을 동시 비교 가능
    • 서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼 개수와 위치가 동일해야 함

 

위치별 서브쿼리

  • SELECT
    • 스칼라 서브쿼리
    • 하나의 행과 하나의 칼럼만 반환
  • FROM
    • 인라인뷰 서브쿼리
    • 실행 시 동적으로 생성된 테이블인 것처럼 사용 가능
    • SQL문이 실행될 때만 임시적으로 생성되는 뷰이기 때문에 DB에 저장 X
    • 인라인뷰의 칼럼은 메인쿼리에서 사용 가능
  • WHERE
    • 가장 많이 사용하는 서브쿼리
    • 여러 개의 서브쿼리가 겹쳐 있기 때문에 '중첩서브쿼리'라고도 부름
  • HAVING
    • 그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해 사용
  • INSERT문의 VALUES
    • 서브쿼리를 통해 새로운 값을 집어넣을 수도 있음
  • UPDATE문의 SET : 서브쿼리
    • 서브쿼리의 결과가 NULL을 반환할 때 주의해야 함
    • WHERE절은 UPDATE 대상이 되는 데이터의 범위를 결정하게 되는데, WHERE 절이 누락되면 모든 대상이 UPDATE 대상이 되므로 NULL 값으로 변경될 수 있기 때문

 

뷰(View)

  • 데이터베이스에 저장된 정보를 좀 더 편리하게 보여주기 위해 사용되는 가상의 테이블
  • 실제 데이터를 가지고 있지 않으며 단지 뷰 정의(View Definition)만을 가지고 있음
  • 뷰 사용의 장점
    • 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 됨
    • 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성 가능
    • 보안성 : 뷰를 생성할 때 숨기고 싶은 칼럼을 빼고 생성함으로써 사용자에게 정보를 감출 수 있음
  • CREATE VIEW 문을 통해 생성 가능
  • 이미 존재하는 뷰를 참조해서도 생성 가능
  • 뷰를 제거하기 위해서는 DROP VIEW 문 사용