개인적인 공부를 하고 난 후 작성 하는 글이므로 설명은 딱히 없습니다.
집합 연산자
- set 연산자라고도 하며, 종류는 UNION , UNION ALL, INTERSECT, MINUS가 존재한다.
UNION과 UNION ALL의 차이는 중복을 포함하는지 안하는지의 차이이다.
MINUS는 차집함
INTERSECT는 교집합
형식
SELECT goods
FROM exp_goods_asia
WHERE country = '한국'
MINUS
SELECT goods
FROM exp_goods_asia
WHERE contry = '일본'
위와 같으며 사용하고자 하는 집합 연산자를 변경하면 된다.
집합 연산자 제한사항
1. 집합 연산자로 연결 되는 각 SELECT 문의 SELECT 리스트의 개수와 데이터 타입은 일치해야 한다.
2. 집합 연산자로 SELECT 문을 연결할 때 ORDER BY 절은 맨 마지막 문장에서만 사용 할 수 있다.
3. BLOB, CLOB, BFILE 타입의 컬럼에 대해서는 집합 연산자를 사용할 수 없다.
4. UNION, INTERSECT, MINUS 연산자는 LONG형 컬럼에는 사용 할 수 없다.
ROLLUP / CUBE 절
- 그룹별 소계를 추가로 보여주는 역할을 한다.
그냥 그룹 지어 준 것과 ROLLUP을 사용한 것과는 다르다.
위와 같은 형태를 분할 ROLLUP이라고 표현한다. 위에서와는 다르게 전체 합계는 계산 되지 않는다.
CUBE절은 ROLLUP과 다르게 조합 가능한 수 만큼 집계를 한다는 점이 다르다.
ROLLUP은 레벨별로 순차적으로 집계하지만 CUBE절은 2의 (표현식 수)제곱으로 계산된다.
만약 CUBE( EX1, EX2, EX3) 라면 2의 3제곱인 8 가지를 계산한다.
실제 사용한 코드
SELECT employee_id, emp_name FROM EMPLOYEES WHERE salary > 5000; SELECT employee_id, emp_name FROM EMPLOYEES where salary > 5000 ORDER BY employee_id; SELECT employee_id, emp_name FROM employees WHERE salary > 5000 AND job_id = 'IT_PROG' ORDER BY employee_id; CREATE TABLE ex3_3( employee_id NUMBER, bonus_amt NUMBER DEFAULT 0); INSERT INTO ex3_3 (employee_id) SELECT e.employee_id FROM employees e, sales s WHERE e.employee_id = s.employee_id AND s.SALES_MONTH BETWEEN '200010' AND '200012' GROUP BY e.employee_id; SELECT * FROM ex3_3 ORDER BY employee_id; SELECT employee_id, manager_id, salary, salary * 0.01 FROM employees WHERE employee_id IN (SELECT employee_id FROM ex3_3); SELECT employee_id, manager_id, salary, salary * 0.001 FROM employees WHERE employee_id NOT IN (SELECT employee_id FROM ex3_3) AND manager_id = 146; MERGE INTO ex3_3 d USING ( SELECT employee_id, manager_id, salary, salary * 0.001 FROM employees WHERE manager_id = 146 ) b ON( d.employee_id = b.employee_id) WHEN MATCHED THEN UPDATE SET d.bonus_amt = d.bonus_amt + b.salary * 0.01 WHEN NOT MATCHED THEN INSERT (d.employee_id , d.bonus_amt) VALUES (b.employee_id , b.salary * 0.001) WHERE (b.salary < 8000); SELECT * FROM ex3_3 ORDER BY employee_id; SELECT ROWNUM, employee_id FROM employees; SELECT employee_id || '-' || emp_name AS employee_info FROM employees WHERE ROWNUM < 5; -- 비동등 연산자 != <> ^= 세가지가 존재하는데 세가지 반환 값 동일함. 문자형 날짜형도 비교 가능 SELECT employee_id, salary, CASE WHEN salary <= 5000 THEN 'C등급' WHEN salary > 5000 AND salary <= 15000 THEN 'B등급' ELSE 'A등급' END AS salary_grade FROM employees; --비교 조건식 ANY, SOME, ALL이 있다. SELECT employee_id, salary FROM employees WHERE salary = ANY(2000,3000,5000) ORDER BY employee_id;--or 연산자와 기능이 같다. SELECT employee_id, salary FROM employees WHERE salary = ALL(2000,3000,5000) ORDER BY employee_id;--AND 연산자와 같다 SELECT employee_id, salary FROM employees WHERE salary = SOME(2000,3000,5000) ORDER BY employee_id; SELECT employee_id, salary FROM employees WHERE salary IN (2000,3000,5000) ORDER BY employee_id; SELECT NVL(manager_id, employee_id) FROM employees WHERE manager_id IS NULL; --NVL(EX1,EX2,EX3) SELECT department_id, SUM(salary) FROM employees GROUP BY department_id ORDER BY department_id; SELECT period, gubun, SUM(loan_jan_amt) total_jan FROM kor_loan_status WHERE period LIKE '2013%' GROUP BY period, gubun ORDER BY period; SELECT period, gubun, SUM(loan_jan_amt) total_jan FROM kor_loan_status WHERE period LIKE '2013%' GROUP BY ROLLUP(period, gubun); SELECT period, gubun, SUM(loan_jan_amt) total_jan FROM kor_loan_status WHERE period LIKE '2013%' GROUP BY ROLLUP(period), gubun; SELECT period, gubun, SUM(loan_jan_amt) total_jan FROM kor_loan_status WHERE period LIKE '2013%' GROUP BY CUBE(period, gubun); SELECT period, gubun, SUM(loan_jan_amt) total_jan FROM kor_loan_status WHERE period LIKE '2013%' GROUP BY period,CUBE( gubun);
반응형
'DB > Oracle' 카테고리의 다른 글
SQL - Oracle vs ANSI SQL (0) | 2015.09.16 |
---|---|
조인을 써먹어 보자 - Join 이야기 (0) | 2015.08.29 |
Oracle 공부 이야기 - 테이블 스페이스 생성 및 계정 생성 (0) | 2015.08.11 |
Pseudo-Column이란? (0) | 2015.08.11 |
Merge SQL을 사용해보자. (0) | 2015.08.09 |