본문 바로가기

SQL + PL/SQL/SQL

JOIN



JOIN



여러 테이블을 조합해서 흩어져있는 정보를 조합, 사용자가 필요한 정보가 가져와 조회할 수 있게 하는 기능

ORACLE JOIN

ANSI JOIN




1. 카티션 곱 (Cartesian Prodcut) = CROSS JOIN

WHERE 절에 조건을 기입하지 않거나, 잘못 기술되어 있는 경우,

join 작업에 참조되는 테이블 행 수, 즉 row 수 들을 곱한 값의 결과가 만들어 짐 (null 값은 제외)


문법:

SELECT 테이블이름약자1.칼럼이름1, 테이블이름약자2.칼럼이름2

FROM 테이블이름1 테이블이름약자1, 테이블이름2 테이블이름약자2


SELECT 테이블이름약자1.칼럼이름1, 테이블이름약자2.칼럼이름2

FROM 테이블이름1 테이블이름약자1 

CROSS JOIN 테이블이름2 테이블이름약자2





2. Equi Join = 등가 JOIN

WHERE 절에 기술되는 JOIN, 양쪽 테이블에 같은 조건이 존재할 경우의 값만 출력


문법:

SELECT 테이블이름약자1.칼럼이름1, 테이블이름약자2.칼럼이름2

FROM 테이블이름1 테이블이름약자1, 테이블이름2 테이블이름약자2

WHERE 양쪽테이블에존재하는같은조건


SELECT 테이블이름약자1.칼럼이름1, 테이블이름약자2.칼럼이름2

FROM 테이블이름1 테이블이름약자1 

JOIN 테이블이름2 테이블이름약자2

ON 양쪽테이블에존재하는같은조건


보면 알수있듯이

ORACLE JOIN --> ANSI JOIN

콤마 , 대신 JOIN

WHERE 대신 ON 

을 쓴다.


테이블이 3개이거나 WHERE절에서 조건이 추가되는 경우 

ORACLE JOIN 에서는 AND 를 붙여서 추가를 하면 되고,

ANSI JOIN 에서는 좀 다름

FROM 절에서 테이블 3개를 몽땅 다 쓰는게 아니라

FROM A JOIN B

ON 조건1

JOIN C

ON 조건2

이런식으로 하나씩 연결 해줘야함쉬먀


조건이 더 생기면 AND 로 연결 후 조건 써주면 됨.




3. Non-Equi Join = 비등가 JOIN

같은 조건이 아닌 크거나 작은 조건으로 Join을 수행할 때


문법은 Equi Join 과 똑같지만, 필요에 따라서 GROUP BY 절을 써야할 때도 있음.

당연히 조건은 = 을 쓰지 않는다. between이나 비교연산자를 사용.





4. Outer Join

한쪽테이블에는 데이터가 있고 다른 한쪽 테이블에는 없을 때, 데이터가 있는 쪽 테이블의 내용을 전부 출력

즉, 없는 것도 같이 뽑아내준다. (equi join 이나 non equi join 은 이와는 반대, 그래서 INNER JOIN 이라고도 함)

싹 다 읽어야 하기 때문에 속도가 느림...


문법: 

쓰는 법은 다른 JOIN 문법과 똑같지만

ORACLE JOIN 에서는

데이터가 없는 테이블에 (+) <- 이걸 붙여줘야 함

ANSI JOIN 은

FROM 절에서 LEFT/RIGHT OUTER JOIN 으로 테이블들 사이에 써주기.

조건절 (ON 쓰는 절) 에서 데이터가 없는 테이블이 왼쪽에 위치하면 LEFT, 오른쪽이면 RIGHT


두가지 OUTER JOIN 을 합칠 경우에는

ORACLE JOIN 에서는

다른 방법이 없음, 그냥 두가지 JOIN을 쓰고 사이에 UNION으로 엮어주는 수 밖에..

양쪽에 (+)를 쓸 경우 에러남.

ANSI JOIN 은

FROM 절 테이블 사이에 FULL OUTER JOIN을 써주면 됨!





5. SELF JOIN

원하는 데이터가 하나의 테이블에 다 있을 경우 사용

하나의 테이블을 두 번 사용하게끔 설정해 놓고 하면 된다.

FROM 절에서 테이블 쓸때

테이블1 A, 테이블1 B

이런식으로 내용은 같지만 다른 테이블 2개라고 해놓고 작업






'SQL + PL/SQL > SQL' 카테고리의 다른 글

DML  (0) 2013.01.13
SUB QUERY - 서브쿼리  (0) 2013.01.04
SQL 그룹함수  (0) 2013.01.04
SQL 단일 행 함수 - 문자함수  (0) 2012.12.23
SQL - SELECT  (0) 2012.12.23