2.6. 범퍼카 토토 사이의 결합

지금까지, 우리의 쿼리는 한 번에 하나의 범퍼카 토토에만 액세스했습니다. 쿼리는 한 번에 여러 범퍼카 토토에 액세스하거나 범퍼카 토토의 여러 행이 동시에 처리되는 방식으로 동일한 범퍼카 토토에 액세스 할 수 있습니다. 한 번에 동일하거나 다른 범퍼카 토토의 여러 행에 액세스하는 쿼리를 A라고합니다.Join쿼리. 예를 들어, 모든 날씨 기록을 관련 도시의 위치와 함께 나열하고 싶다고 가정 해보십시오. 그렇게하려면를 비교해야합니다.City각 행의 열날씨범퍼카 토토이름도시범퍼카 토토을 선택 하고이 값이 일치하는 행 쌍을 선택합니다.

note

이것은 개념적 모델 일뿐입니다. 결합은 일반적으로 가능한 각 행 쌍을 실제로 비교하는 것보다보다 효율적인 방식으로 수행되지만 사용자에게는 보이지 않습니다.

이것은 다음 쿼리에 의해 달성됩니다 :

선택 *
    날씨, 도시
    여기서 도시 = 이름;
도시 | temp_lo | temp_hi | prcp |    날짜 |     이름 | 위치
--------------+--------+---------+-------+----------------------------------------------------------------------
 샌프란시스코 |      46 |      50 | 0.25 | 1994-11-27 | 샌프란시스코 | (-194,53)
 샌프란시스코 |      43 |      57 |    0 | 1994-11-29 | 샌프란시스코 | (-194,53)
(2 줄)

결과 세트에 대해 두 가지를 관찰하십시오.

  • Hayward시에 대한 결과 행은 없습니다. 이것은에 일치하는 항목이 없기 때문입니다.도시Hayward의 범퍼카 토토이므로 결합은의 타의 추종을 불허하는 행을 무시합니다날씨범퍼카 토토. 우리는 이것이 어떻게 해결 될 수 있는지 곧 볼 것입니다.

  • 도시 이름을 포함하는 두 개의 열이 있습니다. 이것은의 열 목록이기 때문에 정확합니다.날씨and도시범퍼카 토토이 연결되었습니다. 실제로 이것은 바람직하지 않기 때문에 사용하기보다는 출력 열을 명시 적으로 나열하고 싶을 것입니다.*:

    City, Temp_lo, Temp_hi, PRCP, 날짜, 위치를 선택하십시오
        날씨, 도시
        여기서 도시 = 이름;

운동 :이 쿼리의 의미론을 결정하려고 시도합니다여기서조항이 생략되었습니다.

열에는 모두 다른 이름을 가지므로, 파서는 자신이 속한 범퍼카 토토을 자동으로 발견했습니다. 두 범퍼카 토토에 중복 열 이름이있는 경우자격당신이 의미하는 것을 보여줄 열 이름은 다음과 같이 의미합니다.

날씨를 선택하십시오.
       Weather.prcp, weather.date, 도시
    날씨, 도시
    여기서 도시 .name = weather.city;

가입 쿼리의 모든 열 이름을 자격을 갖추는 것은 좋은 스타일로 간주되므로 중복 열 이름이 나중에 범퍼카 토토 중 하나에 추가되면 쿼리가 실패하지 않도록합니다..

지금까지 보이는 종류의 쿼리 가입 도이 대안 형식으로 작성할 수 있습니다.

선택 *
    날씨 내부에서 도시로 가입합니다 (weather.city = cities.name);

이 구문은 위의 것만 큼 일반적으로 사용되지는 않지만 다음 주제를 이해하는 데 도움이되도록 여기에 표시합니다.

이제 Hayward 레코드를 다시 얻을 수있는 방법을 알아낼 것입니다. 쿼리가 원하는 것은입니다.날씨범퍼카 토토과 일치하는 것을 찾기위한 각 행도시행 (들). 일치하는 행이 발견되지 않으면 일부를 원합니다빈 값도시범퍼카 토토의 열. 이런 종류의 쿼리는입니다.외부 조인. (지금까지 본 조인은 내부 조인입니다.) 명령은 다음과 같습니다.

선택 *
    날씨에서 왼쪽 외부의 도시에 가입 (weather.city = cities.name);

     도시 | temp_lo | temp_hi | prcp |    날짜 |     이름 | 위치
--------------+--------+---------+-------+----------------------------------------------------------------------
 헤이워드 |      37 |      54 |      | 1994-11-29 |               |
 샌프란시스코 |      46 |      50 | 0.25 | 1994-11-27 | 샌프란시스코 | (-194,53)
 샌프란시스코 |      43 |      57 |    0 | 1994-11-29 | 샌프란시스코 | (-194,53)
(3 줄)

이 쿼리는 a라고합니다.왼쪽 외부 조인조인 연산자의 왼쪽에 언급 된 범퍼카 토토은 적어도 한 번은 출력에 각 행을 갖기 때문에 오른쪽의 범퍼카 토토은 왼쪽 범퍼카 토토의 일부 행과 일치하는 행 출력 만 갖습니다. 오른쪽 범퍼카 토토 일치가없는 왼쪽 범퍼카 토토 행을 출력 할 때 비어있는 (NULL) 값이 오른쪽 범퍼카 토토 열에 대체됩니다.

운동 :오른쪽 외부 조인 및 전체 외부 조인도 있습니다. 그 일이 무엇을하는지 알아보십시오.

우리는 또한 범퍼카 토토에 합류 할 수 있습니다. 이것을 A라고합니다.셀프 조인. 예를 들어, 다른 날씨 기록의 온도 범위에있는 모든 날씨 기록을 찾고 싶다고 가정 해 봅시다. 그래서 우리는를 비교해야합니다.temp_loandtemp_hi각각의 열날씨로드temp_loandtemp_hi기타 모든 열날씨행. 다음 쿼리 로이 작업을 수행 할 수 있습니다.

w1.city, w1.temp_lo As Low, W1.temp_hi As High, W1.temp_lo를 선택하십시오.
    w2.city, w2.temp_lo는 낮고, w2.temp_hi는 높다
    날씨 W1, 날씨 W2에서
    여기서 w1.temp_lo <w2.temp_lo
    및 w1.temp_hi w2.temp_hi;

     도시 | 낮음 | 높은 |     도시 | 낮음 | 높은
---------------+-----+-------+-----------------------------------
 샌프란시스코 |  43 |   57 | 샌프란시스코 |  46 |   50
 헤이워드 |  37 |   54 | 샌프란시스코 |  46 |   50
(2 줄)

여기서 우리는 날씨 범퍼카 토토을로 바 꾸었습니다.W1andW2가입의 왼쪽과 오른쪽을 구별 할 수 있습니다. 다른 쿼리에서 이러한 종류의 별명을 사용하여 일부 타이핑을 저장할 수도 있습니다 (예 :

선택 *
    날씨 W, 도시 c
    여기서 w.city = c.name;

당신은이 스타일의 약어를 자주 만날 것입니다.

정정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면