본문 바로가기
Oracle SQL

조인

by Nowkeeh Ahc

조인 (Join)은 조건에 따라 혹은 조건 없이 테이블을 좌, 우로 결합하여 결과 테이블을 출력하게 된다. 오라클에서는 표준 SQL에 해당하는 ANSI 조인 방식과 오라클 사에서 자체적으로 규정한 오라클 조인 방식 두 가지를 사용할 수 있다.

 

내부 조인

 내부 조인 (Inner Join)은 두 개의 테이블을 조인 조건에 맞게 결합하여 새로운 결과 테이블을 생성한다. 조인 조건은 동등 조건 형식으로 두 테이블에 동시에 존재하는 값을 사용하거나, 비 동등 형식으로 범위를 지정하여 해당하는 값을 매칭시키기도 한다.

 오라클 SQL의 내부 조인 문법은 다음과 같다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명 = 테이블2.컬럼명;

 FROM 절에 조인할 두 테이블을 나열하고 WHERE 절에 내부 조인의 기준이 되는 컬럼을 명시한다.

 ANSI 조인 에서는 FROM 절에 결합할 두 테이블 사이에 JOIN이라고 적어주고, 조건 절에는 WHERE 대신 ON 키워드를 사용한다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1 JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명;

 ex. 고객 테이블과 구매 테이블에 대해 고객ID를 기준으로 결합하여 고객ID, 고객명, 고객전화번호, 구매일을 출력하라. 먼저 오라클 조인의 내부 조인 코드는 다음과 같다.

SELECT C.고객ID, C.고객명, C.고객전화번호, O.구매일
FROM 고객 C, 구매 O 
WHERE C.고객ID = O.고객ID;

 

외부 조인

 외부 조인 (Outer Join)은 조인하는 여러 테이블에서 한 쪽에는 데이터가 있고, 다른 한 쪽에는 데이터가 없는 경우 데이터가 있는 테이블의 내용을 모두 출력하는 것이다. 즉, 양쪽 테이블 모두에 데이터가 있어야 한다는 조건에 맞지 않더라도 해당하는 행을 출력하고 싶을 때 사용할 수 있다.

 

Left Outer Join

 왼쪽 외부 조인 (Left Outer Join)은 테이블 결합 시 왼쪽 테이블을 기준으로 결합한다는 의미이다. , 조인 조건에 맞는 왼쪽 테이블의 내용을 모두 가져온 후, 오른쪽 테이블의 데이터를 매칭하되, 오른쪽 테이블에서 매칭되는 데이터가 없는 경우 널 값을 표시하는 것이다. 오라클 SQL의 왼쪽 외부 조인 문법은 다음과 같다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명 = 테이블2.컬럼명(+);

 왼쪽 외부 조인이 내부 조인과 다른 점은 WHERE 절 항등식의 오른쪽 항에 (+)를 붙여준다는 것이다. 왼쪽 테이블에 의해 오른쪽 테이블 값에 널 값이 생기는 것까지 더해서 출력하라는 의미이다. ANSI 조인의 왼쪽 외부 조인 문법은 다음과 같다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1 LEFT OUTER JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명;

 ANSI 조인의 왼쪽 외부 조인은 FROM 절에 나열한 테이블명 사이에 LEFT OUTER JOIN이라고 명시해주고 WHERE ON으로 바꾸면 된다.

ex. 구매 테이블과 지점 테이블을 결합하여 고객ID, 총구매가격, 지점코드, 지점명, 지점주소를 추출하여라. , 구매 테이블에 지점코드가 없더라도 함께 출력하여라.

SELECT P.고객ID, P.총구매가격, B.지점코드, B.지점명, B.지점주소
FROM 구매 P, 지점 B
WHERE P.지점코드 = B.지점코드(+);

 

Right Outer Join

 오른쪽 외부 조인 (Right Outer Join)은 테이블 결합 시 오른쪽 테이블을 기준으로 결합한다는 의미이다. , 조인 조건에 맞는 오른쪽 테이블의 내용을 모두 가져온 후, 왼쪽 테이블의 데이터를 매칭하되, 왼쪽 테이블에서 매칭되는 데이터가 없는 경우 널 값을 표시하는 것이다. 오라클 SQL의 오른쪽 외부 조인의 문법은 다음과 같다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명(+) = 테이블2.컬럼명;

 코드를 보면 왼쪽 외부 조인과 반대로 왼쪽 테이블의 컬럼 조건에 (+)가 붙었다. , 오른쪽 테이블에 의해 왼쪽 테이블에 널 값이 생기더라도 그 널 값까지 포함하여 출력한다는 의미이다. ANSI 조인의 오른쪽 외부 조인 문법은 다음과 같다.

SELECT 테이블 {1, 2}.컬럼명
FROM 테이블1 RIGHT OUTER JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명;

 ANSI 조인의 오른쪽 외부 조인은 FROM 절의 두 테이블 사이에 RIGHT OUTER JOIN이라고 명시해주고 WHERE ON으로 바꾸면 된다.

ex. 상품공급 테이블과 공급사 테이블을 결합하여 상품코드, 공급사ID, 회사명, 대표자명을 출력하여라. , 상품공급 테이블에 없는 공급사ID도 함께 출력하여라.

SELECT PS.상품코드, PS.공급사ID, S.회사명, S.대표자명
FROM 상품공급 PS, 공급사 S  
WHERE PS.공급사ID(+)= S.공급사ID;

 

Full Outer Join

 전체 외부 조인 (Full Outer Join)은 왼쪽 외부 조인의 결과값과 오른쪽 외부 조인의 결과값을 모두 합쳐서 나타낸 것이다. 따라서, 오른쪽 테이블에 널 값이 생기든, 왼쪽 테이블에 널 값이 생기든 상관없이 결합된 조인 결과가 모두 출력된다. 그러나, 전체 외부 조인 기능은 ANSI SQL에서만 제공한다. 오라클에서 전체 외부 조인을 수행하려면 양쪽의 외부 조인을 각각 실행하는 SELECT문을 UNION 함수를 통해 강제적으로 결합해주어야 한다. ANSI 조인의 전체 외부 조인 문법은 다음과 같다.

SELECT 컬럼명
FROM 테이블1 FULL OUTER JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명;

ex. 전체 외부 조인 기능으로 상품공급 테이블과 공급사 테이블을 공급사 ID로 결합하여 상품코드, 공급사ID, 회사명, 대표자명, 사업자번호를 출력하라.

SELECT PS.상품코드, PS.공급사ID, S.회사명, S.대표자명, S.사업자번호
FROM 상품공급 PS FULL OUTER JOIN 공급사 S  
ON PS.공급사ID = S.공급사ID;

언급한 바와 같이 전체 외부 조인을 오라클 조인에서 사용하려면 왼쪽 외부 조인과 오른쪽 외부 조인의 코드를 UNION 함수로 결합해야 한다. UNION 함수를 사용한 전체 외부 조인 코드는 다음과 같다.

SELECT PS.상품코드, PS.공급사ID, S.회사명, S.대표자명, S.사업자번호
FROM 상품공급 PS, 공급사 S  
WHERE PS.공급사ID(+) = S.공급사ID
UNION
SELECT PS.상품코드, PS.공급사ID, S.회사명, S.대표자명, S.사업자번호
FROM 상품공급 PS, 공급사 S  
WHERE PS.공급사ID = S.공급사ID(+);

 

자가 조인

 자가 조인 (Self Join)은 동일한 테이블 간의 조인한 결과를 출력한다. 따라서 FROM 절에 동일한 테이블 2개를 나열하면 자가 조인이 성립된다. 자가 조인은 같은 테이블에서 동일한 혹은 비교 조건을 사용하여 필요한 값을 추출할 때 사용한다. 오라클 조인에서의 자가 조인 문법은 다음과 같다.

SELECT 별명.컬럼명
FROM 테이블1 [AS] “별명”, 테이블 1 [AS] “별명
WHERE 별명.컬럼명 = 별명.컬럼명;

 ANSI 조인에서의 자가 조인 문법은 다음과 같다.

SELECT 별명.컬럼명
FROM 테이블1 [AS] “별명” JOIN 테이블 1 [AS] “별명
ON 별명.컬럼명 = 별명.컬럼명;

 ex. 고객ID 'C0050'인 고객이 주문상품을 받지 못했다는 클레임을 제기했다. 고객 테이블을 자가 조인하여 고객ID 'C0050'인 고객과 동명이인이 있는지 찾아 고객 ID, 고객명, 성별, 멤버십 등급을 출력하여라.

SELECT A.고객ID, A.고객명, A.성별, A.멤버십등급 
FROM 고객 A, 고객 B
WHERE A.고객명 = B.고객명
AND B.고객ID = 'C0050';

 


This post was written based on what I read and studied the book below.

http://www.yes24.com/Product/Goods/99002458

댓글