customer : 고객
cid : customer id
cnm L customer name
SELECT
FROM customer ;
product : 제품
pid : product id : 제품 번호
pnm : product name : 제품 이름
SELECT
FROM product;
cycle : 고객애음 주기
cid : customer id 고객 id
pid : product id 제품 id
day : COUNT , 수량
SEPECT *
FROM cycle;
SELECT *
FROM customer ;
실습 4번
SELECT *
FROM cycle
선생님풀이
ORACLE
SELECT customer.*, cycle.pid, cycle.day, cycle.cnt
FROM customer, cycle
WHERE customer.cid = cycle.cid
AND customer.cnm IN ('brown', 'sally');
ANSI-SQL
SELECT cid, cnm, cycle.pid, cycle.day, cycle.cnt
FROM customer NATURAL JOIN cycle
WHERE customer.cnm IN ('brown', 'sally');
SELECT cid, cnm, cycle.pid, cycle.day, cycle.cnt
FROM customer JOIN cycle USING ( cid )
WHERE customer.cnm IN ('brown', 'sally');
SELECT customer.cid, cnm, cycle.pid, cycle.day, cycle.cnt
FROM customer JOIN cycle ON ( customer.cid = cycle.cid )
WHERE customer.cnm IN ('brown', 'sally');
관계선 클릭하면 : 두 테이블 컬럼 빨강, 파랑 두개 컬럼으로 연결되어 있다.
부모자식간의 관계
customer 와 cycle 사이에는 customer 가 부모관계 cycle은 자식
조인을 하면 자식쪽으로 맞춰줌
- SQL 은 실행에 대한 순서가 없다.
조인할 테이블에 대해서 FROM 절에 기술한 순으로 테이블을 읽지 않음.
FROM customer, cycle, product 라고 써놔도 오라클이 읽는 순서는 변경 될 수 있다.
어떻게 실행됬는지 추적하는 방법
EXPLAIN PLAN FOR 를 쓰면 어떻게 설명되어 있는지 나온다.
테이블위에 쓰고 컨트롤 엔터
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY); 이걸 하면
어떻게 실행됬는지 나온다.
OUTER JOIN 자주 쓰이지는 않지만 중요하다.
JOIN 구분
1. 문법에 따른 구분 : ANSI 냐 ORACLE이냐
2. JOIN의 형태로 구분 : SELF JOIN, NONEQUI-JOIN , CROSS-JOIN
3. 조인 성공여부에따라 데이터 표시 여부
: INNER JOIN : 조인이 성공했을 때 데이터를 표시
: OUTER JOIN : 조인이 실패해도 기준으로 정한 테이블의 컬럼정보는 표시
( ppt JOIN 종류
Outer join
컬럼 연결이 실패해도 기준이 되는 테이블의 데이터가 나오도록
left outer join
right outer join
full outer join ( left + right)
SELECT a.empno, a.ename, b.empno , b.ename
FROM emp a , emp b
WHERE a.mgr = b.empno
KING(PRESIDENT) 의 경우 MGR 컬럼의 값이 NULL이기 때문에 조인에 실패.
->13건이 나온다.
조인에 실패하더라도 왼쪽에 있는 세개 값이 나오는데 manager 는 null 값이었고 manager 네임은 없었으니까 null로 나온다.
left outer 냐 right outer 냐 는 방향성이다.
행에 대한 제한 조건을 기술시 where 절에 기술 했을때와 on 절에 기술 했을때 결과가 다르다
OUTER 조인에서는 ON 절에다가 쓰는것과 WHERE 절에다가 조건을 쓰는것이결과가 달라짐
- OUTER JOIN : 데이터가 없는 쪽의 컬럼에 + 기호를 붙인다.
데이터가 없는 쪽 : ANSI SQL 에서는 기준 테이블 반대편쪽 테이블의 컬럼에 + 을 붙인다.
WHERE 절 연결 조건에 적응
사번, 사원의 이름, 관리자 사번, 관리자 이름
KING(PRESIDENT) 의 경우 MGR 컬럼의 값이 NULL이기 때문에
조인에실패 ==> 13건의 조회
SELECT e.empno, e.ename, e.mgr, m.ename
FROM emp e, emp m
WHERE e.mgr = m.empno ;
ANSI-SQL
SELECT e.empno, e.ename, e.mgr, m.ename
FROM emp e JOIN emp m ON (e.mgr = m.empno ) ;
ANSI - SQL
SELECT e.empno, e.ename, e.mgr, m.ename
FROM emp e LEFT OUTER JOIN emp m ON ( e.mgr = m.empno ) ;
ORACLE - SQL : 데이터가 없는 쪽의 컬럼에 (+) 기호를 붙인자
ANSI-SQL 기준 테이블 반대편 테이블의 컬럼에 (+) 를 붙인다.
WHERE 절 연결 조건에 적용
SELECT e.empno, e.ename, e.mgr, m.ename
FROM emp e , emp m
WHERE e.mgr = m.empno(+) ;
댓글
댓글 쓰기