DB/Oracle

DB 쿼리

RECORD :D 2018. 12. 25. 20:45


관계형 데이터베이스에서 SQL을 이용해 관계를 맺는 것을 '조인'이라고 합니다. 테이블 간의 연결 고리로 관계를 맺고 데이터를 추출하는 방법입니다. 테이블의 기본키와 외래키가 연결고리가 됩니다.


조인의 종류에 대해 알아보겠습니다. 조인은 크게 내부 조인과 외부 조인으로 구분이 됩니다. 


내부 조인에는 동등 조인, 세미 조인, 안티 조인, 셀프 조인이 있습니다. 

하나 하나 알아보겠습니다. 


동등 조인 

WHERE절에서 등호 연산자를 사용해 2개 이상의 테이블이나 뷰를 연결하는 조인입니다. 


세미 조인

서브 쿼리를 사용해 서브 쿼리에 존재하는 데이터만 메인 쿼리에서 추출하는 조인입니다. 

세미 조인은 최종 반환되는 메인 쿼리 데이터에 중복되는 건이 없습니다.




안티 조인

서브 쿼리의 B 테이블에는 없는 메인 쿼리의 A 테이블의 데이터만 추출하는 조인입니다.



셀프 조인

동일한 한 테이블을 사용해 조인하는 방법입니다. 



외부 조인

조인 조건에 만족하는 데이터 뿐만 아니라, 어느 한 쪽 테이블에 조인 조건에 명시된 컬럼에 값이 없거나 (NULL이라도) 해당 로우가 아예 없더라도 데이터를 모두 추출하는 것입니다.  데이터가 없는 테이블의 컬럼에 (+) 표시를 붙이는 방식이고 조인 조건이 여러 개일 때 모든 조건에 (+) 표시를 붙여야 합니다.




카타시안 조인

FROM절에는 2개 이상의 테이블이 명시되어 있지만 WHERE절에는 조인 조건이 없는 조인입니다.  결과는 두 테이블의 건수의 곱만큼 나오게 됩니다.



ANSI 조인

ANSI SQL 문법을 사용한 조인으로 조인 조건이 WHERE절이 아닌 FROM절에 위치하는 것입니다.


ANSI 내부 조인



ANSI 외부조인 

다음 코드를 보면 데이터가 더 많은 쪽이 왼쪽에 쓰여진 테이블(employees)이기 때문에 LEFT [OUTER] JOIN이라고 합니다.



CROSS 조인은 기존 카타시안 조인을 ANSI 조인에서 쓴 것입니다.



FULL OUTER 조인은 외부 조인의 하나로 ANSI 조인에서만 제공하는 것입니다. 두 테이블 모두 기준이 되어 부족한 것들까지 다 나오도록 하는 방식입니다. 



서브 쿼리

SQL 문장 안에서 보조로 사용되는 또 다른 SELECT문을 의미합니다. 서브 쿼리는 여러 개를 사용할 수 있습니다. 서브 쿼리를 구분해보면 다음과 같이 나눌 수 있습니다.


- 연관성이 없는 서브쿼리

  : 메인 쿼리와 조인 조건이 걸리지 않는 서브쿼리로 단지 순차적으로 처리 되는 경우

- 연관성이 있는 서브쿼리

  : 메인 테이블과 조인 조건이 걸린 서브쿼리


- 일반 서브쿼리(SELECT절)

- 인라인 뷰(FROM절)

- 중첩쿼리(WHERE절)

[출처] DB - 조인과 서브 쿼리|작성자 DeveloperBee



SQL을 작성하다 보면 테이블에 저장된 데이터를 원하는 목적에 맞게 집계해서 데이터를 추출해야 할 때가 많은데 이때 사용하는 것이 그룹 쿼리입니다.


그룹 쿼리란, 특정 항목별로 그룹을 지어 정보를 추출할 때 사용하는 SQL 구문으로 집계 함수와 GROUP BY절의 결합이라고 할 수 있습니다.


먼저 기본 집계 함수에 대해 알아보겠습니다.

우선 집계 함수란, 대상 데이터를 특정 그룹으로 묶은 다음 이 그룹에 대해 총합, 평균, 최댓값, 최솟값 등을 구하는 함수를 말합니다.


COUNT(expr)

쿼리 결과 건수, 즉 전체 로우 수를 반환하는 함수입니다. expr에 * 또는 컬럼명이 올 수 있고 NULL이 아닌 것만을 체크하게 됩니다.


DISTINCT

중복을 제거할 때 사용하여 유일한 값만을 조회하게 됩니다. 중복된 값을 제거하지만 NULL인 것도 하나로 체크하게 됩니다.


SUM(expr)

expr의 전체 합계를 반환합니다. expr은 숫자형만 올 수 있습니다.


AVG(expr)

expr의 평균 값을 반환합니다.


MIN(expr) / MAX(expr)

최솟값과 최댓값을 반환합니다.


VARIANCE(expr) / STDDEV(expr)

분산과 표준편차를 반환합니다. 분산이란 개별 값과 평균 값의 차이인 편차를 구해 이를 제곱하여 평균한 값을 의미합니다. 표준 편차는 이 분산 값의 제곱근을 의미합니다.


다음으로 GROUP BY절과 HAVING절에 대해 알아보겠습니다.


GROUP BY절이란, 

특정 그룹을 묶어 데이터를 집계하는 것을 말합니다. WHERE와 ORDER BY절 사이에 위치하며 그룹으로 묶을 컬럼명이나 표현식을 명시하게 됩니다. 집계함수가 아닌 컬럼과 집계함수를 같이 조회하는 경우 반드시 일반 컬럼은 GROUP BY절에 명시가 되어야 합니다.


HAVING절은 GROUP BY절 다음에 위치해서 GROUP BY한 결과를 대상으로 다시 필터를 거는 역할을 합니다.


GROUP BY절에서 그룹별 소계를 추가로 보여주는 역할을 하는 ROLLUP과 CUBE절이 있습니다. 이 절들에는 집계 함수를 제외한 컬럼 등의 표현식이 올 수 있습니다.


ROLLUP(expr1, expr2,...)은 명시한 표현식 수와 순서(오른쪽 -> 왼쪽)에 따라 레벨별로 집계한 결과를 반환합니다.


CUBE(expr1, expr2,...)는 명시한 표현식 개수에 따라 가능한 모든 조합별로 집계한 결과를 반환합니다.


추가적으로 분할(partial) ROLLUP과 분할 CUBE도 있습니다.


마지막으로 집합 연산자에 대해 알아보겠습니다.


집합 연산자란,

데이터 집합(쿼리 조건에 맞아 조회된 일련의 데이터)을 대상으로 연산을 수행하는 연산자로 여러 SELECT문을 연결해 또 다른 하나의 쿼리를 만드는 역할을 합니다.


UNION

합집합과 같은 의미로 각 집합 원소 (SELECT 결과)를 모두 포함한 결과를 반환합니다. 여기서 중복되는 값은 한번만 조회됩니다.


UNION ALL

UNION과 비슷하지만 중복되는 값을 각각 하나로 조회한 결과를 반환합니다.


INTERSECT

교집합과 같은 의미로 데이터 집합에서 공통된 항목만 추출한 결과를 반환합니다.


MINUS

차집합과 같은 의미로 한 데이터 집합을 기준으로 다른 데이터 집합과 공통된 항목을 제외한 결과만 추출하여 반환합니다.




집합 연산자를 사용할 때 제한 사항은 다음과 같습니다.

  - 집합 연산자로 연결되는 각 SELECT문의 SELECT 리스트의 개수와 데이터 타입 일치

  - 집합 연산자로 SELECT문을 연결할 때 ORDER BY절은 맨 마지막 문장에서만 사용 가능

  - BLOB, CLOB, BFILE 타입의 컬럼에 대해서는 집합 연산자를 사용할 수 없음

  - UNION, INTERSECT, MINUS 연산자는 LONG형 컬럼에는 사용할 수 없음


그 외 GROUPING SETS절이 있는데 이는 GROUP BY절에서 사용되고 UNION ALL 개념이 셨여 있다고 할 수 있습니다. 간단히 설명하면 GROUPING SETS(expr1, expr2, expr3)이면 세 표현식 별로 각각 집계가 이루어진다는 것입니다.