본문 바로가기

Study/데이터 베이스

[DBMS 강의 - 07] 테이블 조회_3

조인

* 굉장히 중요한 개념이지만 초보자가 보기에는 복잡한 측면이 있기 때문에 꼼꼼하게 읽을 필요가 있는 부분.

 

- 조인이란, n 개 이상의 테이블들을 합성한 후, 여기서 자신이 원하는 정보를 추출하는 일련의 연산을 말한다.

- 관계가 없는 테이블끼리의 조인도 가능하지만 비효율적이다.    

- 대부분의 경우에는 관계가 있는 테이블끼리 조인을 수행하고 이를 통해 통합적인 정보를 제공한다.

- 너무 많은 테이블끼리의 조인은 성능이 떨어진다.

- 조인에는 다양한 종류(크로스, 내부, 자연, 외부, 자체 등)가 있다.

- 조인은 사실 한 테이블 내에 모든 정보를 가지고 있으면 되지만 DB의 정규화를 하게 되면 데이터가 분할되기 때문에 불가피한 과정이다

 

 

 

크로스 조인

- 상호 조인이라고 불리우기도 한다

- 두 테이블을 서로 곱하는 개념의 연산으로 카디션 프로덕트(Cartesin Product)라고도 한다.

- 크로스 조인의 문법은 다음과 같다.

 SELECT column [ , ...n ] FROM table1 { CROSS JOIN table2 } [ , ...n ]

아래의 그림은 크로스 조인의 개념도인데, buyer 테이블과 orders 테이블의 모든 가능한 행들의 쌍을 연결하여 조인 테이블(buyer * order)을 만든다.

 

그러나 위의 조인들을 기게적으로 행들을 조합한것이기 때문에 아무런 의미가 없다. 생성된 조인 테이블에 buyer_id 열이 두 개가 있고, 값이 다르다는 것도 의미가 없다는 것을

보여준다.(이름은 같지만, 서로 다른 테이블에서 다른 용도로 사용하기 때문)

 

 

 

 

내부 조인

- 각 테이블에서 비교 연산자에 의한 조인 조건을 만족하는 행들만 조인 테이블에 포함시켜주는 것이다.

- 대부분의 경우 조인 하면 내부 조인을 말한다.

- 내부 조인의 문법은 다음과 같다.

SELECT column [ , ...n ] FROM table1  [[AS] alias 1]  {[ INNER ] JOIN table2  [[AS] alias 2] ON join_condition } [ , ...n ]

 

INNER : 생략 가능(위에서 말했듯이 대부분의 조인은 내부 조인)

join_condition : 비교 연산자 (=, <, >, <> 등)를 사용하는 연산식이다.

column : 여러개의 column를 사용할 경우 중복된 이름이 나타나지 않도록 열거애야 하면, 두 테이블에 같은 이름의 열들이 있을 경우에는 table.column의 형식으로 하여

 반드시 식별해야 한다.

 

위의 그림은 내부 조인의 개념도이다. buyer 테이블과 orders 테이블의 buyer_id가 일치하도록 조인 조건을 만들 경우,

buyer의 1행과 orders의 1,2행

buyer의 2행과 orders의 3,4행

들만 조인 테이블에 포함시켜 준다. 결과적 조인 테이블의 행 수는 자식 테이블(orders)의 행 수와 같다. 위의 그림 결과를 쿼리로 조회하고 싶다면 다음과 같은 쿼리를 이용하면 된다.

여기서 "buyer AS b", "orders AS o" 이 부분이 중요한데, 이는 해당 테이블 명을 쿼리에 자주 써야 할 상황에 보다 짧게 쓰기 위하여 사용하는 구문이다.

만일 AS를 쓰지 않으면 쿼리는 다음과 같이 길어진다.


반복되는 부분이 많아지기 때문에 상당히 비효율적인것을 알 수 있다.




외부 조인

- (내부) 조인 조건을 만족하지 않는 행까지 결과 집합에 표함시켜 돌려주는 특수한 조인이다. (주로 집계시 사용)

- 외부 조인에는 왼쪽 외부 조인, 오른쪽 외부 조인, 완전 외부 조인이 있다.

- 외부 조인의 문법은 다음과 같다.

SELECT column [ , ...n ] FROM table1  [ [AS] alias 1]  { { LEFT | RIGHT | NULL} [ OUTER ] JOIN table2 [ [AS] alias 2 ] ON join_condition } [ , ...n]

 

LEFT는 왼쪽, RIGHT는 오른쪽, FULL은 완전 외부 조인을 지정

OUTER : 생략할 수 있음 (LEFT, RIGHT, FULL은 생략 불가)

outer_join_condition : "table1.column1 { *= | =* | *=* } table2.column2"의 형식을 띤다.

 *= 연산자는 왼쪽,  =* 연산자는 오른쪽,  *=* 연산자는 완전 외부 조인을 지정한다.

 

 

위의 그림은 외부 조인의 개념도이다. product 테이블의 product_id가 3인 행은 조인 조건을 만족하지 않지만, 이 테이블이 외부 조인의 왼쪽에 있기 때문에 조인 테이블에 행이 포함되는 특권이 부여된다. 그러나 어디까지나 조인 조건을 만족하지 않기 때문에 이 행의 오른쪽 orders 테이블에 속하는 열 값에는 모두 NULL이 들어간다.

외부 조인 SQL 쿼리의 예제는 다음과 같다.

 

 

위의 쿼리는 product_name 열 값이 '수박'이 아니여야 한다는 것이 조인 조건의 일부이다. 그러나, 왼쪽 외부 조인 (LEFT OUTER JOIN)에 의해 이 조인 조건을 만족하지 않는

제품 행도 조인 테이블에 포함된다.

 

 

 

 

자체 조인

- 자기 자신의 테이블과 하는 조인이다.

- 흔하게 사용되지는 않지만, 같은 테이블의 서로 관련이 있는 행들을 조합해서 추출할 필요가 있을 때 종종 사용된다.

 

위의 그림은 자체 조인의 개념도이다. AdventureWorksLT 테이터베이스의 SalesLT.SalesOderDetail 테이블을 자체 조인의 대상으로 한다. 같은 테이블을 조인의 대상으로 했으므로 반드시 테이블의 별칭을 이용해야 하므로 a와 b로 별칭을 부여했다. 여기서는 같은 주문 내의 모든 주문 항목들을 찾는다.

예를 들어, 주문 71774의 주문 항목을 a 테이블에서 한 개 (110562), b 테이블에서 한 개 (110563) 찾아 조인 테이블의 한 행을 만든다.

 

라인 6의 조인 조건 "a.SalesOrderId = b.SalesOrderID"는 같은 주문을 찾기 우히ㅏㄴ 것이고, 라인 7의 추가적인 조인 조건 "a.SalesOrderDetailID < b.SalesOrderDetailID"는

같은 주문 내의 같은 주문 항목들을 추출하는 것을 방지하기 위한 것이다. '<' 연산자는 자체 조인에서 자주 사용되므로 잘 기억해야 한다.

 

실행 결과에서 주문 71780의 경우, a.SalesOrderDetailID에서110616 값이 계속 반복되는 것은 기계적으로 행을 만들기 때문이다.

 

 

  

   

 

 

'Study > 데이터 베이스' 카테고리의 다른 글

[DBMS 강의 - 09] 유니온  (0) 2014.04.22
[DBMS 강의 - 08] 하위 쿼리  (0) 2014.04.22
[DBMS 강의 - 06] 테이블 조회_2  (0) 2014.03.08
[DBMS 강의 - 05] 테이블 조회_1  (0) 2014.03.04
[DBMS 강의 - 04] 데이터 형식  (0) 2014.03.04