SQL 기본 및 활용-6.Subquery

hoon·2024년 11월 14일
0

sqld

목록 보기
9/10

서브쿼리

  • 서브쿼리란 SQL문 안에 포함된 SQL문으로, 메인 쿼리와 함께 사용된다.

서브쿼리 유형 구분

기준유형
서브쿼리 위치SELECT절, WHERE절, FROM절(→ Inline View)
결과 칼럼/행의 수단일행 서브쿼리 / 다중행 서브쿼리, 단일칼럼 서브쿼리 / 다중칼럼 서브쿼리
메인 쿼리와의 연관성연관(상관) 서브쿼리 / 비연관 서브쿼리
  • 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있다.
  • 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.
    • 단, Inline View로 정의된 칼럼만 사용할 수 있다.

결과 칼럼/행의 수에 따른 서브쿼리 구분

서브쿼리 종류설명
Single Row (단일행)서브쿼리 실행 결과가 1건 이하의 행을 반환. 단일행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용
Multi Row (다중행)서브쿼리 실행 결과가 여러 건의 행을 반환 가능. 다중행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)와 사용
Single Column (단일칼럼)서브쿼리 실행 결과가 하나의 칼럼을 반환
Multi Column (다중칼럼)서브쿼리 실행 결과가 여러 칼럼을 반환. 메인쿼리의 비교 연산 시, 칼럼 개수와 위치가 일치해야 함

다중행 서브쿼리 (Multi-Row Subquery)

다중행 서브쿼리는 서브쿼리의 결과가 2건 이상의 행을 반환할 가능성이 있을 때 사용됩니다. 주로 여러 행을 비교하기 위해 사용되는 연산자와 함께 쓰인다.

다중행 연산자

연산자설명
IN서브쿼리 결과 중 하나라도 일치하면 참으로 판단 (Multiple OR 조건)
ALL서브쿼리의 모든 값을 만족해야 하는 조건
ANY/SOME서브쿼리의 어느 하나의 값이라도 만족하면 되는 조건 (ANY = SOME)
EXISTS조건을 만족하는 값이 존재하는지 여부를 확인

예시 연산자 설명

  • IN 연산자: 서브쿼리 결과에 포함된 값 중 하나만 일치해도 참으로 판단한다.
  • ALL 연산자: 모든 조건을 만족해야 참으로 판단한다.
  • ANY/SOME 연산자: 서브쿼리의 결과 중 하나라도 만족하는 조건이 있으면 참으로 판단한다.
  • EXISTS 연산자: 조건을 만족하는 값이 있는지만 확인하여 효율적입니다. 하나의 값이 찾으면 더 이상 검색하지 않는다.

예제 코드와 설명

IN 연산자 예시

SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT IN (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
  • BACK_NO가 15인 선수들의 HEIGHT와 동일한 HEIGHT를 가진 선수들을 반환한다.

ALL 연산자 예시

SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT > ALL (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
  • BACK_NO가 15인 선수들의 HEIGHT 중 가장 높은 값을 초과하는 HEIGHT를 가진 선수들을 반환한다.

ANY 연산자 예시

SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE HEIGHT >= ANY (SELECT HEIGHT FROM PLAYER WHERE BACK_NO = 15);
  • BACK_NO가 15인 선수들의 HEIGHT 중 어느 하나라도 일치하거나 높은 HEIGHT를 가진 선수들을 반환한다.

EXISTS 연산자 예시

SELECT PLAYER_NAME, HEIGHT, BACK_NO
FROM PLAYER
WHERE EXISTS (SELECT 1 FROM PLAYER WHERE BACK_NO = 15);
  • BACK_NO가 15인 선수들이 존재하는지 여부만을 판단하여, 조건을 만족하면 데이터를 반환합니다. 서브쿼리에서 SELECT 1을 사용해 간단히 존재 여부만 확인한다.

연관 서브쿼리의 특징

  • 메인쿼리의 칼럼이 서브쿼리에서 사용된 쿼리
    • 비연관 서브쿼리: 서브쿼리에서 메인쿼리의 칼럼을 사용하지 않음
  • 메인쿼리가 먼저 수행되고, 그 후에 서브쿼리가 수행됨
    - 테이블의 별칭을 이용하여 메인 쿼리에서 서브쿼리로 정보 전달
    - 서브쿼리가 메인쿼리의 값을 이용한 후, 서브쿼리의 결과를 메인쿼리가 이용
  • 서브쿼리에서 메인쿼리의 칼럼과 서브쿼리의 칼럼 간 비교가 이루어짐
    - 메인쿼리에서는 서브쿼리의 칼럼을 사용할 수 없음

뷰(View)

  • 뷰는 테이블처럼 사용되지만, 실제 데이터는 가지지 않으며 SQL 텍스트 파일 형태로만 존재함
  • 쿼리에서 뷰를 사용하면 DBMS가 내부적으로 쿼리를 재작성(Rewrite)함
  • 테이블과 동일하게 활용 가능하며, CREATE VIEW문을 통해 생성 가능

뷰 생성 예시

CREATE VIEW V_PLAYER_TEAM AS
SELECT P.PLAYER_NAME, P.BACK_NO, P.TEAM_ID, T.TEAM_NAME
FROM PLAYER P INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID;

뷰의 확인

SELECT * FROM USER_VIEWS;

뷰의 장점

  1. 독립성
    테이블 구조가 변경되어도 뷰만 변경하면 되므로 응용 프로그램에 영향이 적음
    예: PLAYER와 TEAM 테이블이 변경되어도 V_PLAYER_TEAM 뷰가 수정되면 응용 프로그램 변경 불필요

  2. 편리성
    복잡한 쿼리를 뷰로 생성하여, 질의의 가독성을 높일 수 있음

  3. 보안성
    민감한 정보(예: 급여 정보 등)를 제외한 뷰를 생성하여, 사용자로부터 중요한 데이터를 보호할 수 있음


인라인 뷰 (Inline View)

  • FROM 절에서 사용되는 서브쿼리

  • 실행 순간에만 임시적으로 생성되며 DB에 저장되지 않음

    • 인라인 뷰 (Inline View) = 동적 뷰 (Dynamic View)
    • 일반 뷰 = 정적 뷰 (Static View)
  • 인라인 뷰의 SELECT문에서 정의된 칼럼은 메인 쿼리에서 사용 가능

    • cf) 일반적으로 서브쿼리에서 정의된 칼럼은 메인 쿼리에서 사용 불가

0개의 댓글