테이블 left Join하는 3개 이상의

SQL에서 두 테이블을 맞출 수 있다는 것을 알고 있습니다. JOIN이라는 개념을 사용해서요. 그럼 3개 또는 그보다 더 많은 테이블을 LEFTJOIN 할 수 있습니까? 네, 할 수 있습니다. 이 글은 몇 개의 테이블을 LEFT JOIN하는 방법에 대해 알아보도록 하겠습니다. 또한 그 과정에서 우연히 놓칠 수 있는 개념에 대해서도 함께 다뤄보도록 하겠습니다.

LEFTJOIN이란?LEFT JOIN이가 무엇이었는지 되돌아보는 것부터 시작합시다. SQL 조인 중에 INNER JOIN 기억하시나요? INNERJOIN은 조인하는 두 테이블에 공통적으로 존재하는 값만 반환합니다. 반면 LEFTJOIN의 경우 왼쪽 테이블에서는 모든 값을 오른쪽 테이블에서는 왼쪽 테이블과 일치하는 값만 반환합니다. 그러면 어떤 값이 왼쪽 테이블에는 존재하지만 오른쪽 테이블에는 존재하지 않는다면 두 테이블을 LEFTJOIN한 결과는 어떨까요? LEFTJOIN을 하는 이상 왼쪽 테이블이 주인공이기 때문에 왼쪽 테이블에서 가져온 행의 값은 빠짐없이 모두 반환될 것이지만 오른쪽 테이블에서 가져오는 행의 값은 존재하지 않으므로 NULL 값으로 반환됩니다. 그러면 오른쪽 테이블에 있는 값이 왼쪽 테이블에 존재하지 않는다면 두 테이블을 LEFTJOIN한 결과는 어떨까요? 결과 테이블에는 해당 값이 등장하지도 않을 것입니다. 왜 그런지 주인공은 왼쪽 테이블이기 때문입니다.

다음은 LEFTJOIN의 가장 기본적인 구문입니다.SELECTcolumnames FROMtable 1 ASt1LEFTJOINTable 2 ASt2 ONt 1.common_column;LEFTJOIN은 SQL을 통한 분석에서 상당히 많이 사용되는 문법 중 하나입니다. 왜냐하면 이것은 두 테이블 간의 차이를 파악할 때 매우 용이하기 때문입니다. 즉, 특정 테이블에는 값이 존재하지만 다른 테이블에는 존재하지 않는 값을 구분할 수 있기 때문입니다. 만약 왼쪽 테이블에는 값이 존재하는데 오른쪽 테이블에는 존재하지 않는 값만 따로 조회하려면 어떻게 쿼리문을 구성해야 할까요? LEFT JOIN을 한 후 WHERE 절을 추가하여 오른쪽 테이블 열의 값이 NULL인 행을 추가 필터링해달라고 요청하시면 됩니다.실제 비즈니스 케이스를 통해서 이야기를 나눠보도록 하겠습니다. 우리가 온라인 서점을 운영한다고 가정해 봅시다. 우리는 지난 6개월간 주문 내역을 통해 해당 기간 동안 구매 활동이 적어진 고객, 즉 비활성화 고객이 누구인지 알고 싶습니다. 하지만 무효고객 명단만 볼 게 아니라 최근 구매 활동이 있었던 유효고객 명단도 같이 봤으면 좋겠습니다. 즉, 모든 고객의 정보를 나열하고 해당 고객이 구매했는지 여부를 추가로 알 수 있도록 결과 테이블이 구성되었으면 합니다. 지금 설명한 예가 LEFTJOIN을 사용하기에 매우 좋은 사례입니다.저희 매장의 데이터베이스 테이블을 살펴보겠습니다.1.고객 테이블(customers) idfirst_namelast_namegender agecustomer_since1 DanielBlack M34 2014-10-132 ErikBrown M25 2015-06-103 DianaTrumpF39 2015-10-254 AnnaYaoF 192017-02-205 Christian Sanders M42 2018-01-312. 매출 테이블(sales) idatebook_03 datebook_01 유효한 고객SELECTc.id, c.first_name, c.last_name, c.gender, c.age, c.customer_since, s.date ASsales_date, SUM(s.amount) AStotal_spentFROMcustomersAScLEFTJOINsalesASsONc.id=s.customer_idGROUPBYc.id; 해당 퀄리는 customers 테이블에서 고객의 정보를 모두 추출하기만 하면 그들의 구매일로 계산합니다. 구매 날짜와 구매 금액은 sales 테이블에서 가져와야 하는 열입니다. 해당 쿼리 문을 실행하고 보면 아래와 같은 결과를 얻을 수 있습니다. 이중 볼드 처리된 2개 행은 LEFT JOIN만으로 되는 결과입니다. 만약 위 크오림은으로 LEFT JOIN대신 INNER JOIN을 사용하면 테이블 양쪽에 공통으로 존재하는 값만 반환하므로, 구매액의 정보가 없는 아이 디 1과 5는 조회되지 않습니다.idfirst_namelast_namegenderagecustomer_sincesales_datetotal_spent1DanielBlackM342014-10-13[NULL][NULL]2ErikBrownM252015-06-102019-10-0112.993DianaTrumpF392015-10-252019-09-0214.994AnnaYaoF192017-02-202019-10-0115.755ChristianSandersM422018-01-31[NULL][NULL] 보시다시피, 해당 기간에 무슨 구매 활동이 없었던 고객의 경우 total_spent열의 값이 존재하지 않습니다. 그러나 그들의 고객 정보가 주인공의 테이블인 왼쪽 테이블 customers에 존재했기 때문에 그들의 아이디, 이름, 성별, 연령 등의 정보가 조회 되었습니다. 그러나 오른쪽 테이블에서 가져오던 그들의 구매 날짜와 구매 금액에 대한 데이터가 존재하지 않기 때문에 전부 NULL값이 나왔습니다. 이것이 LEFT JOIN의 모습입니다. 왼쪽 테이블과 공통되는 값이 없다며 왼쪽 테이블 내의 행을 건너뛰고 버리지 않습니다.지금은 더 복잡한 경우를 체크합니다.

하나의 쿼리 중에 몇 차례의 LEFT JOIN분석을 하면 2개의 탁자만으로는 분석이 어렵고 3개 이상의 테이블을 조인해야 하는 상황이 발생합니다. 그래서 이번에는 3개 이상의 테이블을 LEFT JOIN하는 모습을 보이고 보냅니다. 아래 테이블을 보세요.3. 프로모션 테이블(promotions)idcampaigncustomer_iddate1SMS_discount1022019-09-012SMS_discount1032019-09-013SMS_discount1052019-09-01우리는 해당 테이블을 활용하고 최근 진행한 프로모션이 고객의 구매에 영향을 미쳤는지 궁금합니다. 이를 구하려면 고객(customers)매출(sales)프로모션(promotion)총 3개의 테이블을 조인해야 합니다. 우리가 원하는 정보가 세개의 탁자에 흩어지고 있기 때문입니다.SELECTc.id, c.first_name, c.last_name, c.gender, c.age, c.customer_since, s.date AS sale, p.date AS promotionFROM customers AS cLEFT JOIN sales AS sON c.id=s.customer_idLEFT JOIN promotions AS pON c.id=p.customer_id의 위 쿼리를 실행하면 다음과 같은 결과를 얻습니다.idfirst_namelast_namegender agecustomer_sincesale promotion 1 Daniel Black M34 2014-10-13 [NULL] [NULL] 2 Erik Brown M25 2015-06-10-01 2019-09-013 Diana TrumpF 392015-10-25 2019-09-02 2019-01 4 Anna YaoF 192017-02-2019-10-01 [NULL] 5 Christian Sand 31M만약 3개의 테이블을 이노조인으로 맞췄다면 결과 테이블은 구입하거나 프로모션에도 참여한 고객만 조회되었을 것입니다.LEFTJOIN은 한 테이블에는 값이 있지만 다른 테이블에는 해당 값이 없어도 여전히 기존 행을 조회할 수 있습니다.고객1을 보겠습니다. 고객 1은 구매도 하지 않았고 프로모션 메시지를 받은 적도 없습니다.그럼에도 불구하고 우리는 고객 1에 관한 기본적인 정보 조회를 받지 않았습니까?이게 바로 LEFT JOIN의 힘입니다.고객4도 볼까요?이 고객의 경우 구매 내력은 있지만 프로모션 메시지를 받은 적은 없습니다.고객 5의 경우 구매 이력은 없지만 프로모션 메시지는 받았습니다.마지막으로 구매 이력도 있고 프로모션 메시지도 받은 고객 2와 3도 결과 테이블에서 볼 수 있습니다.이 2명의 고객의 결과는, INNERJOIN을 사용했을 때에도 얻을 수 있는 결과일 것입니다.

이 테이블의 결과를 얻기 위해 작성한 쿼리문으로 돌아가면 두 번째 테이블(sales)과 세 번째 테이블(promotions)을 조인하기 위해 첫 번째 테이블(customers)과 겹치는 열을 사용했습니다.하지만 항상 첫 번째 줄과 겹치는 줄을 찾아 조인해야 하는 것은 아닙니다.세 번째 테이블을 조이기 위해 두 번째와의 공통 열을 사용해도 괜찮습니다.아래 예시에서 해당 사례를 살펴보겠습니다.

이번에는 고객들에게 반응이 좋았던 책의 장르를 알아보도록 하겠습니다.이러한 분석은 고객에게 본 추천과 같은 개인화된 경험을 제공할 수 있기 때문에 매우 유용한 정보입니다.해당 분석을 위해 총 3개의 테이블에서 각기 다른 데이터를 가져올 예정입니다. 테이블은 customers 테이블, sales 테이블, books 테이블입니다.이미 아까 customers와 sales 테이블을 조인한 적이 있기 때문에 세 번째 테이블인 books만 추가로 조인하는 과정을 보여드리겠습니다.

4. 본 테이블 (books) idnameauthorgen requantity price 1 The Lordofthe Rings J.R. Tolkienfantasy 712.992 Lolita Bladimira Nobokovnvel 414.994 The Hobbit J.R. Tolkienfantasy 1010.755 Deathonthe Nile Agatha Christie dimira Nobokovnvel 414.994 The Hobbit J.SELECTc.id, c.first_name, c.last_name, s.date AS sale, b.name AS book, b.genreFROMcustomersAScLEFTJOINsalesASsONc.id=s.customer_idLEFTJOINbooksASbONs.book_id=b.id; 아래는 customers, sales, books 테이블을 LEFTJOIN한 결과입니다. 테이블의 구성을 보면 최근 특정 고객이 주문한 책의 이름과 장르라는 정보가 고객의 정보에 합쳐졌음을 확인할 수 있습니다.idfirst_namelast_namesalebookgenre 1 DanielBlack [NULL] [NULL] 2 ErikBrown 2019-10-01 The Lordofthe Ringsfantasy 3 Diana Trump 2019-09-02 Lolitanovel 4 AnnaYao 2019-10-01 [NULL] [NULL] 5 Christian Sanders [NULL] [NULL]에서도 우리 INNERJOIN

다음은 LEFTJOIN의 가장 기본적인 구문입니다.SELECTcolumnames FROMtable 1 ASt1LEFTJOINTable 2 ASt2 ONt 1.common_column;LEFTJOIN은 SQL을 통한 분석에서 상당히 많이 사용되는 문법 중 하나입니다. 왜냐하면 이것은 두 테이블 간의 차이를 파악할 때 매우 용이하기 때문입니다. 즉, 특정 테이블에는 값이 존재하지만 다른 테이블에는 존재하지 않는 값을 구분할 수 있기 때문입니다. 만약 왼쪽 테이블에는 값이 존재하는데 오른쪽 테이블에는 존재하지 않는 값만 따로 조회하려면 어떻게 쿼리문을 구성해야 할까요? LEFT JOIN을 한 후 WHERE 절을 추가하여 오른쪽 테이블 열의 값이 NULL인 행을 추가 필터링해달라고 요청하시면 됩니다.실제 비즈니스 케이스를 통해서 이야기를 나눠보도록 하겠습니다. 우리가 온라인 서점을 운영한다고 가정해 봅시다. 우리는 지난 6개월간 주문 내역을 통해 해당 기간 동안 구매 활동이 적어진 고객, 즉 비활성화 고객이 누구인지 알고 싶습니다. 하지만 무효고객 명단만 볼 게 아니라 최근 구매 활동이 있었던 유효고객 명단도 같이 봤으면 좋겠습니다. 즉, 모든 고객의 정보를 나열하고 해당 고객이 구매했는지 여부를 추가로 알 수 있도록 결과 테이블이 구성되었으면 합니다. 지금 설명한 예가 LEFTJOIN을 사용하기에 매우 좋은 사례입니다.저희 매장의 데이터베이스 테이블을 살펴보겠습니다.1.고객 테이블(customers) idfirst_namelast_namegender agecustomer_since1 DanielBlack M34 2014-10-132 ErikBrown M25 2015-06-103 DianaTrumpF39 2015-10-254 AnnaYaoF 192017-02-205 Christian Sanders M42 2018-01-312. 매출 테이블(sales) idatebook_03 datebook_01 유효한 고객SELECTc.id, c.first_name, c.last_name, c.gender, c.age, c.customer_since, s.date ASsales_date, SUM(s.amount) AStotal_spentFROMcustomersAScLEFTJOINsalesASsONc.id=s.customer_idGROUPBYc.id; 해당 퀄리는 customers 테이블에서 고객의 정보를 모두 추출하기만 하면 그들의 구매일로 계산합니다. 구매 날짜와 구매 금액은 sales 테이블에서 가져와야 하는 열입니다. 해당 쿼리 문을 실행하고 보면 아래와 같은 결과를 얻을 수 있습니다. 이중 볼드 처리된 2개 행은 LEFT JOIN만으로 되는 결과입니다. 만약 위 크오림은으로 LEFT JOIN대신 INNER JOIN을 사용하면 테이블 양쪽에 공통으로 존재하는 값만 반환하므로, 구매액의 정보가 없는 아이 디 1과 5는 조회되지 않습니다.idfirst_namelast_namegenderagecustomer_sincesales_datetotal_spent1DanielBlackM342014-10-13[NULL][NULL]2ErikBrownM252015-06-102019-10-0112.993DianaTrumpF392015-10-252019-09-0214.994AnnaYaoF192017-02-202019-10-0115.755ChristianSandersM422018-01-31[NULL][NULL] 보시다시피, 해당 기간에 무슨 구매 활동이 없었던 고객의 경우 total_spent열의 값이 존재하지 않습니다. 그러나 그들의 고객 정보가 주인공의 테이블인 왼쪽 테이블 customers에 존재했기 때문에 그들의 아이디, 이름, 성별, 연령 등의 정보가 조회 되었습니다. 그러나 오른쪽 테이블에서 가져오던 그들의 구매 날짜와 구매 금액에 대한 데이터가 존재하지 않기 때문에 전부 NULL값이 나왔습니다. 이것이 LEFT JOIN의 모습입니다. 왼쪽 테이블과 공통되는 값이 없다며 왼쪽 테이블 내의 행을 건너뛰고 버리지 않습니다.지금은 더 복잡한 경우를 체크합니다.

하나의 쿼리 중에 몇 차례의 LEFT JOIN분석을 하면 2개의 탁자만으로는 분석이 어렵고 3개 이상의 테이블을 조인해야 하는 상황이 발생합니다. 그래서 이번에는 3개 이상의 테이블을 LEFT JOIN하는 모습을 보이고 보냅니다. 아래 테이블을 보세요.3. 프로모션 테이블(promotions)idcampaigncustomer_iddate1SMS_discount1022019-09-012SMS_discount1032019-09-013SMS_discount1052019-09-01우리는 해당 테이블을 활용하고 최근 진행한 프로모션이 고객의 구매에 영향을 미쳤는지 궁금합니다. 이를 구하려면 고객(customers)매출(sales)프로모션(promotion)총 3개의 테이블을 조인해야 합니다. 우리가 원하는 정보가 세개의 탁자에 흩어지고 있기 때문입니다.SELECTc.id, c.first_name, c.last_name, c.gender, c.age, c.customer_since, s.date AS sale, p.date AS promotionFROM customers AS cLEFT JOIN sales AS sON c.id=s.customer_idLEFT JOIN promotions AS pON c.id=p.customer_id의 위 쿼리를 실행하면 다음과 같은 결과를 얻습니다.idfirst_namelast_namegender agecustomer_sincesale promotion 1 Daniel Black M34 2014-10-13 [NULL] [NULL] 2 Erik Brown M25 2015-06-10-01 2019-09-013 Diana TrumpF 392015-10-25 2019-09-02 2019-01 4 Anna YaoF 192017-02-2019-10-01 [NULL] 5 Christian Sand 31M만약 3개의 테이블을 이노조인으로 맞췄다면 결과 테이블은 구입하거나 프로모션에도 참여한 고객만 조회되었을 것입니다.LEFTJOIN은 한 테이블에는 값이 있지만 다른 테이블에는 해당 값이 없어도 여전히 기존 행을 조회할 수 있습니다.고객1을 보겠습니다. 고객 1은 구매도 하지 않았고 프로모션 메시지를 받은 적도 없습니다.그럼에도 불구하고 우리는 고객 1에 관한 기본적인 정보 조회를 받지 않았습니까?이게 바로 LEFT JOIN의 힘입니다.고객4도 볼까요?이 고객의 경우 구매 내력은 있지만 프로모션 메시지를 받은 적은 없습니다.고객 5의 경우 구매 이력은 없지만 프로모션 메시지는 받았습니다.마지막으로 구매 이력도 있고 프로모션 메시지도 받은 고객 2와 3도 결과 테이블에서 볼 수 있습니다.이 2명의 고객의 결과는, INNERJOIN을 사용했을 때에도 얻을 수 있는 결과일 것입니다.

이 테이블의 결과를 얻기 위해 작성한 쿼리문으로 돌아가면 두 번째 테이블(sales)과 세 번째 테이블(promotions)을 조인하기 위해 첫 번째 테이블(customers)과 겹치는 열을 사용했습니다.하지만 항상 첫 번째 줄과 겹치는 줄을 찾아 조인해야 하는 것은 아닙니다.세 번째 테이블을 조이기 위해 두 번째와의 공통 열을 사용해도 괜찮습니다.아래 예시에서 해당 사례를 살펴보겠습니다.

이번에는 고객들에게 반응이 좋았던 책의 장르를 알아보도록 하겠습니다.이러한 분석은 고객에게 본 추천과 같은 개인화된 경험을 제공할 수 있기 때문에 매우 유용한 정보입니다.해당 분석을 위해 총 3개의 테이블에서 각기 다른 데이터를 가져올 예정입니다. 테이블은 customers 테이블, sales 테이블, books 테이블입니다.이미 아까 customers와 sales 테이블을 조인한 적이 있기 때문에 세 번째 테이블인 books만 추가로 조인하는 과정을 보여드리겠습니다.

4. 본 테이블 (books) idnameauthorgen requantity price 1 The Lordofthe Rings J.R. Tolkienfantasy 712.992 Lolita Bladimira Nobokovnvel 414.994 The Hobbit J.R. Tolkienfantasy 1010.755 Deathonthe Nile Agatha Christie dimira Nobokovnvel 414.994 The Hobbit J.SELECTc.id, c.first_name, c.last_name, s.date AS sale, b.name AS book, b.genreFROMcustomersAScLEFTJOINsalesASsONc.id=s.customer_idLEFTJOINbooksASbONs.book_id=b.id; 아래는 customers, sales, books 테이블을 LEFTJOIN한 결과입니다. 테이블의 구성을 보면 최근 특정 고객이 주문한 책의 이름과 장르라는 정보가 고객의 정보에 합쳐졌음을 확인할 수 있습니다.idfirst_namelast_namesalebookgenre 1 DanielBlack [NULL] [NULL] 2 ErikBrown 2019-10-01 The Lordofthe Ringsfantasy 3 Diana Trump 2019-09-02 Lolitanovel 4 AnnaYao 2019-10-01 [NULL] [NULL] 5 Christian Sanders [NULL] [NULL]에서도 우리 INNERJOIN

error: Content is protected !!