SQL 활용
서브쿼리
하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다. 반드시 괄호로 묶어야 한다. ex. SELECT 안에 SELECT문, INSERT, UPDATE, DELETE 안의 SELECT문.
서브쿼리 사용 가능한 곳
- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- 기타 DML(INSERT, DELETE, UPDATE) 절
GROUP BY 절 사용 불가!
서브쿼리 종류
- 동작하는 방식에 따라
UN-CORRELATED(비연관) 서브쿼리: 서브쿼리가 메인쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리. 메인쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용.
CORRELATED(연관) 서브쿼리: 서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태의 서브쿼리. 일반적으로 메인쿼리가 먼저 수행된 후에 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용. - 위치에 따라
스칼라 서브쿼리: SELECT에 사용하는 서브쿼리. 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기 위해 주로 사용.
인라인뷰: FROM 절에 사용하는 서브 쿼리. 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용.
WHERE 절 서브쿼리: 가장 일반적인 서브 쿼리. 비교 상수 자리에 값을 전달하기 위한 목적으로 주로 사용. (상수항의 대체) 리턴 데이터의 형태에 따라 단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리, 상호연관 서브쿼리로 구분.
WHERE절 서브쿼리 종류
- 단일형 서브쿼리: 서브쿼리 결과가 1개의 행이 리턴되는 형태. 단일행 서브쿼리 연산자 종류.
더보기연산자 : 의미
= : 같다.
<> : 다르다.
> : 크다.
>= : 크거나 같다.
< : 작다.
<= : 작거나 같다. - 다중형 서브쿼리: 서브쿼리 결과가 여러 행이 리턴되는 형태. =,>,<와 같은 비교 연산자 사용불가. (여러 값이랑 비교할 수 없는 연산자들) 서브쿼리 결과를 하나로 요약하거나 다중행 서브쿼리 연산자를 사용.
- 다중컬럼 서브쿼리: 서브쿼리 결과가 여러 컬럼이 리턴되는 형태. 메인쿼리와의 비교 컬럼이 2개 이상. 대소 비교 전달 불가. (두 값을 동시에 묶어 대소비교 할 수 없다.)
- 상호연관 서브쿼리: 메인쿼리와 서브쿼리의 비교를 수행하는 형태. 비교할 집단이나 조건은 서브쿼리에 명시.(메인쿼리절에는 서브쿼리 컬럼이 정의되지 않았기 때문에 에러 발생.)
인라인뷰(Inline View)
- 쿼리 안의 뷰 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용.
- 테이블명이 존재하지 않기 때문에 다른 테이블과 조인 시 반드시 테이블 별칭 명시.(단독으로 사용하는 경우 불필요)
- WHERE절 서브쿼리와 다르게 서브쿼리 결과를 메인 쿼리의 어느 절에서도 사용할 수 있다.
- 인라인뷰의 결과와 메인쿼리 테이블과 조인할 목적으로 주로 사용.
- 모든 연산자 사용 가능.
스칼라 서브쿼리
- SELECT 절에 사용하는 쿼리로, 마치 하나의 컬럼처럼 표현하기 위해 사용.(단, 하나의 출력 대상만 표현 가능)
- 각 행마다 스칼라 서브쿼리 결과가 하나여야 한다. (단일행 서브쿼리 형태)
- 조인의 대체 연산.
- 스칼라 서브쿼리를 사용한 조인 처리 시 OUTER JOIN이 기본. (값이 없더라도 생략되지 않고 NULL로 출력)
서브 쿼리 주의 사항
특별한 경우(TOP-N 분석 등)를 제외하고는 서브 쿼리절에 ORDER BY 절을 사용 불가. 단일 행 서브쿼리와 다중 행 서브쿼리에 따라 연산자의 선택이 중요.
집합 연산자
- SELECT문 결과를 하나의 집합으로 간주, 그 집합에 대한 합집합, 교집합, 차집합 연산.
- SELECT문과 SELECT문 사이에 집합 연산자 정의.
- 두 집합의 컬럼이 동일하게 구성되어야 한다.(각 컬럼의 데이터 타입과 순서 일치 필요)
- 전체 집합의 데이터 타입과 컬럼명은 첫번째 집합에 의해 결정.
합집합
두 집합의 총 합(전체) 출력. UNION과 UNION ALL 사용 가능.
- UNION: 중복된 데이터는 한 번만 출력. 중복된 데이터를 제거하기 위해 내부적으로 정렬 수행. 중복된 데이터가 없을 경우, UNION 사용 대신 UNION ALL 사용.(불필요한 정렬 발생할 수 있으므로)
- UNION ALL: 중복된 데이터도 전체 출력.
교집합
두 집합 사이에 INTERSECT. 두 집합의 교집합(공통으로 있는 행) 출력.
차집합
두 집합 사이에 MINUS 전달. 두 집합의 차집합(한 쪽 집합에만 존재하는 행) 출력. A-B 와 B-A 는 다르므로 집합 순서 주의.
집합 연산자 사용 시 주의 사항
- 두 집합의 컬럼 수 일치.
- 두 집합의 컬럼 순서 일치.
- 두 집합의 각 컬럼의 데이터 타입 일치.
- 각 컬럼의 사이즈는 달라도 된다.
- 개별 SELECT 문에 ORDER BY 전달 불가.(GROUP BY 전달 가능)
더보기
UNION 절 위에 ORDER BY 문 기입 시 에러. but, 가장 하단에 ORDER BY 기입시 UNION이 끝나고 전체 결과에 대해 정렬한다는 의미를 내포하므로 사용 가능.
그룹 함수
- 숫자함수 중 여러값을 전달하여 하나의 요약값을 출력하는 다중행 함수.
- 수학/통계 함수들.(기술통계 함수)
- GROUP BY 절에 의해 그룹별 연산 결과를 리턴.
- 반드시 한 컬럼만 전달.
- NULL 은 무시하고 연산.
COUNT
- 행의 수를 세는 함수.
- 대상 컬럼은 * 또는 단 하나의 컬럼만 전달 가능. (* 사용 시 모든 컬럼의 값이 NULL일 때만 COUNT 제외)
- 문자, 숫자, 날짜 컬럼 모두 전달 가능.
- 행의 수를 세는 경우 NOT NULL 컬럼을 찾아 세는 것이 좋다. (PK 컬럼)
SUM
총 합 출력. 숫자 컬럼만 전달 가능.
AVG
평균 출력. 숫자 컬럼만 전달 가능. NULL을 제외한 대상의 평균을 리턴하므로 전체 대상 평균 연산 시 주의.
MIN / MAX
최소 / 최대 출력. 날짜, 숫자, 문자 모두 가능. (오름차순 순서대로 최소, 최대 출력)
VARIANCE / STDDEV
분산과 표준편차. 표준편차는 분산의 루트값.
GROUP BY FUNCTION
GROUP BY 절에 사용하는 함수. 여러 GROUP BY 결과를 동시에 출력(합집합)하는 기능. 그룹핑할 그룹을 정의.(전체 소계 등)
- GROUPING SETS(A, B...): A별, B별 그룹 연산 결과 출력. 나열 순서 중요하지 않다. 기본 출력에 전체 총계는 출력되지 않는다. NULL 혹은 0 사용하여 전체 총 합 출력 가능.
- ROLLUP(A, B): A별, (A, B)별, 전체 그룹 연산 결과 출력.나열 대상의 순서가 중요. 기본적으로전체 총 합 출력.
- CUBE(A, B): A별, B별, (A, B)별, 전체 그룹 연산 결과 출력. 그룹으로 묶을 대상의 나열 순서 중요하지 않다. 기본적으로 전체 총 합이 출력.
