3 분 소요

SQL 활용

서브쿼리(Subquery)

  • 하나의 쿼리 안에 존재하는 또 다른 쿼리이다.
  • 서브쿼리는 위치에 따라 다음과 같이 나눌 수 있다.
    • SELECT 절 : 스칼라 서브쿼리(Scalar Subquery)
    • FROM 절 : 인라인 뷰(Inline View)
    • WHERE 절, HAVING 절 : 중첩 서브쿼리(Nested Subquery)

1. 스칼라 서브쿼리

  • 주로 SELECT절에 위치하지만 컬럼이 올 수 있는 대부분 위치에 사용할 수 있다.
  • 컬럼 대신 사용되므로 반드시 하나의 값만 반환해야됨. 아님 에러발생.
  • ex) SELECT M.ID_NAME , (SELECT S.P_NAME WHERE S.P_CODE = M.P_CODE) AS PRO_NAME FROM PRODUCT_REVIEW M;

2. 인라인 뷰

  • FROM 절 등 테이블 명이 올 수 있는 위치에 사용 가능하다.
  • SELECT M.PRODUCT_CODE, S.PRICE FROM PRODUCT_REVIEW M, (SELECT PRODUCT_CODE, PRODUCT_NAME, PRICE FROM PRODUCT) S WHERE M.PRODUCT_CODE = S.PRODUCT_CODE;

3. 중첩 서브쿼리(Neasted Subquery)

  • WHERE 절과 HAVING 절에 사용가능. 두 개의 세부분류가 있음.

    1. 비연관 서브쿼리 : 메인 쿼리와 관계를 맺고 있지 않음.
    2. 연관 서브쿼리 : 메인 쿼리와 관계를 맺고 있음.
  • 비연관 서브쿼리 : 서브쿼리 내에 메인 쿼리의 컬럼이 존재하지 않음.

    • ex) SELECT NAME, JOB, BIRTHDAY, AGENCY_CODE FROM ENTERTAINER WHERE AGENCY_CODE = (SELECT AGENCY_CODE FROM AGENCY WHERE AGENCY_NAME = ‘EDAM엔터테인먼트’);
  • 연관 서브쿼리 : 서브 쿼리 내에 메인 쿼리의 컬럼 존재

    • ex) SELECT ORDER_NO, DRINK_CODE FROM CAFE_ORDER A WHERE ORDER_CNT = (SELECT MAX(ORDER_CNT) FROM CAFE_ORDER B WHERE B.DRINK_CODE = A.DRINK_CODE); => A.DRINK_CODE가 존재…
  • 중첩 서브쿼리는 반환하는 데이터 형태에 따라 다음과 같이 나눌 수 있다.

    • 단일 행(Single Row) 서브쿼리 : 항상 1건 이하의 결과만 반환
    • 다중 행(Multi Row) 서브쿼리 : 2건 이상의 행을 반환.
    • 다중 컬럼(Multi Column) 서브쿼리 : 서브 쿼리가 여러 컬럼의 데이터를 반환.

뷰(View)

  • 특정 SELECT 문에 이름을 붙여서 재사용이 가능하도록 저장해놓은 오브젝트이다.
  • 뷰는 가상의 테이블이다. 실제 저장하지는 않고, 해당 데이터를 조회해오는 SELECT 문만 가지고 있다.
  • 보안성, 독립성, 편리성이라는 특징이 있음.

집합 연산자

  • UNION ALL : 각 쿼리의 결과 집합의 합집합. 중복된 행도 그대로 출력됨.
  • UNION : 각 쿼리의 결과 집합의 합집합. 중복된 행은 한 줄로 출력됨.
  • INTERSECT : 각 쿼리의 결과 집합의 교집합. 중복된 행은 한 줄로 출력됨.
  • MINUS/EXCEPT : 앞에 있는 쿼리의 결과 집합에서 뒤에 있는 쿼리의 결과 집합을 뺀 차집합이다. 중복된 행은 한 줄로 출력된다.

그룹 함수

  • 데이터를 GROUP BY 하여 나타낼 수 있는 데이터를 구하는 함수.
  • 집계 함수와 소계(총계) 함수로 나눌 수 있다.
    • 집계 함수 : COUNT, SUM, AVG, MAX, MIN
    • 소계(총계) 함수 : ROLLUP, CUBE, GROUPING, SETS
  1. ROLLUP
  • 소그룹 간의 소계 및 총계를 계산하는 함수이다.
    • ROLLUP(A)
      • A로 그룹핑
      • 총합계
    • ROLLUP (A, B)
      • A, B로 그룹핑
      • A로 그룹핑
      • 총합계
    • ROLLUP (A, B, C)
      • A, B, C로 그룹핑
      • A, B로 그룹핑
      • A로 그룹핑
      • 총합계
  1. CUBE
  • 소그룹 간의 소계 및 총계를 다차원적으로 계산할 수 있는 함수이다.
  • GROUPBY가 일방향으로 한다면, CUBE는 모든 조합 그룹에 대한 소계를 함.
    • CUBE(A)
      • A로 그루핑
      • 총합계
    • 이하의 과정은 위의 ROLLUP과 같음.
  1. GROUPING SETS
  • 특정 항목에 대한 소계를 계산하는 함수이다. 인자값으로 ROLLUP이나 CUBE를 사용할 수도 있다.

    • GROUPING SETS (A ,B) : A로 그룹핑, B로 그룹핑.
    • GROUPING SETS (A, B, ()) : A로 그룹핑, B로 그룹핑, 총합계.
    • GROUPING SETS (A, ROLLUP(B)) :바로 윗줄의 결과와 동일함.
    • GROUPING SETS (A, ROLLUP(B,C)) : A로 그룹핑, B,C로 그룹핑, B로 그룹핑, 총합계.
    • GROUPING SETS (A, B, ROLLUP(C)) : A로 그룹핑, B로 그룹핑, C로 그룹핑, 총합계.
  • ROLLUP 합수는 인수의 순서에 따라 결과가 달라지며, CUBE 함수와 GROUPING SETS 함수는 인수의 순서가 바뀌어도 같은 결과를 출력한다.

  1. GROUPING
  • GROUPING 함수는 ROLLUP, CUBE, GROUPING SETS 등과 함께 쓰이며 소계를 나타내는 ROW를 구분할 수 있게 해준다.

윈도우 함수

  • OVER 키워드와 함께 사용됨.
  • 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER
  • 집계 함수 : SUM, MAX, AVG, COUNT
  • 행 순서 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
  • 비율 함수 : CUMB_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT
  1. 순위 함수
  • RANK : 순위를 매기면서 같은 순위가 존재하면 존재하는 수만큼 다음 순위를 건너띈다.
  • DENSE_RANK : 순위를 매기면서 같은 순서가 존재하더라도 다음 순위를 건너뛰지 않고 이어서 매김.
  • ROW_NUMBER : 순위를 매기면서 동일한 값이라도 각기 다른 순위를 부여한다.
  1. 집계 함수
  • SUM : 데이터의 합계를 구하는 함수이다. 숫자만 가능.
  • MAX : 데이터의 최댓값을 구하는 함수이다.
  • MIN : 데이터의 최솟값을 구하는 함수이다.
  • AVG : 데이터의 평균값을 구하는 함수이다.
  • COUNT : 데이터의 건수를 구하는 함수이다.

태그:

카테고리:

업데이트: