동등 조인과 비동등 조인
동등 조건과 범위 조건의 조인, 조인 조건 개수 및 세 테이블 연결과 조인 후 집계
#핵심 요약
오라클 조인 문법은 네 가지임
equi join(조인 조건이 등호), non equi join(등호가 아닌 조건), outer join(equi join으로 볼 수 없는 결과를 볼 때), self join(자기 자신과 조인)
Oracle 문법 조인은 FROM 절에 테이블을 쉼표로 나열하고 WHERE 절에 조인 조건을 반드시 씀
조인 조건 개수는 테이블 개수 - 1임
조인 조건이 없으면 두 테이블의 카티션 곱(모든 행 조합)이 나옴
월급 등급처럼 범위로 이을 때는 e.sal BETWEEN s.losal AND s.hisal 같은 비동등 조건을 씀
#개념과 동작 원리
조인 쿼리의 두 테이블에 조인 조건이 없으면 Oracle은 카티션 곱을 돌려줌
카티션 곱이 꼭 필요한 경우가 아니면 항상 조인 조건을 넣으라고 권함
실습에서는 테이블 별칭(emp e, dept d)을 붙이고 컬럼 앞에 별칭을 써서 어느 테이블의 컬럼인지 밝혔음
| 조인 | 조인 조건 예 | 실습 테이블 |
|---|---|---|
| equi join | e.deptno = d.deptno |
emp, dept |
| non equi join | e.sal BETWEEN s.losal AND s.hisal |
emp, salgrade(등급, 최저, 최고 월급) |
#필수 명령어 또는 SQL
#실습 테이블
CREATE TABLE salgrade
( grade NUMBER(10),
losal NUMBER(10),
hisal NUMBER(10) );
INSERT INTO salgrade VALUES (1, 700, 1200);
INSERT INTO salgrade VALUES (2, 1201, 1400);
INSERT INTO salgrade VALUES (3, 1401, 2000);
INSERT INTO salgrade VALUES (4, 2001, 3000);
INSERT INTO salgrade VALUES (5, 3001, 9999);
COMMIT;결과 해석:
실습에서는 앞에 DROP TABLE salgrade를 두었음
같은 이름의 테이블이 있으면 지워짐
#equi join
SELECT e.ename, d.loc, e.deptno
FROM emp e, dept d
WHERE e.deptno = d.deptno;
SELECT e.ename, e.sal, d.loc, e.job
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.job = 'SALESMAN';결과 해석: 개별 실행 출력은 기재 없음
#non equi join과 세 테이블 조인
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT e.ename, e.sal, d.loc, s.grade
FROM emp e, dept d, salgrade s
WHERE e.deptno = d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;결과 해석: 세 테이블이라 조인 조건이 두 개임(dept - emp - salgrade)
#조인 후 집계
SELECT d.loc, SUM(e.sal)
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY d.loc;결과 해석:
실습 총정리 문제(답 확인 불가): 부서 위치별 최대, 최소, 합계 월급, 부서 위치별 합계를 가로로, 부서 위치별 이름 나열, 부서 위치별 합계와 맨 아래 전체 합계
각각 집계 함수와 그룹별 조회, 문자열 집계와 피벗, 다차원 집계의 문법을 조인 결과에 적용하는 과제임
#업무형 실습
실습에서는 쇼핑몰 고객, 상품, 주문 테이블(고객번호, 고객 이름, 등급, 지역 / 상품번호, 상품명, 분류, 가격 / 주문번호, 고객번호, 상품번호, 주문일, 수량, 금액)을 만들고 "서울 지역 고객 중 결제금액 5만 원 이상 주문을 금액 내림차순으로" 같은 문제를 냈음
비회원 주문은 고객번호가 NULL이라 equi join 결과에서 빠짐(스크립트 주석 "비회원" 기준)
이런 행까지 보려면 OUTER JOIN을 씀
가격 등급 테이블(price_grade: 등급, 최저, 최고 가격)로 상품 가격 등급을 매기는 non equi join 문제도 있음
실습 예상 결과에는 등급이 1~4 숫자로 적혀 있지만 테이블 값은 BRONZE, SILVER, GOLD, VIP임