개인적인 공부를 하고 난 후 작성 하는 글이므로 설명은 딱히 없습니다.
집합 연산자
- 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 |