SQLD - Part2 - Chapter2 - SQL 활용
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 절에 사용가능. 두 개의 세부분류가 있음.
- 비연관 서브쿼리 : 메인 쿼리와 관계를 맺고 있지 않음.
- 연관 서브쿼리 : 메인 쿼리와 관계를 맺고 있음.
-
비연관 서브쿼리 : 서브쿼리 내에 메인 쿼리의 컬럼이 존재하지 않음.
- 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
- ROLLUP
- 소그룹 간의 소계 및 총계를 계산하는 함수이다.
- ROLLUP(A)
- A로 그룹핑
- 총합계
- ROLLUP (A, B)
- A, B로 그룹핑
- A로 그룹핑
- 총합계
- ROLLUP (A, B, C)
- A, B, C로 그룹핑
- A, B로 그룹핑
- A로 그룹핑
- 총합계
- ROLLUP(A)
- CUBE
- 소그룹 간의 소계 및 총계를 다차원적으로 계산할 수 있는 함수이다.
- GROUPBY가 일방향으로 한다면, CUBE는 모든 조합 그룹에 대한 소계를 함.
- CUBE(A)
- A로 그루핑
- 총합계
- 이하의 과정은 위의 ROLLUP과 같음.
- CUBE(A)
- 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 함수는 인수의 순서가 바뀌어도 같은 결과를 출력한다.
- 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
- 순위 함수
- RANK : 순위를 매기면서 같은 순위가 존재하면 존재하는 수만큼 다음 순위를 건너띈다.
- DENSE_RANK : 순위를 매기면서 같은 순서가 존재하더라도 다음 순위를 건너뛰지 않고 이어서 매김.
- ROW_NUMBER : 순위를 매기면서 동일한 값이라도 각기 다른 순위를 부여한다.
- 집계 함수
- SUM : 데이터의 합계를 구하는 함수이다. 숫자만 가능.
- MAX : 데이터의 최댓값을 구하는 함수이다.
- MIN : 데이터의 최솟값을 구하는 함수이다.
- AVG : 데이터의 평균값을 구하는 함수이다.
- COUNT : 데이터의 건수를 구하는 함수이다.