반응형

안녕하세요. 신기한 연구소입니다.

이번 포스팅은 그룹핑에서 유용하게 사용할 수 있는 함수들을 알아봅니다.

 

 

기본적으로 GROUP BY를 사용해서 데이터를 그룹핑하는 방법은 기존 포스팅에서

같이 알아봤습니다.

그 그룹핑된 결과를 그룹별로 소계, 총계를 구할 수 있는 함수가 있는데요.

바로 ROLLUP과 CUBE입니다.

 

ROLLUP 함수

 

ROLLUP 함수는 조건 컬럼의 중간 소계와 총합계를 만들어주는 함수입니다.

이렇게 멋진 함수가 있었다니..ㅎㅎㅎ

 

 

보통 이런 쿼리를 이용해서 그룹핑합니다.

하지만 동호회를 그룹핑해서 JOB의 소계를 구하고

전체 합계를 구하려면 별도로 쿼리를 작성해서 UNION 같은

연산자를 사용하거나 서브 쿼리를 사용하는 방법을 사용할 수 있지만

그렇게 만들면 점점 복잡해지고 쿼리양도 많아집니다.

 

ROLLUP 이미지

 

이런 경우 ROLLUP을 사용해서 편리하게 소계와 총계를 구할 수 있습니다.

GROUP BY 다음에 ROLLUP을 추가하고 소계와 총계를 원하는

컬럼을 구성하면 됩니다.

 

 

GROUP BY에서 컬럼의 구성에 따라 소계와 총계의 개념이 달라집니다.

 

 

컬럼이 많아지면 소계도 단계별로 생성됩니다.

 

CUBE 함수

 

CUBE 함수는 그룹핑한 컬럼에 대해 소계를 만드는데

설정한 컬럼에 대해 각각 소계를 보여주고 총계를 보여줍니다.

 

 

JOB에 대한 소계도 잘 표출하고 있습니다.

 

GROUPING SETS 함수

 

CLNAME 과 JOB에 대해 각각 소계를 구할 수도 있습니다.

 

GROUPING SETS에 CLNAME 과 JOB 컬럼을 사용하면

CLNAME에 해당하는 모든 취미의 합과

JOB에 해당하는 모든 취미에 대한 합을 보여줍니다.

집계 데이터를 가지고 원하는 컬럼에 대해 소계를 구하는데 제격이네요.

 

GROUPING 함수

 

지금까지 3가지 그룹 관련 함수를 확인했습니다.

해당 쿼리를 보면 SELECT문에 GROUING 함수를 볼 수 있습니다.

GROUPING 함수는 GROUP BY에 설정된 컬럼을 ARGUMENT로 넣은 경우

합계를 나타내는 행이 나오는 경우 결과로 1을 보여줍니다.

일반 합계는 0 해당 컬럼에 소계(총계)가 나오는 경우 1을 리턴합니다. 

 

 

이제 이 4가지 그룹 함수를 가지고

개발하면서 멋진 그룹 쿼리를 만들어 볼 수 있겠네요.

 

잘못된 정보나 수정이 필요하면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

SQL 개발을 하면서 자주 사용하는 방식 중 하나가 서브쿼리인데요.

조인, 함수 등을 이용해서 쿼리를 작성하기도 하지만

서브쿼리로 즉석 해서 원하는 데이터를 뽑아서 사용할 수 있습니다. 

 

 

서브쿼리는 크게 메인 쿼리의 컬럼과 연결해서 사용하는 연관성 있는 서브쿼리와

메인 쿼리와는 관계없이 독자적으로 사용하는 연관성 없는 서브쿼리가 있습니다. 

 

 

첫 번째 쿼리는 메인 쿼리의 clubno 컬럼과 조건절에서 조인을 해서 사용했습니다.

메인 쿼리와 연관을 지었기에 연관성 있는 서브쿼리가 됩니다.;

두 번째 쿼리는 조건절에 메인 쿼리의 어떤 컬럼과도 연관시킨 부분이 없습니다.

그러면 연관성 없는 서브쿼리가 되겠네요.

 

다음으로 사용 위치에 따라 부르는 명칭이 다른데요.

SELECT문에서 컬럼 역할로 사용하는 건 스칼라 서브쿼리로 부릅니다.

컬럼으로 사용하면 한 컬럼, 한 행 즉 딱 한 개의 값만 나와야 하기 때문입니다.

 

FROM절에서 사용하는 서브쿼리는 인라인 뷰(inline view)라고 하는데요.

일반적으로 VIEW는 사용 편의, 접근 권한, 내용에 대한 보안등으로 필요한 데이터만 보이도록

SQL문을 작성해서 VIEW를 만들어 마치 가상의 테이블처럼 FROM절에서 사용합니다.

VIEW를 만들어서 사용해도 되지만 간단하게 FROM절에서 테이블처럼 사용할 수 있게

서브쿼리를 사용할 수 있습니다.

그래서 뷰의 일종이기에 인라인 뷰라고 합니다.

 

WHERE절/HAVING절에서 사용하는 쿼리는 중첩 서브쿼리라고 합니다.

여기서 단일행, 다중행 방식의 서브쿼리를 만들 수 있는데요.

한 개의 값만 필요한 경우 단일행 서브쿼리가 되고

IN 등 여러 개의 값이 필요한 경우 다중행 서브쿼리가 되는 겁니다.

 

 

쿼리를 보면 AVG_SAL 컬럼을 서브쿼리로 작성했습니다.

서브쿼리 없이 그룹 함수인 AVG를 사용하려면 GROUP BY를 사용해야 하며

SET 연산자 등 다른 방법으로 복잡해 질 수 있습니다.

하지만 스칼라 서브쿼리를 사용하면서 한 줄로 간단하게 표현했습니다.

또한 메인 쿼리의 어떤 컬럼과도 조인하지 않고 자체 평균값만 보여주기에

연관성 없는 서브쿼리가 되겠네요.

 

 

위 두개의 쿼리를 비교해 보면 결과는 같지만 사용방법이 다릅니다.

첫번째는 조인을 했는데

실제 프로젝트에서 코드에 대한 명칭을 가져오는 컬럼이 다수 존재할 수 있습니다.

그렇다고 관련 테이블들을 전부 내부 조인을 사용한다면

엄청 복잡한 쿼리가 되고 가독성도 떨어질 겁니다.

또한 잘못 실수를 할 수도 있고 오류 찾기도 힘들 수 있거든요.

그런 경우 두번째 방식인 서브쿼리를 사용하면 편리하게 이용할 수 있습니다.

물론 자주 사용하는 경우라면 함수도 고려해 볼 수도 있습니다.

 

 

위 쿼리는 FROM 절에서 테이블을 대신해서 서브쿼리를 사용했습니다.

그룹 정보나 결합 정보 또는 다양한 조인을 통해서 정보를 얻어야 하는 쿼리를

인라인 뷰로 구성해서 조인을 사용할 수 있습니다.

 

 

WHERE 절 연산자에서 =, >, < 등은 단일행, 단일컬럼을 사용해야 합니다.

그렇지 않으면 오류가 발생합니다.

 

 

항상 서브쿼리를 사용해야 하는 EXISTS 입니다.

연결된 값이 존재하면 메인 쿼리의 행을 표출합니다.

WHERE 절의 조건에 맞는지 확인하는 구조여서 다중컬럼이니 다중행이니

따질 필요가 없답니다. 

 

 

위 쿼리를 보면 다중컬럼을 사용한 서브 쿼리임을 알 수 있습니다.

또한 IN은 여러 행의 데이터를 사용할 수 있기에 서브 쿼리 또한 다중행이 가능함을

알 수 있습니다.

다중컬럼을 사용하는 예를 들어봤는데요.

카드승인 후 매입이 발생하는데 시간이 좀 걸립니다.

위 쿼리는 승인만 한 데이터와 승인과 매입 접수가 된 데이터를 분리하기 위한

쿼리로 볼 수 있습니다.

승인만 했으면 조회가 안될 것이고 매입까지 발생했다면 조회가 되는 쿼리입니다.

 

그 외에도 HAVING절 START WITH절 등에서 서브 쿼리를 사용할 수 있습니다.

 

잘못된 정보나 수정이 필요하면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형