2011년 6월 29일 수요일

[Oracle.5]SQL - Join, Subquery, Group by 확장, 계층적 질의

1. JOIN
하나 이상의 테이블에서 데이터를 얻고자 한다면 테이블의 수만큼 질의문을 작성해야 한다. 하지만 JOIN을 이용하여 하나의 질의문에서 하나이상의 테이블의 데이터를 얻을 수 있다.
1) SELECT FROM 을 이용한 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2
WHERE 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
양쪽 칼럼에 동일하게 있는 칼럼을 WHERE절에서 같다는 조건을 추가 시킨다.
2) JOIN절을 사용한 명시적 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
JOIN 테이블이름2
ON 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
FROM절에 JOIN을 명시하였고 ON절에 두 테이블이 JOIN하기 위한 조건을 정의 하였다.
3) 3개 이상의 테이블 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2, 테이블이름3
WHERE 테이블이름1.칼럼이름1 = 테이블이름2.칼럼이름1
  AND 테이블이름1.칼럼이름2 = 테이블이름3.칼럼이름2;
4) OUTER JOIN
OUTER JOIN은 조건(ON)을 만족하는 행뿐만 아니라 특정 테이블을 지정하여 만족하지 않은 경우도 질의의 결과로 포함하고자 할 때 사용합니다.
1)SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
LEFT OUTER JOIN 테이블이름2
ON 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
2) SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2
WHERE 테이블이름1.칼럼이름(+) = 테이블이름2.칼럼이름;
하나 이상의 테이블로부터 질의문을 작성할 때는 다음과 같은 습관을 가져야 한다.
1) 요구하는 정보는 무엇인가?
2) 요구하는 정보를 어느 테이블로부터 가져와야 하는가?
3) 어떤 칼럼이 해당하는 정보를 가지고 있는가?
2. Subquery
하나의 질의문에 두개의 SELECT절을 사용한다.
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
WHERE 칼럼이름 = (SELECT 칼럼이름 FROM 테이블이름2)
최종경과를 출력하는 SELECT절을 MAIN Query라고 하고 ()안의 질의는 MAIN Query에 상대되는 개념으로 Subquery라 한다. Subquery의 수행결과가 Main Query에 넘겨져 최종 결과가 출력 횐다.
Ex)
SQL > SELECT employee_id, last_name, salary
      FROM employees
      WHERE salary > ( SELECT AVG(salary) FROM employees );
SQL > SELECT employee_id, last_name, job_id, salary
      FROM employees
      WHERE ( job_id, salary ) IN (SELECT job_id, MAX(salary) FROM employee GROUP BY job_id);
3. GROUP BY 절의 확장
1) GROUP BY ROLLUP
SELECT 칼럼이름, 계산식, 함수
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[GROUP BY ROLLUP 그룹화할 조건 나열]
[HAVING 그룹함수 걸러내기 위한 사용
[ORDER BY 최종 결과의 정렬에 사용될 조건 나열]
GROUP BY ROLLUP (A, B, C) 하면 우측부터 하나씩 제외해 가면서 그 결과를 반환한다.
1. A, B, C 
2. A, B 
3. A 
4. 전체
2) GROUP BY CUBE
SELECT 칼럼이름, 계산식, 함수
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[GROUP BY CUBE 그룹화할 조건 나열]
[HAVING 그룹함수 걸러내기 위한 사용
[ORDER BY 최종 결과의 정렬에 사용될 조건 나열]
GROUP BY CUBE (A, B, C) 하면 존재하는 모든 경우의 수에 대해 그룹을 지어준다.
1. A, B, C 
2. A, B 
3. B, C 
4. A, C 
5. A
6. B
7. C
8. 전체
3) GROUP BY GROUPING SETS
GROUPING SET ROLLUP CUBE와는 다르게 원하는 집계만 뽑아 결과를 얻을 수 있다.
CUBE(A, B, C)  GROUPING SETS으로 표현하면
GROUPING SETS( (A,B,C), (A,B), (A,C), (B,C), (A), (B), (C), () ) 이다.
만약 (A,B)별 집계와 (B,C)별 집계만 필요하다고 하면, GROUPING SETS( (A,B), (A,C) ) 를 사용하면 효과적으로 필요한 연산만 수행할 수 있다.
4. 계층적 질의
SELECT [LECEL], 칼럼이름, 계산식, 함수 
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[START WITH 계층의 시작점이 될 행을 구별하는 논리식 표현]
[CONNECT BY 계층을 구성할 때 사용될 논리식 표현]
1) START WITH
완성된 계층의 중심을 설정하기 위해 사용되는 절이다. 생략이 가능하고, 생략하면 각각의 행이 중심이 되는 계층적 질의가 수행된다.
2) CONNECT BY
상위 계층의 행과 하위 계층의 행을 연결하는 규칙을 지정하는 절이며 생략할 수 없다.
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID 또는
CONNECT BY EMPLOYEE_ID = MANAGER_ID 와 같은 형태로 사용된다.
3) 실행 순서
1. START WITH
2. CONNECT BY
3. WHERE
계층적 질의에서는 SYS_CONNETCT_BY_PATH 함수를 사용할수 있으며, 부모 계층을 나타내지 않게 되면 하위 계층도 나오지 않게 된다. 또한, ORDER BY GROUP BY 절은 정력순서를 훼손하기 때문에 사용해서는 안된다



*** 참조 문헌 : 10g로 시작하는 오라클 SQL & PL/SQL - 4장 데이터 얻기 한 걸음 더 내딛다

댓글 없음:

댓글 쓰기

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...