본문 바로가기

Database/SQL

[코테를 위한 Oracle 정리] 9. 테이블 JOIN

손에 잡히는 10분 SQL 12,13장 참고

동등 조인 : Equi-Join

두 테이블에 있는 공통 열의 값이 같은 것을 결과로 가져온다.

JOIN을 한 테이블은 실제로 존재하지 않는다. 객체(Entity)가 아니라는 뜻과 같다. 쿼리가 수행되는 동안에만 유지된다.

JOIN을 하려면 포함하려는 테이블과 그 테이블 사이의 관계를 명시하면 된다.

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

WHERE 절에 관계를 매치시키고 있다. JOIN 시에는 완전한 열 이름을 써서 테이블을 밝혀야 정확히 참조할 수 있다.

카티전 곱 : Cartesian Product = 상호 조인 : Cross Join

조인 조건 없이 테이블 관계에 의해 반환된 결과.
'첫 번째 테이블의 행수 * 두 번째 테이블의 행 수' 만큼의 결과가 검색되게 된다.
조인 조건절을 생략하거나 조인 조건이 잘못 설정될 경우 발생한다.

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;

이런 경우 이다.

내부 조인 : Inner Join

조인 타입을 표시할 때에는 다른 문법을 사용한다.

SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

동등 조인과 결과가 같다.

Oracle에서는 동등조인(Oracle JOIN)과 내부조인(ANSI JOIN) 둘 다 허용한다.

여러 개의 테이블 조인

SELECT prod_name, prod_price, vend_name, quantity
FROM Vendors, Products, OrderItems
WHERE Vendors.vend_id = Products.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num=20007;

이렇게 할 수 있다.

 

ANSI JOIN을 사용하면

select customers.cust_email
from orderitems inner join orders 
on orderitems.order_num = orders.order_num
inner join customers
on customers.cust_id = orders.cust_id
where orderitems.prod_id = 'BR01';

이런 식으로 작성할 수 있다.

 

조인할 수 있는 테이블의 수에 제한을 두지는 않지만 많은 자원을 소비하기 때문에 불필요한 테이블을 조인하지 않도록 주의를 기울여야 한다.