BASHA TECH

DB#CH05. 그룹 쿼리와 집합 연산자 이해 본문

Computer/DB

DB#CH05. 그룹 쿼리와 집합 연산자 이해

Basha 2022. 7. 28. 17:30
728x90

1. 기본 집계 함수

2. GROUP BY 절과 HAVING 절

3. ROLLUP 절과 CUBE 절

4. 집합 연산자

 

1. 기본 집계 함수

- COUNT(expr)

- SUM(expr)

- AVG(expr)

- MIN(expr) & MAX(expr)

- VARINACE(expr), STDDEV(expr)

 

2. GROUP BY 절과 HAVING 절

- SELECT 리스트에 있는 컬럼명이나 표현식 중 집계 함수를 제외하고는 모두 GROUP BY절에 명시해야한다.

- HAVING절은 GROUP BY절 다음에 위치. GROUP BY한 결과를 대상으로 다시 필터를 거는 역할을 수행함. 반드시 GROUP BY 뒤에 있어야함.

3. ROLLUP 절과 CUBE 절

- ROLLUP(expr1, expr2, ...)

 

4. 집합 연산자

- UNION : 합집합

- UNION ALL : 중복된 항목도 모두 조회되는 합집합

- MINUS : 차집합

  * 집합 연산자의 제한 사항

     > 집합 연산자로 연결되는 각 SELECT문의 SELECT 리스트의 개수와 데이터 타입은 일치해야 함.

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

     > CLOB (4G CHAR) 타입 컬럼에 대해서는 집합 연산자를 사용할 수 없다.

- GROUPING SETS절

 

>SQLGATE

SELECT COUNT(a.MANAGER_ID) -- NULL은 COUNT에서 제외됨
	FROM EMPLOYEES a
;

--DESC EMPLOYEES;

-- COUNT 하려는 컬럼에 NULL 유무를 확인해야함
SELECT COUNT(*) -- 전체 column을 따져본다 => 효과적 x
	FROM EMPLOYEES b
;

-- COUNT할 때 NULL이 없는 column을 선택하는 것이 좋다.
-- NULL 없는 column 선택 : NN, PK 칼럼

SELECT a.EMP_NAME, a.MANAGER_ID
		FROM EMPLOYEES a
 WHERE a.MANAGER_ID IS NULL -- NULL이 누군지 확인. 컬럼에 어떻게 부합해서 쓰이는지 파악해야함
;

DESC EMPLOYEES;

SELECT a.EMP_NAME, a.DEPARTMENT_ID
		FROM EMPLOYEES a
 WHERE a.DEPARTMENT_ID IS NULL
;

SELECT *
		FROM EMPLOYEES a
 WHERE a.DEPARTMENT_ID IS NULL
;

DESC EMPLOYEES;

SELECT COUNT(DISTINCT a.DEPARTMENT_ID)
  FROM EMPLOYEES a
;
DESC DEPARTMENTs;
-- 부서테이블 : departments
SELECT COUNT(a.DEPARTMENT_ID)
  FROM DEPARTMENTS a
;

SELECT DISTINCT a.DEPARTMENT_ID
  FROM EMPLOYEES a
 ORDER BY 1
;

/*
=================================
기간, 지역, 대출 잔액 데이터
1. 기간 : PERIOD => 7개
201111 201112 201210 201211 201212 201310 201311
2. 지역 : REGION => 17개, 시도까지
3. 구분 : GUNUN => 2개
기타대출, 주택담보대출
4. 대출 잔액 : LOAN_JAN_AMT, 단위 => 십억 (1000, 조)
전체 ROW : 238
===================================
*/
-- SELECT는 GROUP BY에서 만들어진 테이블에서 임시테이블을 생성할 뿐임
-- GROUP BY의 핵심! 임시 테이블!!!
-- 문제 : 2013년 지역별 가계대출 총 잔액
SELECT a.REGION
     , SUM(a.LOAN_JAN_AMT) AS tot_jan
  FROM KOR_LOAN_STATUS a
 WHERE a.PERIOD LIKE '2013%'
 GROUP BY a.REGION
 ORDER BY a.REGION
;

-- 문제 : 2013년 11월 지역별 총 잔액
SELECT a.PERIOD
      , a.REGION
     , SUM(a.LOAN_JAN_AMT) AS tot_jan
  FROM KOR_LOAN_STATUS a
 WHERE a.PERIOD = '201311'
 GROUP BY a.REGION, a.PERIOD
;

-- 문제 : 201311, 지역별 총 잔액, 100조 이상
-- 갯수로 확인이 안 된다. 값이 문제기 때문.
-- 2013년 경기도를 SUM해서 testing
SELECT a.REGION, SUM(a.LOAN_JAN_AMT) AS tot_jan
  FROM KOR_LOAN_STATUS a
 WHERE a.PERIOD = '201311'
 GROUP BY a.REGION
 HAVING SUM(a.LOAN_JAN_AMT) > 100000 -- a.LOAN_JAN_AMT는 HAVING에서 사용X, ORDER BY에서 사용O
 ORDER BY tot_jan
;

-- 문제: 2013년 기간별, 구분별 대출 총 잔액
-- 2013년 전체데이터 필터링 -> where
-- 기간, 구분 => group by
-- 기간 정렬
SELECT a.PERIOD
			,a.GUBUN
			,SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
	WHERE a.PERIOD LIKE '2013%'
	GROUP BY ROLLUP(a.PERIOD, a.GUBUN)
	ORDER BY a.PERIOD ASC
;

SELECT a.PERIOD
			,a.GUBUN
			,SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
	WHERE a.PERIOD LIKE '2013%'
	GROUP BY a.PERIOD, a.GUBUN
	ORDER BY a.PERIOD ASC
;

SELECT a.PERIOD
			,a.GUBUN
			,SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
	WHERE a.PERIOD LIKE '2013%'
	GROUP BY a.PERIOD, a.GUBUN
	ORDER BY a.GUBUN
;

SELECT a.PERIOD
			,a.GUBUN
			,SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
	WHERE a.PERIOD LIKE '2013%'
	GROUP BY a.PERIOD, a.GUBUN
	ORDER BY tot_jan DESC
;

SELECT a.PERIOD
     , a.GUBUN
     , SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
	WHERE a.PERIOD LIKE '2013%'
	GROUP BY a.PERIOD, ROLLUP(a.GUBUN)
;

SELECT a.PERIOD
			,a.GUBUN
			,SUM(a.LOAN_JAN_AMT) AS tot_jan
		FROM KOR_LOAN_STATUS a
 	WHERE a.PERIOD LIKE '2013%'
 	GROUP BY ROLLUP(a.PERIOD), a.GUBUN
;

CREATE TABLE exp_goods_asia(
  country VARCHAR2(10)
  ,seq number,
  goods VARCHAR2(80));

INSERT INTO exp_goods_asia VALUES ('한국', 1, '원유제외 석유류');
INSERT INTO exp_goods_asia VALUES ('한국', 2, '자동차');
INSERT INTO exp_goods_asia VALUES ('한국', 3, '전자집적회로');
INSERT INTO exp_goods_asia VALUES ('한국', 4, '선박');
INSERT INTO exp_goods_asia VALUES ('한국', 5, 'LCD');
INSERT INTO exp_goods_asia VALUES ('한국', 6, '자동차 부품');
INSERT INTO exp_goods_asia VALUES ('한국', 7, '휴대전화');
INSERT INTO exp_goods_asia VALUES ('한국', 8, '환식탄화수소');
INSERT INTO exp_goods_asia VALUES ('한국', 9, '무선송신기 디스플레이 부속품');
INSERT INTO exp_goods_asia VALUES ('한국', 10, '철 또는 비합금강');

INSERT INTO exp_goods_asia VALUES('일본',1,'자동차');
INSERT INTO exp_goods_asia VALUES('일본',2,'자동차 부품');
INSERT INTO exp_goods_asia VALUES('일본',3,'전자집적회로');
INSERT INTO exp_goods_asia VALUES('일본',4,'선박');
INSERT INTO exp_goods_asia VALUES('일본',5,'반도체웨이퍼');
INSERT INTO exp_goods_asia VALUES('일본',6,'화물차');
INSERT INTO exp_goods_asia VALUES('일본',7,'원유제외 석유류');
INSERT INTO exp_goods_asia VALUES('일본',8,'건설기계');
INSERT INTO exp_goods_asia VALUES('일본',9,'다이오드, 드랜지스터');
INSERT INTO exp_goods_asia VALUES('일본',10,'기계류');

COMMIT;

/**********************************
* 한국과 일본의 주요 10대 수출품 데이터
* 경쟁 제품, 우위 제품
***********************************/
-- 한국 주요 수출품
SELECT a.SEQ, a.GOODS
		FROM exp_goods_asia a
	WHERE a.COUNTRY = '한국'
	ORDER BY a.SEQ
;

--일본
SELECT a.SEQ, a.GOODS
 FROM exp_goods_asia a
 WHERE a.COUNTRY = '일본'
 ORDER BY a.SEQ
;

--오타 수정
UPDATE exp_goods_asia
	 SET goods = '다이오드, 트랜지스터'
 WHERE country = '일본'
   AND seq = 9;

UPDATE exp_goods_asia
	 SET goods = '자동차부품'
 WHERE country = '일본'
 	 AND seq = 2;

-- 두 나라의 주요 수출품은 무엇인가? => 16개
SELECT goods
	FROM exp_goods_asia
	WHERE country = '한국'
UNION -- 두개의 집합을 합칠 때 사용
SELECT goods
	FROM exp_goods_asia
	WHERE country = '일본'
; -- 4개의 품목이 겹침

SELECT goods
	FROM exp_goods_asia
	WHERE country = '한국'
UNION ALL -- 차집합(겹치는 부분)까지 모두 나타냄 => 사용할 이유가 없음
SELECT goods
	FROM exp_goods_asia
	WHERE country = '일본'
;

-- 겹치는 상품은 무엇인가? => 5개
--result: 선박 원유제외 석유류 자동차 자동차부품 전자집적회로
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '한국'
INTERSECT
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '일본'

-- 한국이 우위인 상품은 무엇인가? => 5개
-- LCD 무선송신기 디스플레이부속품 철또는비합금강 환식탄화수소 휴대전화
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '한국'
MINUS
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '일본'
;

-- 일본이 우위인 상품은 무엇인가? => 5개
-- 선박 원유제외석유류 자동차 자동차부품 전자집적회로
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '일본'
INTERSECT
SELECT goods
	FROM exp_goods_asia
	WHERE COUNTRY = '한국'
728x90
반응형

'Computer > DB' 카테고리의 다른 글

수정할 거임 0802  (0) 2022.08.02
DB#CH06. 조인과 서브쿼리 이해  (0) 2022.07.29
DB#CH04. SQL 함수 이해  (0) 2022.07.27
DB#CH03. SQL 문장 이해  (0) 2022.07.26
DB#CH02. 데이터베이스를 구성하는 객체 이해  (0) 2022.07.26
Comments