본문 바로가기
학부 전공/DB

SQL join사용하기

by 장어진 2021. 6. 19.

첫 번째는 join으로 정보가 2개 이상의 테이블에 존재할 때 어떻게 할 것인지에 대한 내용이었다. Query가 스타워즈 감독의 이름이 누구냐 라고 주어진다면 Movie 테이블도 MovieExec 테이블도 필요하게 된다. 따라서 적절한 조건을 주어 join을 해주어야한다. Movie 테이블에는 감독 번호만이 존재하고 MovieExec에 감독 이름이 존재하니 MovieExec에 있는 certNoproducerCNo가 같은 조건으로 조인하고 영화이름이 StarWars인 것 중 감독 이름을 뽑으면 된다. 이를 Relation algebra로 표현하면 다음과 같이 표현된다.

그리고 이를 SQL로 표현하면 이와 같다.

SELECT name

FROM Movie, MovieExec

WHERE title = ‘Star Wars’ AND producerCNo = certNo;

Where 부분에서 selection부분이랑 join 조건 부분이랑 겹쳐서 표현이 되어 있지만 DB서버는 헷갈려하지 않기 때문에 신경쓰지 않아도 된다고ㅍ 한다. 하지만 좀 더 명확하게 하는 방법이 있다.

 

SELECT name

FROM Movie JOIN MovieExec

ON producerCNo = certNo

WHERE title = ‘Star Wars’;

위와 같이 JOIN 하고 ON을 붙여 조인 조건을 따로 입력해주는 것이다. 아웃 조인과 구분을 짓기 위해서 JOIN 앞에 INNER를 붙여 INNER JOIN으로 표기하기도 한다.

 

Tuple Variable, 테이블 이름을 변경하는 것을 의미하며 다음과 같이 사용할 수 있다.

SELECT Star1.name, Star2.name

FROM MovieStar AS Star1, MovieStar AS Star2

WHERE Star1.address = Star2.address AND

Star1.name < Star2.name

이는 자기 자신을 조인할 경우 중복해서 값이 생기는 것을 방지하고자 사용하고 테이블 이름을 바꾸는 부분의 AS는 써도 되고 안 써도 된다.

 

Nested Loops

SELECT <attr>

FROM R1, R2, ‘’‘, Rn

WHERE <cond> 형태 일때

 

FOREACH t1 ∈ R1{

  FOREACH t2 ∈ R2{

    …

      FOREACH tn ∈ Rn{

IF <cond>{

output <attr>

}

행태의 알고리즘을 사용할 수 있지만 이는 카티션 프로덕트가 발생하기 때문에 비효율적인 알고리즘이라고 한다. DB 서버에서 이 알고리즘으로 실행을 하는 것은 아니라고 하고 더 효율적인 것을 택하지만 개념적으로 이해하기 쉬워 사용된다고 한다.

Parallel assignment도 있는데 이는 위에서 for loop로 카티션 프로덕트를 만드는 과정을 한번에 압축시켜 진행하는 것이다. relation algebra로 나타내면

이와 같다.

 

 

728x90