SQLShack (한국어)

INNER JOIN vs LEFT JOIN, 즉 질문. 오늘은이 두 조인 유형이 어떻게 사용되는지와 차이점이 무엇인지 간략하게 설명하겠습니다. 나중에 모델을 확장하고 훨씬 더 복잡한 쿼리를 작성할 수있을 때이 주제를 다시 살펴 보겠습니다.

데이터 변경

INNER JOIN과 LEFT JOIN, 우리가 현재 알고있는 것을 보자. 지금까지이 시리즈에서는 데이터베이스 및 테이블을 만드는 방법, 데이터로 테이블을 채우는 방법, 간단한 쿼리를 사용하여 테이블에 저장된 내용을 확인하는 방법 등 데이터베이스 기본 사항에 대해 설명했습니다. 이전 기사에서 두 테이블을 조인했습니다. 이제 다음 단계를 수행 할 준비가되었습니다.

하지만 이동하기 전에 다음 단계를 약간 변경하겠습니다. 우리의 데이터. 다음 INSERT INTO 명령을 사용하여 국가 테이블에 2 개의 행을 추가합니다.

이제 두 테이블의 내용을 확인합니다.

테이블 국가에 스페인과 러시아에 각각 하나씩 2 개의 새 행이 있음을 쉽게 알 수 있습니다. ID는 6과 7입니다. 또한 city 테이블에는 값이 6 또는 7 인 country_id가 없습니다. 이는 단순히 데이터베이스에 러시아 또는 스페인의 도시가 없음을 의미합니다. 이 사실은 나중에 사용할 것입니다.

INNER JOIN

다음 두 쿼리에 대해 논의 해 보겠습니다.

반환 된 결과는 아래 그림에 나와 있습니다.

p>

두 쿼리 모두 정확히 동일한 결과를 반환합니다. 이것은 우연이 아니라 두 가지 다른 방식으로 작성된 동일한 쿼리라는 사실의 결과입니다. 두 가지 방법 모두 정확하며 둘 중 하나를 사용할 수 있습니다.

첫 번째 쿼리에서는 쿼리의 FROM 부분 (FROM 국가, 도시)에서 사용하는 모든 테이블을 나열한 다음 조인을 사용했습니다. 쿼리의 WHERE 부분에있는 조건 (WHERE city.country_id = country.id). 이 조인 조건을 작성하는 것을 잊은 경우 두 테이블의 카티 전 곱을 갖게됩니다.

두 번째 쿼리에서는 쿼리의 FROM 부분 (FROM 국가)에 하나의 테이블 만 있습니다. 그런 다음 쿼리의 JOIN 부분에 두 번째 테이블과 JOIN 조건이 있습니다 (INNER JOIN city ON city.country_id = country.id).

두 쿼리가 모두 잘 작성되었지만 저는 다음과 같이 제안합니다. 테이블을 나열하고 쿼리의 WHERE 부분에서 조인하는 대신 항상 INNER JOIN을 사용합니다. 그 이유는 다음과 같습니다.

  • 사용 된 테이블과 관련 JOIN 조건이 동일하기 때문에 가독성이 훨씬 좋습니다. 선. JOIN 조건을 생략했는지 여부를 쉽게 알 수 있습니다.
  • 나중에 다른 JOIN을 사용하려면 (LEFT 또는 RIGHT) 이전에 INNER JOIN을 사용하지 않는 한 (쉽게) 할 수 없었습니다. that

이제 실제로 반환 된 쿼리에 대해 설명해 보겠습니다.

  • 관련된 모든 국가 및 도시 쌍 (외래 키를 통해)
  • 도시 테이블에 관련 도시가 없기 때문에 목록에 2 개의 국가 (스페인 및 러시아)가 없습니다.

LEFT JOIN

나는 이것을 반복 할 것입니다 – “우리는 도시 테이블에 관련 도시가 없기 때문에 목록에 2 개의 국가 (스페인과 러시아)가 없습니다”. 이것은 INNER JOIN과 LEFT JOIN을 비교할 때 매우 중요합니다.

어떤 경우에는 이러한 레코드도 결과에 포함되기를 원합니다. 예를 들어, 이러한 국가가 다른 테이블에 관련 레코드가 없다는 결과를보고 싶을뿐입니다. 이것은 통제의 일부가 될 수도 있고 사건을 계산하는 것일 수도 있습니다. 그 욕망의 동기가 무엇이든 우리는 기술적으로 그렇게 할 수 있어야합니다. 그리고 우리는 있습니다. 데이터베이스에서 LEFT JOIN은 정확히 그 작업을 수행합니다.

LEFT JOIN의 결과는 INNER JOIN의 결과와 동일 할 것입니다. + 우리는 “왼쪽”테이블에서 한 쌍이없는 행을 갖게됩니다. “오른쪽”테이블. 동일한 INNER JOIN 쿼리를 사용하고 INNER라는 단어를 LEFT로 바꿉니다. 결과는 다음과 같습니다.

INNER의 결과에 비해 2 개의 행이 더 있음을 쉽게 알 수 있습니다. JOIN 쿼리. 러시아와 스페인 행입니다. 둘 다 관련 도시가 없기 때문에이 두 행의 모든 도시 속성에는 NULL 값이 있습니다 (정의되지 않음). 이것이 INNER JOIN과 LEFT JOIN을 비교할 때 가장 큰 차이입니다.

RIGHT JOIN

최소한 RIGHT JOIN에 대해 듣게 될 것입니다. LEFT JOIN과 동일한 결과를 반환하므로 거의 사용되지 않습니다. 반면에 LEFT JOIN을 사용하는 쿼리는 테이블을 차례로 나열하기 때문에 훨씬 읽기 쉽습니다.

이것은 RIGHT JOIN을 사용하는 이전 쿼리와 동일합니다.

반환 된 값이 동일하다는 것을 알 수 있습니다.이 경우 도시 테이블의 값만 처음 5 개 열에 있고 country- 관련 값이 그 뒤에옵니다.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?사실 그것은 전혀 문제가 아닙니다. 양쪽에 쌍이있는 레코드 만 반환하려면 INNER JOIN을 사용하고, “right”테이블에 쌍이 있는지 여부에 관계없이 “left”테이블의 모든 레코드가 필요한 경우 LEFT JOIN을 사용합니다. 또는 아닙니다. 두 테이블의 모든 레코드가 필요한 경우 쌍이 있는지 여부에 관계없이 CROSS JOIN을 사용해야합니다 (또는 LEFT JOIN 및 UNION을 사용하여 시뮬레이션). 이에 대한 자세한 내용은 다음 기사에서 확인할 수 있습니다.

목차

SQL 학습 : CREATE DATABASE & CREATE TABLE Operations

SQL 학습 : INSERT INTO TABLE

학습 SQL : 기본 키

학습 SQL : 외래 키

SQL 학습 : SELECT 문

SQL 학습 : INNER JOIN vs LEFT JOIN

SQL 학습 : SQL 스크립트

Learn SQL : 관계 유형

Learn SQL : 여러 테이블 결합

Learn SQL : 집계 함수

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

SQL 학습 : INFORMATION_SCHEMA 데이터베이스

Learn SQL : SQL 데이터 유형

SQL 학습 : 이론 설정

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 일

답글 남기기

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