9월 14일 sql 정리 완성본

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







































댓글