본문 바로가기

SQL

[SQL] 메타코드M '데이터분석가 입문 필수 SQL 부트캠프' 강의 후기 #3 - Having, Join 등

728x90
반응형

 

  메타코드M '데이터분석가 입문 필수 SQL 부트캠프' 강의의 제 3과목을 다루고자 한다. 지난 시간에 배웠던 GROUP BY에 HAVING을 넣어 조건을 부여할 것이고, JOIN으로 여러 테이블을 연계하여 데이터를 조회하고자 한다. 난이도가 있는 만큼 반복적인 학습이 요구된다. 

 

메타코드M

빅데이터 , AI 강의 플랫폼 & IT 현직자 모임 플랫폼ㅣ메타코드 커뮤니티 일원이 되시기 바랍니다.

mcode.co.kr

 

※ 제1과목: 2024.02.11 - [SQL] - [SQL] 메타코드M '데이터분석가 입문 필수 SQL 부트캠프' 강의 후기#1 - SQL 설치, SELECT문 등

※ 제2과목: 2024.02.12 - [SQL] - [SQL] 메타코드M '데이터분석가 입문 필수 SQL 부트캠프' 강의 후기 #2 - WHERE, ORDER BY, GROUP BY 등

 

Index

    제 3과목

    HAVING

    SELECT productcode, sum(quantityordered) AS totalquan
    FROM orderdetails
    GROUP BY productcode
    HAVING totalquan >= 500
    LIMIT 7;

    SQL Having

    • Having: Group By 구문과 함께 사용. 그룹핑된 결과에 조건을 부여하는 데 쓰임.
    • Where 구문은 각 테이블에 대한 조건을 적용. ↔ Having 구문은 Group By로 집계된 결과값에 대한 조건 부여.

    IF / CASE

    SELECT checknumber, amount, if(amount > 50000, 'L', 'S') AS size
    FROM payments;
    
    --
    SELECT productname, buyprice, 
    	case 
    		when buyprice < 20 then 'cheap'
    		when buyprice BETWEEN 20 AND 50 then 'moderate'
    		ELSE 'expensive'
    	END AS category
    FROM products; 
    
    -- 
    SELECT firstname, lastname, jobtitle,
    	case jobtitle
    		when 'sales rep' then 'sales team'
    		when 'VP sales' then 'management'
    		when 'VP marketing' then 'management'
    		ELSE 'other'
    	END AS 'position'
    FROM employees
    ORDER BY POSITION;

    SQL IF
    SQL Case

    • If, Case는 SELECT절에서 특정 조건일 때, 어떤 데이터를 출력할지 지정하는 역할.
    • 구조
      • IF(조건, 참일 때 결과값, 거짓일 때 결과값)
      • CASE  / WHEN 조건 / THEN 출력값 / ELSE 출력값 (나머지 경우) / END AS 컬럼 별칭.
      • CASE 바로 뒤에 컬럼명이 오는지 확인.

    JOIN

      MySQL 샘플 데이터베이스가 아니라 test에 신규 테이블을 추가하여 진행했다. HeidiSQL의 좌측 리스트에서 test 테이블을 한 번 클릭하고 Create Table을 시도해야 한다.

    Inner Join

    Inner Join

    SELECT * FROM ex3 JOIN ex4 ON ex3.id = ex4.id;

      Inner Join은 각 테이블에서 모두 가지고 있는 데이터를 출력한다.

    Left Join

    Left Join 개념

    SELECT * FROM ex3 LEFT JOIN ex4 ON ex3.id = ex4.id;
    
    -- 교집합 제외
    SELECT * 
    FROM ex3 LEFT JOIN ex4 ON ex3.id = ex4.id
    WHERE ex4.id IS null;

    Left Join 결과

      A라는 테이블을 B 테이블과 합하는데 A 테이블 (ex3)의 데이터는 모두 살리고 B 테이블 (ex4)의 데이터는 A 테이블과 접점이 있는 것만 보여준다.

    Right Join

    Right Join 개념

    SELECT * 
    FROM ex3 RIGHT JOIN ex4 ON ex3.id = ex4.id;
    
    -- 교집합 제외
    SELECT * 
    FROM ex3 RIGHT JOIN ex4 ON ex3.id = ex4.id
    WHERE ex3.id IS NULL;

    Right Join 결과

      Left Join의 케이스와 반대로 A라는 테이블을 B 테이블과 합하는데 B 테이블의 데이터는 모두 살리고 A 테이블의 데이터는 B 테이블과 접점이 있는 것만 보여준다.

    Union

    SELECT id FROM ex3  
    UNION 
    SELECT id FROM ex4;
    
    --
    SELECT id FROM ex3  
    UNION all
    SELECT id FROM ex4;

    SQL Union

    • Union: 두 테이블의 데이터를 세로로 나열. 이 때, 컬럼의 수가 동일해야 하고, 중복값은 제거됨.
    • Union All: Union과 비슷하나 중복된 값도 그대로 표시됨.

    Full Outer Join

    Full Outer Join 개념

    SELECT ex3.id, ex3.name, ex3.age, ex4.id, ex4.region
    FROM ex3 LEFT JOIN ex4 ON ex3.id = ex4.id
    UNION
    SELECT ex3.id, ex3.name, ex3.age, ex4.id, ex4.region
    FROM ex3 RIGHT JOIN ex4 ON ex3.id = ex4.id
    WHERE ex3.id IS NULL;

    Full Outer Join 결과

      Left Join으로 A 테이블 (ex3)의 데이터를 가져오고, 데이터가 Null인 Right Join한 테이블 (ex3과 교집합이 없는 ex4, 회색 표시)과 Union하여 데이터를 나열하는 것으로 합집합을 표현할 수 있다.

    SQL Join 실전문제

    -- #1
    SELECT p.productcode, p.productname, o.priceeach, p.buyprice, o.quantityordered   
    FROM products p
    JOIN orderdetails o ON p.productcode = o.productcode
    WHERE o.priceeach >= 2.5 * p.buyprice;
    
    -- #2
    SELECT CONCAT(e.firstname, ' ', e.lastname) AS NAME, SUM(p.amount)
    FROM employees e
    JOIN customers c ON e.employeenumber = c.salesRepEmployeeNumber
    JOIN payments p ON c.customerNumber = p.customerNumber
    GROUP BY e.employeeNumber;
    
    -- #3
    SELECT p.productname, sum(od.quantityordered) AS totalquan
    FROM products p
    JOIN orderdetails od ON p.productcode = od.productcode
    JOIN orders o ON od.ordernumber = o.ordernumber
    WHERE YEAR(o.orderdate) = 2004
    group BY p.productcode 
    ORDER BY totalquan desc
    LIMIT 5;

    #2 결과
    #3 결과

    • 테이블의 별칭을 지정하여 간략히 표현할 수 있다.
    • Concat(컬럼명1, 컬럼명2)로 두 컬럼의 데이터를 이어서 표시할 수 있다. (공백 표현 가능)
    • 3개 이상의 테이블 조인: 두 테이블을 먼저 병합하고 하나를 추가로 조인한다.
    • Select - From (Join) - Where - Group By (Having) - Order By - Limit 순으로 코딩.

      Case와 3개 이상의 테이블의 Join이 까다로웠다. 게다가 메타코드M '데이터분석가 입문 필수 SQL 부트캠프' 강의에서는 힌트가 주어졌지만 실전에서는 스스로 테이블을 보고 어떻게 Join할지 판단할 수 있어야 할 것이다.

      4과목에서는 Window 함수, Lead 함수 등을 다룬다. 오늘 강의까지는 기존에 해본 적이 있었지만 4과목의 내용은 처음 접하는 것이다. 생소하여 다소 어려울 수 있겠으나 지식의 확장을 위해서는 미지의 세계에 도전해야만 한다. 용기와 의지를 가지고 식견을 넓혀나가도록 하자. 

    728x90
    반응형