2.6. 토토 꽁 머니 간 조인#

지금까지 우리 쿼리는 한 번에 하나의 토토 꽁 머니에만 액세스했습니다. 쿼리는 한 번에 여러 토토 꽁 머니에 액세스하거나 토토 꽁 머니의 여러 행이 동시에 처리되는 방식으로 동일한 토토 꽁 머니에 액세스할 수 있습니다. 한 번에 여러 토토 꽁 머니(또는 동일한 토토 꽁 머니의 여러 인스턴스)에 액세스하는 쿼리가 호출됩니다.가입쿼리. 쌍을 이룰 행을 지정하는 표현식을 사용하여 한 테이블의 행을 두 번째 테이블의 행과 결합합니다. 예를 들어 모든 날씨 기록과 관련 도시의 위치를 반환하려면 데이터베이스는 다음을 비교해야 합니다.도시각 행의 열날씨토토 꽁 머니이 있는이름모든 행의 열도시토토 꽁 머니을 선택하고 이 값이 일치하는 행 쌍을 선택하세요.[4]이것은 다음 쿼리로 수행됩니다:

SELECT * FROM 날씨 JOIN 도시 ON 도시 = 이름;
도시 | 임시_로 | 임시_안녕 | PRCP |    날짜 |     이름 | 위치
---------------+---------+---------+------+------------+---------------+------------
 샌프란시스코 |      46 |      50 | 0.25 | 1994-11-27 | 샌프란시스코 | (-194,53)
 샌프란시스코 |      43 |      57 |    0 | 1994-11-29 | 샌프란시스코 | (-194,53)
(2행)

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

  • 헤이워드시에 대한 결과 행이 없습니다. 이는에 일치하는 항목이 없기 때문입니다.도시Hayward 토토 꽁 머니이므로 조인은 일치하지 않는 행을 무시합니다.날씨토토 꽁 머니. 이 문제를 어떻게 해결할 수 있는지 곧 살펴보겠습니다.

  • 도시 이름을 포함하는 두 개의 열이 있습니다. 이는 올바른 것입니다. 왜냐하면의 열 목록이날씨그리고도시테이블이 연결되어 있습니다. 그러나 실제로 이는 바람직하지 않으므로 다음을 사용하는 대신 출력 열을 명시적으로 나열하는 것이 좋습니다.*:

    도시 선택, temp_lo, temp_hi, prcp, 날짜, 위치
        FROM 날씨 JOIN 도시 ON 도시 = 이름;

열의 이름이 모두 다르기 때문에 파서는 해당 열이 속한 테이블을 자동으로 찾았습니다. 두 테이블에 중복된 열 이름이 있는 경우 다음을 수행해야 합니다.자격을 갖추다다음과 같이 의미하는 열 이름을 표시하는 열 이름:

SELECT Weather.city, Weather.temp_lo, Weather.temp_hi,
       날씨.prcp, 날씨.날짜, 도시.위치
    FROM 날씨 JOIN 도시 ON Weather.city = 도시.이름;

조인 쿼리에서 모든 열 이름을 한정하는 것은 좋은 스타일로 널리 간주됩니다. 그래야 중복된 열 이름이 나중에 테이블 중 하나에 추가되는 경우 쿼리가 실패하지 않습니다.

지금까지 본 종류의 조인 쿼리는 다음 형식으로도 작성할 수 있습니다:

선택 *
    날씨, 도시에서
    어디에서 도시 = 이름;

이 구문은 다음보다 이전 날짜입니다.가입/켜짐구문은 SQL-92에 도입되었습니다. 테이블은 단순히발신절, 비교 표현식이에 추가됩니다.어디절. 이 이전 암시적 구문과 최신 명시적 구문의 결과가입/켜짐구문은 동일합니다. 그러나 쿼리 독자의 경우 명시적인 구문을 통해 의미를 더 쉽게 이해할 수 있습니다. 이전에는 조건이 혼합되어 있었지만 조인 조건은 자체 키워드로 도입되었습니다.어디에서절을 다른 조건과 함께 사용합니다.

이제 우리는 헤이워드 기록을 다시 가져올 수 있는 방법을 알아낼 것입니다. 우리가 쿼리에서 원하는 것은 다음을 스캔하는 것입니다.날씨토토 꽁 머니과 각 행에 대해 일치하는 항목을 찾습니다.도시행. 일치하는 행이 없으면 일부를 원합니다.빈 값대신도시토토 꽁 머니의 열. 이러한 종류의 쿼리를외부 조인. (지금까지 본 조인은 다음과 같습니다.내부 조인.) 명령은 다음과 같습니다.

선택 *
    FROM 날씨 왼쪽 외부 JOIN 도시 ON Weather.city = 도시.이름;
도시 | 임시_로 | 임시_안녕 | 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_lo그리고temp_hi각각의 열날씨행에서temp_lo그리고temp_hi기타 모든 열날씨행. 다음 쿼리를 사용하여 이를 수행할 수 있습니다.

w1.city, w1.temp_lo AS 낮음, w1.temp_hi AS 높음,
       w2.city, w2.temp_lo AS 낮음, w2.temp_hi AS 높음
    FROM 날씨 w1 JOIN 날씨 w2
        ON w1.temp_lo < w2.temp_lo AND w1.temp_hi  w2.temp_hi;
도시 | 낮음 | 높다 |     도시 | 낮음 | 높다
---------------+------+------+---------------+------+------
 샌프란시스코 |  43 |   57 | 샌프란시스코 |  46 |   50
 헤이워드 |  37 |   54 | 샌프란시스코 |  46 |   50
(2행)

여기서 우리는 기상표를 다음과 같이 라벨링했습니다.w1그리고w2조인의 왼쪽과 오른쪽을 구별할 수 있습니다. 또한 다른 쿼리에서 이러한 종류의 별칭을 사용하여 일부 입력을 절약할 수도 있습니다. 예:

선택 *
    FROM 날씨 w JOIN 도시 c ON w.city = c.name;

당신은 이러한 축약 스타일을 꽤 자주 접하게 될 것입니다.



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

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.