JOINs 


Concept

What is 'JOIN'?

  • 두 테이블(혹은 view)의 결과 row들을 하나의 결과 row들로 결합하는 과정을 Join이라 한다.
    이 때, 결합하는 과정에서 조건 이 존재할 수 있는데, 이를 'Join 조건' 이라 한다.
  • 일반적으로 Join의 처리과정은 Tree 형태로 표현한다.
  • Join의 Tree에서, Join의 하위 노드 중 왼쪽 노드를 'Outer node', 오른쪽 노드를 'Inner node'라 한다..

https://www.lucidchart.com/publicSegments/view/8efab5c8-84d3-443c-8d78-d73308bb64e9/image.png 

Various Types of Joins

정말 다양한 Join의 종류가 있지만, 

1. Cross Join
2. Inner Join
3. Outer Join
4. Semi Join
5. Anti Join

이 5가지를 먼저 살펴보자.

또한 설명에 사용될 테이블( t1, t2 )

SQL>


SELECT * FROM t1; A B - - 1 a 2 b 2 rows selected.


SQL>


SELECT * FROM t2; C D - - 4 d 5 e 2 rows selected.

들을 예로 들겠다.


1. Cross Join

  • Join 조건이 없는 가장 기본적인 Join. Outer node와 Inner node의 모든 row가 결합되어 반환된다.


예 : Cross Join

SQL>


SELECT a, c FROM t1, t2; A C - - 1 4 1 5 2 4 2 5 4 rows selected.



2. Inner Join

  • Join 조건이 있는 Join. node의 각 row에 대해 조건을 만족하는 row에 대해서만 결합하여 반환한다.
  • Join 조건은 column들간의 연산자로 구성되어 있으며, 
    이 때 이 연산자가 등호(=)이면 'Equi-Join'이라 한다.



예 : Inner Join ( Equi-Join )

SQL>


SELECT a, b, c, d FROM t1, t2 WHERE a + 3 = c; A B C D - - - - 1 a 4 d 2 b 5 e 2 rows selected.



예 : Inner Join ( Non-Equi-Join )

SQL>


SELECT a, b, c, d FROM t1, t2 WHERE a < c; A B C D - - - - 1 a 4 d 1 a 5 e 2 b 4 d 2 b 5 e 4 rows selected.



3. Outer Join

  • Join 조건을 만족하는 row에 대해 결합하고, 만족하지 않는 row에 대해 NULL 데이터만을 갖는 row와 결합하여 반환한다.
  • Left Outer Join, Right Outer Join, Full Outer Join이 있다.
  • ( A LEFT OUTER JOIN B ) 와 ( B RIGHT OUTER JOIN A )는 완전 동치이다.
  • Join 조건을 where에서가 아닌 'ON'에서 힌트를 준다.



ON vs WHERE 

ON은 말 그대로 JOIN 수행 중 계속 검사하는 Join 조건이지만,
WHERE는 조인이 다 끝난 후의 filtering을 시행한다. 
미세한 차이점 알아두기 !





예 : Left Outer Join

SQL>


SELECT a, b, c FROM t1 LEFT OUTER JOIN t2 ON a > 1; A B C - - ---- 1 a null 2 b 4 2 b 5 3 rows selected.



예 : Full Outer Join

SQL>


SELECT a, b, c FROM t1 FULL OUTER JOIN t2 ON a > 1 AND c < 5; A B C ---- ---- ---- 1 a null 2 b 4 null null 5 3 rows selected.



4. Semi Join

  • Join 조건이 존재해야 하며, 부합하는 row들 중 Outer node와의 Join 결과를 반환한다. ( Outer node의 row만 )
  • 또, SQL 구문상 직접 기술할 수 없어, 'IN' 'EXISTS' 등의 ANY형 연산자 로 표현한다.
  • Join 조건에 대한 Index가 존재하고, Inner node의 Unique가 보장되면 'Inverted Semi Join'또한 할 수 있다.



예 : Semi Join

SQL>


SELECT a FROM t1 WHERE a + 3 IN ( SELECT C FROM t2 WHERE d = 'd' ); A - 1 1 row selected.



5. Anti Join

  • Join 조건에 부합하지 않는 Outer node의 row들만을 반환한다.
  • 반드시 NULL 처리가 필요하다. ( oracle 11 버전부터는 명시하지 않아도 가능 )



예 : Anti Join

SQL>


SELECT a FROM t1 WHERE a + 3 NOT IN ( SELECT C FROM t2 WHERE d = 'd' ); A - 2 1 row selected.





마침.


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,


Relational Algebra

Relational Data Operation

What is Relational data Operation?

  • 원하는 데이터를 얻기 위해 Relation에 필요한 Query를 수행하는 것으로,
    DB system의 구성 요소 중 데이터 언어의 역할을 한다.
  • 관계 대수/관계 해석 으로 나눌 수 있다. (기능과 표현력 측면에서 능력은 동등하다)
    • 관계 대수(Relational Algebra) : 절차식 언어, 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술한다.
    • 관계 해석(Relational Calculus) : 비절차식 언어, 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술한다.

https://www.lucidchart.com/publicSegments/view/ffd9cd6c-c856-4fef-96fa-f749e6b77080/image.png

Why do we use it?

  • 원하고자 하는 데이터를 쉽고, 빠르고, 정확하게 얻고자 사용한다.
  • 새로운 데이터 언어 제안 시, 해당 데이터 언어의 유용성을 검증하는 기준
    관계 대수나 해석으로, 기술할 수 있는 모든 query를 기술할 수 있으면
    데이터 언어를 관계적으로 완전(Relationally Complete)하다고 판단할 수 있다.

Relational Algebra

What is Relational Algebra?

  • Relation을 다루는 연산으로, 검색 질의를 기술하는데 사용한다.
  • 절차식 언어이다. (User가 원하는 결과를 위해 어떤 연산을 수행해야 할 지 system에 알려준다)
  • 간단하며 명시적(Powerful) 표현을 사용한다.
  • 폐쇄 특성(Closure Property)을 가진다.

->피연산자와 그 연산의 결과 역시 Relation이다.

  • 대표 연산자는 8개로, 일반 집합 연산자 4개와 순수 관계 연산자 4개로 분류할 수 있다.
  • 피연산자의 특성 두가지
    • Variables that stand for relations(relation을 나타내는(대표하는) 변수)
    • Constants which are finite relations(유한한 relation의 상수)

    연산 : By System     vs     언어 : By User


Normal Set Operator

일반 집합 연산자

  • Relation이 tuples의 set이라는 개념을 이용하며, 수학의 집합 연산자를 차용한다.
  • 조건 : 피연산자가 두 개이며, 합병가능(Union-compatible)이어야 한다.
  • 합병가능 (Union-compatible)이란?
    이들의 필드 수가 같고,(속성의 개수)
    왼쪽에서부터 오른쪽으로 차례대로, 대응하는 필드들이 동일한 도메인을 가지고 있다.
    (도메인이 같으면 이름은 달라도 됨)


일반 집합 연산자
연산자기호표현의미

Union

R∪S

릴레이션 R과 S의 합집합 반환,
R∪S={t│t∈R ∨ t∈S}

Intersection

R∩S

릴레이션 R과 S의 교집합 반환,
R∩S={t│t∈R ∧ t∈S}

Difference

R-S

릴레이션 R과 S의 차집합 반환,
R-S={t│t∈R ∧ ¬t∈S}

Cartesian Product

×R × S

릴레이션 R과 S의 각 tuple들을 모두 연결,
R × S={r·s│r∈R ∧ s∈S}






UNION



https://www.lucidchart.com/publicSegments/view/dc41b327-a211-4580-a79b-299ff18eca04/image.png

Cardinality차수특징
│R∪S│≤│R│+│S│R과S의 차수와 같다

교환/결합법칙 성립










INTERSECTION



https://www.lucidchart.com/publicSegments/view/99aab467-5ed6-4c4f-8853-182b684b9122/image.png

Cardinality차수특징
│R∩S│≤ MIN{│R│,│S│}R과S의 차수와 같다

교환/결합법칙 성립






DIFFERENCE



https://www.lucidchart.com/publicSegments/view/cdca4006-f940-4ce9-a668-9beb4cf5f959/image.png

Cardinality차수특징
│R-S│≤│R│R과S의 차수와 같다

교환/결합법칙 불가







CARTESIAN PRODUCT



https://www.lucidchart.com/publicSegments/view/a97abf44-ea93-4ea6-83da-8fc8c216c613/image.png

Cardinality차수특징
│R × S│=│R│×│S│R과S의 차수를 더한 값교환/결합법칙 성립



Cartesian Product는 두 Relation의 구조가 달라도 가능하다.






Pure Relational Operator

순수 관계 연산자

  • Relation의 구조와 특성을 이용하는 연산자이다.
순수 관계 연산자
연산자기호표현의미

Selection

σσ조건(R)

릴레이션 R에서 
조건(Predicate)을 만족하는 tuples 반환

Projection

ππ칼럼(R)

릴레이션 R에서 
주어진 column으로만 구성된 tuples 반환

Join

R⋈S

릴레이션 R, S의 특정column(들)을 비교하여,
조건에 알맞는 컴포넌트가 있다면
그 컴포넌트(들)의 tuples 반환.

Division

÷R÷S

릴레이션 S의 모든 tuple과 관련이 있는
릴레이션 R의 tuples 반환

Rename

ρρs(x1,x2,...)(R)

릴레이션 R을 S로 개명
각 attribute를 x1, x2,...로 개명










SELECTION



https://www.lucidchart.com/publicSegments/view/b9b1d15e-c897-4e4e-822d-e8a681b9f2b0/image.png

특징

- 하나의 Relation에서만 수행하는 연산
- 조건식(Predicate)에는 비교연산자(>, ≥, =, ≠, ≤, <)와 논리연산자(, ) 이용
- 수평적 부분집합 개념










PROJECTION



https://www.lucidchart.com/publicSegments/view/a6d22977-c20a-49d9-9b36-951e1d8e280e/image.png 

특징

- 하나의 Relation에서만 수행하는 연산
- 수직적 부분집합 개념










JOIN



https://www.lucidchart.com/publicSegments/view/e37dddbf-9208-4cf0-9c48-b77cdc5e0699/image.png

종류특징
Join

- 릴레이션 R 하나로는 원하는 Data를 얻지 못하여 
관련있는 여러 Relation들을 함께 사용해야 하는 경우 사용 
자연 조인(Natural Join)이라고도 함

Theta-Join

- 이러한 조인 연산에, θ(조건; Predicate)을 부여해
조건을 만족하는 tuples를 반환
- 조건(Predicate)은 비교연산자(>, ≥, =, ≠, ≤, <)을 의미한다.

Equi-Join

- θ연산자가 등호(=)일 때의 세타 조인을 말한다.











DIVISION



https://www.lucidchart.com/publicSegments/view/ea663266-3648-4ae5-9404-6eca3535e0dd/image.png

특징

- 릴레이션 R이 릴레이션 S의
  모든 column을 포함하고 있어야 연산 가능 (R⊃S)










RENAME



https://www.lucidchart.com/publicSegments/view/1d7bf5ec-9d8e-4842-a846-c513966056b8/image.png

특징
- 각 combining시 Name conflict(이름 충돌)이 그림과 같이 빈번히 일어날 수 있다.
- 이는 User, DBA 모두에게 모호할 수 있어, 명시적으로 이름을 바꾸는 데 사용한다.





Bag vs Set

     초기 DBMS는 Bag을 이용한 data modeling을 하였다.
     Bag은 한마디로, 중복을 허용하는 집합 개념이다.
     그렇기 때문에 implementation 관점에서, 
     Set을 이용한 것보다 효율이 좋다.(두 Relation을 합칠 경우
     복사해서 붙여넣기만 하면 된다.)
     현재는 Data의 종류에 따라 저장 방법이 매우 다르므로
     이 두가지를 적절히 사용한다! ( All과 Distinct 개념 )

Combining Issues

Ordering

아무 조건(Predicate)이 없는 연산들은, 그 순서대로(괄호가 있다면 괄호부터) 행하면 되지만,
위에서 살펴본 Selection, Theta Join 등의 다양한 조건들을 갖는 연산들은
어떤 순서로 조건을 만족시키는 지 정하는 것이 좋다.

  • 예를 들어, 두 릴레이션 R1, R2를 ∧(AND)가 포함된 Theta join을 한다고 가정하자. 이 때 AND 양옆의 조건들을
    먼저 행하고 합칠 것이냐, 아니면 Cartesian Product 등으로 먼저 합친 뒤 조건을 행할 것이냐
    하는 등의 issue를 말할 수 있겠다.

이러한 것들은 Optimizer가 다양한 비용, 공간, 시간 등을 고려해 '적절히' 정한다.

A Linear Notation for Algebraic Expressions

대수식의 선형 표현법

  • Assignment : 복잡한 표현들 대신, 빈 relation을 만들어 순차적 assignment에 따라 표현한다.
    1. Relation 이름, 괄호안에 column 리스트를 입력한다. 보통 마지막 결과 relation 이름은 Answer로 칭한다.
    2. Assignment 기호는 :=를 사용한다.
    3. 대수 표현을 우변에 작성한다.
  • 이와 같은 작업을 행하면, 마치 C++의 Pseudocode처럼, 우측 대수를 좌측 relation에 대입한다.

예)

     Movies relation에서, 

     상영시간이 90분을 넘고 Fox사 배급인 영화의 제목과 개봉 년도를 찾아라.

     R(t,y,l,i,s,p) := σlength>90(Movies)
     S(t,y,l,i,s,p) := σstudioName='Fox'(Movies)
     T(t,y,l,i,s,p) := R ∩ S
     Answer(title, year) := π t,i(T)

블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,