SQLShack (한국어)

데이터에서 의미있는 것을 얻으려는 경우 , 거의 항상 여러 테이블을 조인해야합니다. 이 문서에서는 다양한 유형의 조인을 사용하여이를 수행하는 방법을 보여줍니다. 이를 위해 INNER JOIN과 LEFT JOIN을 결합합니다. 그럼 시작하겠습니다.

모델

아래 그림에서 기존 모델을 볼 수 있습니다. 6 개의 테이블로 구성되어 있으며 이미 이전 기사에서 설명했습니다.

그래도, 설명하지 않아도 데이터베이스가 좋은 방식으로 모델링되고 제시된다면 (이름을 현명하게 선택하고, 명명 규칙을 사용하고, 전체 모델에 걸쳐 동일한 규칙을 따르고, 스키마의 행 / 관계가 필요 이상으로 겹치지 않음) 다음을 수행 할 수 있어야합니다. 필요한 데이터를 어디서 찾을 수 있는지 결론을 내립니다. 여러 테이블을 조인하기 전에 먼저 이러한 테이블을 식별해야하기 때문에 이것은 매우 중요합니다.

이름 지정 규칙과 SQL 쿼리를 작성할 때 생각하는 방법에 대한 조언에 대해 설명하겠습니다. 시리즈. 지금까지이 모델이 매우 간단하고 쉽게 수행 할 수 있다는 사실에 대해 알아 보겠습니다.

지금까지 우리가 무엇을 알고 있습니까?

이 시리즈에서 우리는 다루기 :

  • SQL SELECT 문과 관련된 기본 사항 및
  • INNER JOIN 및 LEFT JOIN 비교

우리는 지식을 사용할 것입니다. 이 두 기사에서 결합하여 여러 테이블을 조인하는 더 복잡한 SELECT 문을 작성합니다.

INNER JOIN을 사용하여 여러 테이블 조인

분석 할 첫 번째 예는 검색 방법입니다. INNER JOIN 만 사용하는 여러 테이블의 데이터. 각 예에 대해 해결해야하는 문제의 정의와 작업을 수행하는 쿼리로 이동합니다. 이제 첫 번째 문제부터 시작하겠습니다.

# 1 모든 통화의 시작 시간과 종료 시간을 나열해야합니다. 각 호출에 대해 결과를 표시하고 해당 호출을 한 직원의 성과 이름을 표시하려고합니다. 시작 시간 오름차순으로 호출을 정렬합니다.

쿼리를 작성하기 전에 사용해야하는 테이블을 식별합니다. 이를 위해 필요한 데이터가 포함 된 테이블을 확인하고 포함해야합니다. 또한 이러한 테이블 사이의 모든 테이블을 포함해야합니다. 필요한 데이터는 포함하지 않지만 필요한 데이터를 포함하는 테이블 간의 관계 역할을하는 테이블 (여기서는 그렇지 않습니다)

작업을 수행하는 쿼리는 다음과 같습니다.

쿼리 결과는 다음과 같습니다.

여기에서 지적하고 싶은 몇 가지 사항이 있습니다.

  • 우리가 조인 한 테이블은 데이터가 필요한 것은이 3 개의 테이블에 있습니다.
  • 테이블의 속성을 언급 할 때마다 table_name.attribute_name 형식 (예 : employee.first_name)을 사용합니다. 필수는 아니지만 동일한 쿼리에서 2 개 이상의 테이블이 동일한 속성 이름을 사용할 수 있고 오류가 발생할 수 있기 때문에 좋은 방법입니다.
  • INNER JOIN을 순서대로 두 번 사용했습니다. 3 개의 테이블을 결합합니다. 이렇게하면 다른 테이블에 쌍이있는 행만 반환됩니다.
  • INNER JOIN 만 사용하여 여러 테이블을 조인하는 경우 조인에서 이러한 테이블의 순서는 중요하지 않습니다. 유일한 중요한 것은 “ON”(외래 키를 사용하여 참여) 후에 적절한 조인 조건을 사용하는 것입니다.

모든 호출에 관련 직원 및 호출 결과가 있으므로 다음과 같은 경우 동일한 결과를 얻습니다. INNER JOIN 대신 LEFT JOIN을 사용했습니다.

LEFT JOIN을 사용하여 여러 테이블 결합

LEFT JOIN을 사용하는 쿼리를 작성하는 것은 다음을 사용하여 쿼리를 작성하는 것과 크게 다르지 않습니다. INNER JOIN. 물론 결과는 다를 것입니다 (적어도 일부 레코드가 다른 테이블에 쌍이없는 경우).

이것이 우리가 해결하고자하는 문제입니다.

# 2 해당 국가와 관련된 모든 카운티 및 고객을 나열합니다. 각 국가에 대해 영어로 이름을 표시하면 해당 고객의 이름과 함께 도시 고객의 이름이 표시됩니다. 관련 도시가없는 국가도 반환합니다.

필요한 데이터가 포함 된 테이블은 아래 그림에 있습니다.

먼저 cont가 무엇인지 빠르게 확인 이 세 테이블의 항목입니다.

다음 두 가지 중요한 사항을 확인할 수 있습니다.

  • 각 도시에 관련 국가가 있지만 모든 국가에 관련 도시가있는 것은 아닙니다 (스페인 & 러시아에는 없음).
  • 고객도 마찬가지입니다.각 고객에게는 city_id 값이 정의되어 있지만 3 개 도시 만 사용됩니다 (베를린, 자그레브 & 뉴욕).

먼저 INNER JOIN을 사용한 쿼리 :

쿼리 결과는 아래 그림과 같습니다.

데이터베이스에는 7 개 카운티와 6 개 도시가 있지만 쿼리는 4 개의 행만 반환합니다. 이는 데이터베이스에 4 명의 고객 만 있다는 사실의 결과입니다. 이 4 개는 각각 도시와 관련이 있고 도시는 국가와 관련이 있습니다. 그래서 INNER JOIN은 고객없이이 모든 국가와 도시를 제거했습니다. 하지만 결과에이를 포함하는 방법은 무엇입니까?

이를 위해 LEFT JOIN을 사용합니다. 모든 “INNER”를 “LEFT”로 바꾸면 쿼리는 다음과 같습니다.

결과는 아래 그림과 같습니다.

이제는 관련 도시가없는 국가 (러시아 & 스페인)도 포함하여 모든 국가가 있음을 쉽게 알 수 있습니다. 고객이없는 도시도 포함됩니다 (바르샤바, 베오그라드 & 로스 앤젤레스). 나머지 4 개 행은 INNER JOIN을 사용하는 쿼리와 동일합니다.

LEFT JOIN – 테이블 순서가 중요합니다.

INNER JOIN에서 JOIN의 순서는 중요하지 않지만 동일합니다. LEFT JOIN을 의미하지 않습니다. 여러 테이블을 조인하기 위해 LEFT JOIN을 사용할 때이 조인에는 JOIN의 왼쪽에있는 테이블의 모든 행이 포함된다는 점을 기억하는 것이 중요합니다. 이전 쿼리를 다시 정렬 해 보겠습니다.

처음에는이 쿼리와 이전 쿼리가 동일하다고 쉽게 말할 수 있습니다 (INNER JOIN을 사용할 때도 마찬가지입니다). 동일한 테이블, LEFT JOIN 및 동일한 조인 조건을 사용했습니다. 먼저 출력을 살펴 보겠습니다.

그렇다면 여기서 무슨 일이 일어 났습니까? 왜 4 개의 행이 있습니까 (INNER JOIN을 사용했을 때와 동일한 4 개)?

대답은 간단하며 LEFT JOIN의 작동 방식과 관련이 있습니다. 첫 번째 테이블 (고객)을 가져 와서 모든 행 (4 개)을 다음 테이블 (도시)에 결합합니다. 고객이 한 도시에만 속할 수 있기 때문에 결과는 4 행입니다. 그런 다음이 4 개의 행을 다음 테이블 (국가)에 결합하고 다시 4 개의 행을 갖게됩니다. 도시는 한 국가에만 속할 수 있기 때문입니다.

이 3 개의 테이블을 여기에서 결합하지 않는 이유는 방법은 예제 # 2의 텍스트로 제공됩니다. 쿼리는 다음과 같은 4 개의 행을 반환하는 방식으로 작성됩니다. 모든 고객과 고객이 위치한 도시 및 국가의 이름을 반환합니다. 관련 도시 및 국가가없는 고객도 반환합니다.

  • 참고 : LEFT JOIN을 사용하는 경우 해당 문의 테이블 순서가 중요하며이 순서를 변경하면 쿼리가 다른 결과를 반환합니다. 순서는 실제로 반환하려는 결과에 따라 다릅니다.

둘 다 사용하여 여러 테이블 결합 – INNER JOIN & LEFT JOIN

이것도 가능합니다. 다시 예를 들어 보겠습니다.

# 3 쌍을 가진 모든 국가 및 도시 목록을 반환합니다 (도시에서 참조하지 않는 국가 제외). 이러한 쌍의 경우 모든 고객을 반환합니다. 단일 고객이없는 짝수 쌍을 반환합니다.

작업을 수행하는 쿼리는 다음과 같습니다.

쿼리 결과는 아래 그림과 같습니다.

관련 도시가없는 국가가 없다는 사실을 쉽게 알 수 있습니다 (이는 스페인입니다. & 러시아). INNER JOIN은 이러한 행을 제거했습니다. 하지만 고객이없는 인용문이 있습니다 (Belgrade, Los Angeles & Warsaw). 이는 city와 customer 테이블간에 LEFT JOIN을 사용했기 때문입니다.

결론

여러 테이블을 조인해야 할 때 INNER LEFT JOIN은 처분 할 수 있습니다 (RIGHT JOIN은 거의 사용되지 않으며 LEFT JOIN으로 쉽게 대체 할 수 있음). 사용할 조인은 해결해야하는 작업에 따라 달라지며 그 과정에서 느낌을받을 수 있습니다. 다음 기사에서는 더 복잡한 쿼리를 작성해야 할 때 자신을 생각하고 구성하는 방법에 대해 설명합니다.

목차

SQL 학습 : CREATE DATABASE & CREATE TABLE 작업

SQL 학습 : INSERT INTO TABLE

Learn SQL : Primary Key

Learn SQL : Foreign Key

Learn SQL : SELECT statement

SQL 학습 : INNER JOIN vs LEFT JOIN

Learn SQL : SQL 스크립트

Learn SQL : 관계 유형

SQL 학습 : 다중 테이블 조인

SQL 학습 : 집계 함수

SQL 학습 : 복잡한 SELECT 작성 방법 쿼리

SQL 학습 : INFORMATION_SCHEMA 데이터베이스

SQL 학습 : SQL 데이터 유형

SQL 학습 : 이론 설정

p>

SQL 학습 : 사용자 정의 함수

SQL 학습 : 사용자 정의 저장 프로 시저

SQL 학습 : SQL보기

SQL 학습 : SQL 트리거

SQL 학습 : SQL 쿼리 연습

SQL 학습 : SQL 쿼리 예

SQL 학습 : SQL 쿼리를 사용하여 수동으로 보고서 생성

SQL 학습 : SQL Server 날짜 및 시간 함수

SQL 학습 : 날짜 및 시간 함수를 사용하여 SQL Server 보고서 생성

SQL 학습 : SQL Server 피벗 테이블

SQL 학습 : Excel로 SQL Server 내보내기

SQL 학습 : SQL Server 루프 소개

SQL 학습 : SQL Server 커서

SQL 학습 : 데이터 삭제 및 업데이트를위한 SQL 모범 사례

SQL 학습 : 명명 규칙

SQL 학습 : SQL 관련 작업

SQL 학습 : SQL Server의 비동 등 조인

SQL 학습 : SQL 주입

  • 작성자
  • 최근 게시물
Emil은 데이터베이스와 관련된 모든 분야에서 10 년 이상의 경험을 가진 데이터베이스 전문가입니다. . 수년 동안 그는 IT 및 금융 업계에서 일했으며 현재 프리랜서로 일하고 있습니다.
그의 과거 및 현재 업무는 데이터베이스 설계 및 코딩에서 데이터베이스에 대한 교육, 컨설팅 및 작성에 이르기까지 다양합니다. 또한 잊지 마세요, BI, 알고리즘 생성, 체스, philately, 개 2 개, 고양이 2 개, 아내 1 명, 아기 1 명 …
LinkedIn에서 찾을 수 있습니다.
Emil Drkusic의 모든 게시물보기

Emil Drkusic의 최신 게시물 (전체보기)
  • SQL 학습 : SQL 삽입-2020 년 11 월 2 일
  • SQL 학습 : SQL Server의 비동 등 조인-2020 년 9 월 29 일
  • SQL 학습 : SQL 관련 작업-2020 년 9 월 1 일

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다