10. Join

2021. 5. 16. 19:09Computer Sciences/Database

Products and Joins in SQL

  • 다수의 테이블에서 데이터를 찾고 싶을 때 join 기능을 사용함
  • Query: 'Star Wars'의 감독 이름은 무엇인가?
  • Movie(title, year, length, inColor, studioName, producerCNo)MovieExec(name, address, certNo, netWorth)
SELECT name FROM Movie, MovieExec WHERE title = 'Star Wars' AND producerCNo = certNo;

→ $πname(σtitle=′StarWars′(Movie⋈producerCNo=certNoMovieExec))\pi_(\sigma_(Movie⋈_MovieExec))

SQL2 표준의 Join

// 위 질의와 완전히 동일하고, DB 상에서도 거의 차이가 없음
SELECT name FROM Movie JOIN MovieExec 
	ON producerCNo = certNo WHERE title = 'Star Wars';
    
SELECT name FROM Movie INNER JOIN MovieExec
	ON producerCNo = certNo WHERE title = 'Star Wars';

→ $\pi_name(σtitle=′StarWars′(Movie⋈producerCNo=certNoMovieExec))\pi_(\sigma_(Movie⋈_MovieExec))

Disambiguating Attributes

  • 여러 테이블을 참조할 경우 속성의 이름이 같은 경우가 있음
  • 속성 이름 앞에 테이블 이름을 명시하여 충돌 방지
  • 같은 주소에 살고 있는 스타와 감독으로 구성된 쌍을 찾아라
  • MovieStar(name, address, gender, birthdate)MovieExec(name, address, certNo, netWorth)
SELECT MovieStar.name, MovieExec.name
FROM MovieStar, MovieExec
WHERE MovieStar.address = MovieExec.address;

SELECT MovieStar.name, MovieExec.name
FROM MovieStar JOIN MovieExec USING (address);
  • 자연 조인으로 쿼리를 작성할 경우 테이블의 스키마가 변경될 가능성이 있음
  • 이런 문제는 대형 참사이므로 자연 조인 시에는 USING 키워드를 사용
  • USING 절은 조인 시 같아야 할 속성을 명시함

Tuple Variables

  • 같은 주소에 살고 있는 스타의 이름을 찾아라
  • MovieStar(name, address, gender, birthdate)
SELECT Star1.name, Star2.name
FROM MovieStar AS Star1, MovieStar AS Star2 
WERHE Star1.address = Star2.address AND 
	Star1.name < Star2.name;
    
// AS는 생략 가능
SELECT Star1.name, Star2.name
FROM MovieStar Star1, MovieStar Star2
WERHE Star1.address = Star2.address AND
	Star1.name < Star2.name;
  • 같은 테이블을 참조하여 질의를 해야할 때 AS를 통해 변수와 같이 지정할 수 있음
  • 위 질의는 MovieStar를 Star1, Star2라는 두 개의 변수에 할당했다고 생각할 수 있음

Interpreting Multirelation Queries

Nested Loops

  • 모든 릴레이션들을 for 문을 돌며 조건을 비교한다고 해석할 수 있음

Parallel Assignment

  1. 우리는 튜플 변수에 대한 적절한 관계에서 튜플의 모든 가능한 할당을 임의의 순서 또는 병렬로 고려한다.
  1. 각 할당에서 우리는 where 절이 참인지를 고려한다.
  1. where 절이 참인 각 할당은 결과에 기여한다.

Conversion to Relation Algebra

SELECT Star1.name, Star2.name
FROM MovieStar AS Star1, MovieStar AS Star2
WHERE Star1.address = Star2.address AND
	Star1.name < Star2.name;

→ $πA1,A2(σA2=A6∧A1<A5(ρM(A1,A2,A3,A4)(MovieStar)×ρN(A5,A6,A7,A8)(MovieStar)))\pi_(\sigma_(\rho_(MovieStar)×\rho_(MovieStar)))

 

'Computer Sciences > Database' 카테고리의 다른 글

12. Aggregation and window function  (0) 2021.05.16
11. Set and Subquery  (0) 2021.05.16
9. use SQL  (0) 2021.05.16
7. Conversion to Relations  (0) 2021.05.02
6-4. Weak Entity Sets  (0) 2021.05.02