교육 (Today I Learned)/Hanaro

[Hanaro] 46일차 / SQL (JOIN, 서브쿼리)

Bay Im 2024. 3. 22. 09:10

05 조인 이해 및 실습

  • 조인 (Join)
    • 두 개의 테이블을 연결하여 데이터를 검색하는 방법
    • 서로 다른 테이블에 저장된 관련된 데이터를 가져와서 하나의 결과로 표시 (하나의 테이블)
  • ANSI SQL 조인 방식
    • FROM 절에서 두 테이블명 사이에 조인 종류에 따라 CROSS, INNER, OUTER 중 선택하고 JOIN 키워드 같이 입력
    • 조인에 대한 조건은 ON절에 저장하고 나머지 조건은 WHERE절에 작성
    • CROSS, INNER, OUTER 키워드는 생략도 가능
    • 형태
      • SELECT *
        FROM 테이블A
        [CROSS|INNER|OUTER] JOIN 테이블B
        ON 조인조건
        WHERE 기타조건;
  • Non-ANSI SQL 조인 방식
    • FROM절에 테이블을 쉼표로 구분하여 작성
    • 조인조건과 기타조건을 구분하지 않고 모두 WHERE 절에 작성
    • 형태
      • SELECT *
        FROM 테이블A, 테이블B
        WHERE 조인조건과 기타조건;
  • ERD (Entity Relationship Diagram)
    • 테이블 간의 관계를 설명해주는 다이어그램
    • 데이터베이스의 구조와 관계를 한눈에 파악 가능
  • 조인의 종류
    • Cross Join
      • 한쪽 테이블의 각 행마다 다른쪽 테이블의 모든 행이 각각 한번씩 매칭되는 조인
      • 카티션 곱(Cartesian Product)라고도 부른다.
      • 크로스 조인 결과 행의 개수는 테이블A 행의 개수*테이블B 행의 개수
      • 형태
        • SELECT *
          FROM 테이블A
          [CROSS] JOIN 테이블B
          WHERE 기타조건;
    • Inner Join (내부 조인)
      • 각 테이블에서 조인조건에 일치하는 데이터만 가져오는 조인
      • Equi Join과 Non-Equi Join
        • Equi Join
          • 조인조건에 = 연산자 사용
        • Non-Equi Join
          • 조인조건에 = 연산지 외에 비교 연산자 사용
      • 다중 조인
        • JOIN - ON 아래에 또다시 JOIN - ON
      • 형태
      • SELECT *
        FROM 테이블A
        [INNER] JOIN 테이블B
        ON 조인조건
        WHERE 기타조건;
      • 예시
        • SELECT 사원번호, 직위, 사원.`부서번호`, 부서명
          FROM 사원
          INNER JOIN 부서
          ON 사원.`부서번호` = 부서.`부서번호`
          WHERE 이름 = '이소미';
    • Outer Join (외부조인)
      • 조건에 맞지 않은 행도 함께 출력할 수 있다.
      • 두 테이블에서 한쪽은 데이터가 있고 한쪽에는 없을 경우 데이터가 있는 쪽을 기준으로 데이터 출력
    • LEFT/RIGHT 외부조인
      • 테이블명 사이에 LEFT나 RIGHT를 넣어서 OUTER JOIN (OUTER은 생략 가능)
      • LEFT JOIN
        • 왼쪽에 있는 테이블을 기준으로 오르쪽 테이블의 데이터를 매칭
        • 매칭데이터 없을 시 NULL 표시
      • RIGHT JOIN
        • 오른쪽에 있는 테이블을 기준으로 왼쪽 테이블의 데이터를 매칭
        • 매칭데이터 없을 시 NULL 표시
      • 형태
        • SELECT *
          FROM 테이블A
          LEFT|RIGHT [OUTER] JOIN 테이블B
          ON 조인조건
          WHERE 기타조건;
    • FULL OUTER JOIN
      • LEFT OUTER JOIN에 RIGHT OUTER JOIN을 합한 형태
      • 두 OUTER JOIN 중간에 UNION 연산자 사용
    • SELF JOIN
      • 동일한 테이블 내에서 한 컬럼이 다른 컬럼을 참조하는 조인
      • 조인 조건에 동일한 테이블명을 두번 작성하여 조인한다. 이때 테이블명을 다른 별명으로 지정하여 다른 테이블인 것처럼 사용해야 한다.
      • 컬럼명도 다 똑같기 때문에 테이블의 별명.컬럼명 형태로 구분해야 한다.

 

06 서브쿼리 이해 및 실습

  • 서브쿼리 (SubQuery)
    • SELECT 문 안에 SELECT 문을 서브쿼리라고 한다.
    • 복잡한 데이터 추출 및 조작시 사용
    • 서브쿼리는 괄호 안에 기술해야 하고, SELECT, FROM, WHERE, HAVING 절 등에 넣어서 사용 가능
    • 서브쿼리가 먼저 실행 후 메인 쿼리 실행
  • 단일 행 서브쿼리 (Single-Row SubQuery)
    • 서브쿼리의 결과로 단일 행 반환
    • =, <, ≤, ≥, >, <> 등 단일 행 비교연산자 사용하여 연결
    • 예시
      • SELECT 컬럼명
        FROM 테이블명
        WHERE 컬럼명 = (SELECT MAX(컬럼명) FROM 테이블명);
  • 복수 행 서브쿼리 (Multi-Row SubQuery)
    • 서브쿼리의 결과가 여러 행
    • IN, ALL, ANY, SOME, EXISTS 같은 복수행 비교 연산자 사용하여 연결
      • IN
        • 서브쿼리 결과 중 일치하는 것이 하나라도 있으면 참
      • ANY, SOME
        • 하나 이상 일치하면 참
      • ALL
        • 각 결과값이 모두 일치하면 참
      • EXISTS
        • 비교 조건을 만족하는 결과가 존재하면 참
  • 인라인 뷰(Inline View)
    • FROM 절에서 서브쿼리 사용하는 것을 인라인 뷰라고 한다.
    • 뷰에는 반드시 별명 지정, 해당 별명은 테이블명처럼 사용 가능
  • 스칼라 서브쿼리 (Scalar Subquery)
    • SELECT 절 내에서 서브쿼리 사용 시 이때 서브쿼리가 하나의 값을 생성하는 형태를 스칼라 서브쿼리라고 한다.
    • 정확히 한 개의 행에 대해 한개의 값을 반환하는 서브쿼리
      • 0개 반환시 메인 쿼리 결과는 NULL
      • 2개 이상 반환시 오류 발생
    • 쿼리를 실행하여 반환되는 값은 메인 쿼리에서 사용
  • CTE(Common Table Expression)
    • 쿼리로 만든 임시 데이터셋으로 WITH 절에서 정의한다.
    • 쿼래 내에서 여러 번 참조 가능
    • 하나의 쿼리를 논리적인 블록으로 나누기 가능
    • 형식
      • WITH CTE명 AS ( SELECT문 )