DB/Oracle

Oracle DBMS 함수 공부 이야기

seungdols 2015. 8. 14. 15:22


개인적인 공부를 하고 난 후 작성 하는 글이므로 설명은 딱히 없습니다.


집합 연산자 

- 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);





반응형