OUTER JOIN 문

All lectures for KO purposes
레벨 1 , 레슨 785
사용 가능

OUTER JOIN의 이유

그건 그렇고, 우리가 스프레드 시트를 병합하고 아직 청소기가 없어서 사무실 청소 작업이 사라 졌을 때를 기억하십니까?

다음과 같이 쿼리를 실행하면

SELECT * FROM task

그런 다음 다음 결과를 얻습니다.

ID employee_id 이름 마감 시간
1 1 프런트엔드의 버그 수정 2022-06-01
2 2 백엔드의 버그 수정 2022-06-15
5 커피를 사다 2022-07-01
4 5 커피를 사다 2022-08-01
5 5 커피를 살 것이다 2022-09-01
6 (없는) 사무실을 청소하다 (없는)
7 4 즐거운 삶 (없는)
8 6 즐거운 삶 (없는)

employee_id로 직원 테이블과 작업 테이블을 조인하려고 하면 "Clear Office" 작업이 사라집니다.

이 문제를 해결하기 위해 이러한 고아 행을 다른 테이블에 쌍 없이 저장할 수 있도록 JOIN 연산자에 다양한 수정자가 추가되었습니다.

JOIN 연산자의 고전적인 형식을 상기시켜 드리겠습니다.

table 1 JOIN table 2 ON condition

왼쪽 테이블(table1)의 모든 데이터가 조인된 테이블에 있는지 확인하도록 SQL Server에 지시할 수 있습니다. 올바른 테이블에 쌍이 없더라도. 이렇게 하려면 다음과 같이 작성하면 됩니다.

table 1 LEFT JOIN table 2 ON condition

조인된 테이블이 올바른 테이블의 모든 행을 가지도록 하려면 다음과 같이 작성해야 합니다.

table 1 RIGHT JOIN table 2 ON
 condition

실행자가 없는 작업이 손실되지 않도록 모든 작업과 직원을 결합하는 쿼리를 작성해 보겠습니다. 이렇게 하려면 쿼리를 작성합니다.

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

그리고 이 쿼리의 결과는 다음과 같습니다.

ID 이름 직업 샐러리 나이 가입 날짜 ID employee_id 이름
1 이바노프 이반 프로그램 제작자 100000 25 2012-06-30 1 1 프런트엔드의 버그 수정
2 페트로프 페트르 프로그램 제작자 80000 23 2013-08-12 2 2 백엔드의 버그 수정
4 라비노비치 모이샤 감독 200000 35 2015-05-12 7 4 즐거운 삶
5 키리엔코 아나스타샤 사무실 관리자 40000 25 2015년 10월 10일 5 커피를 사다
5 키리엔코 아나스타샤 사무실 관리자 40000 25 2015년 10월 10일 4 5 커피를 사다
5 키리엔코 아나스타샤 사무실 관리자 40000 25 2015년 10월 10일 5 5 커피를 사다
6 바스카 고양이 1000 2018-11-11 8 6 즐거운 삶
(없는) (없는) (없는) (없는) (없는) (없는) 6 (없는) 사무실을 청소하다

테이블에 또 다른 행이 추가되었으며 흥미롭게도 그 안에 많은 NULL 값이 있습니다. 직원 테이블에서 가져온 모든 데이터는 "Clean office" 작업에 대한 직원 테이블의 실행자가 없기 때문에 NULL로 표시됩니다.

가입 유형

총 4가지 유형의 JOIN이 있습니다. 아래 표에 나와 있습니다.

간단한 입력 긴 항목 설명
1 가입하다 내부 조인 테이블 A와 B에 있는 레코드만
2 왼쪽 조인 왼쪽 외부 조인 테이블 A에서 쌍이 없는 모든 행은
오른쪽 조인 오른쪽 외부 조인 테이블 B에서 쌍이 없는 모든 행은
4 외부 조인 전체 아우터 조인 표 A와 B의 염기쌍의 모든 행은 다음과 같아야 합니다.

간단히 하기 위해 테이블을 세트로 표현하면 JOIN을 그림으로 표시할 수 있습니다.

교집합 설정은 한 테이블에 대해 참조하는 다른 테이블의 해당 레코드가 있음을 의미합니다.

인터뷰 질문

때때로 초보 프로그래머는 인터뷰에서 아주 간단한 질문을 받게 됩니다. 테이블이 주어졌을 때 다음과 같이 공식화할 수 있습니다.

" 작업이 없는 모든 직원의 목록을 표시하는 쿼리를 작성하십시오 ." 먼저, 이 질문을 약간 바꾸어 표현해 보겠습니다. " 작업 테이블에 작업이 없는 직원 테이블의 모든 직원 목록을 표시하는 쿼리를 작성하십시오 ." 이 세트를 가져와야 합니다.

이 문제를 해결하는 방법에는 여러 가지가 있지만 가장 간단한 것부터 시작하겠습니다. 먼저 LEFT JOIN으로 테이블을 조인한 다음 WHERE를 사용하여 누락된 데이터가 NULL로 채워진 모든 행을 제외할 수 있습니다.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

그리고 이 쿼리의 결과는 다음과 같습니다.

ID 이름 직업 샐러리 나이 가입 날짜 ID employee_id 이름
이바노프 세르게이 시험 장치 40000 서른 2014-01-01 (없는) (없는) (없는)

이 솔루션의 유일한 단점은 여기서 테이블의 행에 NULL이 포함되어 있고 조건에 따라 직원 목록을 표시해야 한다는 것입니다.

이렇게 하려면 직원 테이블의 필수 열을 SELECT에 나열하거나 모두 표시해야 하는 경우 다음 구성을 작성할 수 있습니다.

SELECT e.* FROM employee e, task t 

전체 요청은 다음과 같습니다.

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

이 쿼리의 결과:

ID 이름 직업 샐러리 나이 가입 날짜
이바노프 세르게이 시험 장치 40000 서른 2014-01-01

나머지 방법은 숙제로 남겨 둡니다. 직접 찾는 즐거움을 빼앗고 싶지 않습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION