06장 SQL 그룹쿼리와 집합연산자 (오라클)
안녕하세요 jju_developer입니다.
오늘은 지난 시간에 이어서 오라클 SQL에 대해 소개하는 시간을 갖겠습니다.
< 지난시간 시간 복습 >
✔오라클 그룹 쿼리?
오라클에서 그룹 함수란?
하나 이상의 행을 그룹으로 묶어서 연산하기 위한 것입니다.
총합, 평균 등의 하나의 결과로 나타내고 싶을 때 사용할 수 있습니다.
예를 들어 해당 테이블 (EMP)에서 모든 사원의 SAL (연봉)의 평균을 구할 때에는
주의!!
단순 칼럼을 그룹 함수와 함께 쓸 수 없습니다.
✔GROUP BY?
각 행을 그룹으로 묶는 작업을 GROUP BY라고 합니다.
GROUP BY는 공통적인 데이터별로 묶어서 연산처리를 하고 싶을 때 사용합니다.
그렇게 되면 그룹 별 결괏값이 하나만 출력되겠죠?
쉽게 예를 들자면,
전체 회원 데이터에서 남-여 회원의 수 만 빼서 보고 싶을 때
이럴 때, count 함수와 GROUP BY를 함께 사용한답니다.
하지만, GROUP BY에 사용된 칼럼 이외의 칼럼은 단독으로 SELECT 절에 사용할 수 없습니다.
GROUP BY에 사용된 칼럼만 SELECT 절에 사용 가능하다는 것입니다!
추가적으로, GROUP BY 절에는 반드시 칼럼명이 와야 하고, alias는 사용이 불가합니다. alias는 무조건 ORDER BY 절에서만 사용 가능해요!
이렇게 그룹핑을 하게 된다면, 같은 부서의 넘버끼리 그룹이 되어 출력되는 것을 볼 수 있습니다.
만약, 부서별로 볼 때, MAX, MIN의 셀러리를 출력하는 대신 셀러리가 2000보다 크거나 같은 것만 출력해라
라고 한다면
여기서의 WHERE는 테이블에 관한 조건입니다.
그렇다면 GROUP에 조건을 준다면 어떻게 해야 할까요?
위와 똑같이 쓰되, WHERE와 HAVING만 변경해보겠습니다.
HAVING 절은 전체의 조건에 그룹으로 나온 결괏값에서 또 조건을 준 결과 값입니다.
GROUP BY를 사용할 때는 두 가지를 기억해야 합니다.
1. 특정 칼럼을 그룹화 하는 GROUP BY
2. 특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING
* WHERE이랑 HAVING을 헷갈려하시는 경우가 많은데
WHERE은 그룹화하기 전이고, HAVING은 그룹화를 한 후의 조건입니다.
✔집합 연산자?
no | 집합 연산자 | 내용 | JJU 내용 첨가 |
1 | UNION | 합집합 두 개 이상의 개별 SELECT 쿼리를 연결 개별 SELECT 쿼리 반환 결과가 중복될 경우 UNION 연산 결과는 한 로우만 반환됨 |
전체값 반환 중 중복된거 둘중 하나는 제거한 값 답:1+2+3 |
2 | UNION ALL | UNION과 유사 개별 SELECT 쿼리 반환 결과가 중복될 경우, 중복되는 건까지 모두 반환 |
중복 된거도 다 포함 답: 1+2+3+2 => A+B |
3 | INTERSECT | 교집합 두 개 이상의 개별 SELECT 쿼리를 연결 개별 SELECT 쿼리 반환 결과 중 공통된 항목만 추출 |
중복 된 것만 나옴 답: 2 |
4 | MINUS | 차집합 두 개 이상의 개별 SELECT 쿼리를 연결 개별 SELECT 쿼리 반환 결과 중 중복된 건을 제외한 선행 쿼리 결과 추출 |
A-B 두개의 값에서 하나 뺸거 답: 1+2-3 => A의 1 |
no | 집합 연산자 제한사항 |
1 | 개별 SELECT 쿼리의 SELECT 리스트 개수와 데이터 타입이 일치해야 한다. |
2 | ORDER BY 절은 맨 마지막 개별 SELECT 쿼리에만 명시 가능하다. |
3 | BLOB, CLOB, BFILE 타입의 컬럼에 대해서는 집합 연산자를 사용할 수 없다. |
4 | UNION, INTERSECT, MINUS 연산자는 LONG형 컬럼에는 사용할 수 없다. |
no | 생각 나는 대로 정리 | |
1 | 컬럼 | SELECT |
2 | 테이블 | FROM |
3 | 그룹핑 | GROUP BY |
4 | 정렬 | ORDER BY |
그럼 지금까지 SQL 그룹 쿼리와 집합 연산자! 오라클에 대한 설명을 마치겠습니다.
궁금한 점이나, 수정사항은 댓글 부탁드립니다 :)
감사합니다.