본문 바로가기
부트캠프(LIKELION AIS7)/수업

[AI스쿨 7기, 2주차] SQL 중급(1)

by aimaimee 2023. 4. 13.

220930 데이터리안 수업 SELECT문에 들어가는 조건 CASE WHEN ~ THEN~ END / 피봇 테이블/ 문제 실습 (인프런중급SQL강의, 집계함수, SUM(), AVG(), DISTINCT, GROUP BY, HAVING, 해커스랭크, 조건문, 리트코드 등)

1교시

1. 인프런 중급 SQL 강의 ~조건문까지

1.1 집계 함수

SELECT COUNT(*)
FROM 테이블
테이블에 있는 행들, 데이터 레코드의 갯수를 세준다.

  • Null 값이 없으면 COUNT(칼럼)으로 특정 칼럼 검색해도 전체 레코드 갯수랑 똑같이 나온다.
  • SELECT COUNT(DISTINCT 칼럼) : 칼럼의 중복된 값 제외하고 갯수 세준다.
  • SELECT DISTINCT 칼럼
  • SUM(), AVG()
  • Null 값이 있을 때, 없다고 생각하고 4로 나눌 것이냐, 전체 자료수 COUNT(*)로 나눌 것이냐

1.2 GROUP BY, HAVING

SELECT 칼럼1, 칼럼2, AVG(칼럼3)
FROM 테이블
GROUP BY 칼럼1, 칼럼2

  • 그룹바이에 들어간 항목은 SELECT에 꼭 들어가야 한다.
  • 항목 확인할 때는 /* */ 활용해서 찾자
  • 한 줄 주석 처리는 --
  • ORDER BY는 그룹바이 뒤에
  • HAVING은 그룹바이 뒤에: SQL은 순서대로 실행하기 때문에 WHERE을 쓰면 원하는 결과가 안나온다.

1.3 해커스랭크 문제

인터프리터 MySQL로 바꾸는거 잊지 말자!!

  • Revising Aggregations - Averages
  • Revising Aggregations - The Sum Function
  • Average Population : CEIL()올림, FLOOR()내림- rounded down이 문제에 있을 때, ROUND() 반올림
  • Population Density Difference
  • Weather Observation Station 4
  • Top Earners
    - salary*months = earnings
    • 각 earning 별로 몇 명이 그만큼 벌었는지 계산 - 그룹바이
    • earning 중에 가장 큰 값을 가져온다. - 내림차순, LIMIT
      SELECT salary months AS earnings
      , COUNT()
      FROM employee
      GROUP BY earnings
      ORDER BY earnings DESC
      LIMIT 1

1.4 조건문

SELECT CASE
WHEN 칼럼1=1 AND 칼럼2=1 THEN '첫번째케이스'
WHEN 칼럼1=2 THEN '두번째케이스'
ELSE '기타'
END AS '케이스이름', *
FROM 테이블

1.5 해커스 랭크 문제

  • Type of Triangle
    WHEN A=B OR A=C OR B=C 하면 정삼각형도 이등변삼각형 조건에 포함된다.
    하지만 정삼각형은 위에서 정했기 때문에 아래로 내려오지 않는다.
    - WHEN A=B AND B=C THEN
    - 20 20 40이 이등변삼각형에 포함안되게 하기 위해 삼각형이 아닌 조건을 먼저 넣는다.
    SELECT CASE
    WHEN A = B AND B = C THEN 'Equilateral'
    WHEN A + B <=C OR A+C <= B OR B+C <= A THEN 'Not A Triangle'
    WHEN A=B OR A=C OR B=C THEN 'Isosceles'
    ELSE 'Scalene'
    END
    FROM Triangles
  • A=B=C 와 같은 연산은 지원하지 않는다. SQL에서

1.6 테이블 피봇 문제 Leetcode

  1. 1179번 Reformat Department Table
    SELECT id
    , SUM(CASE WHEN month = 'Jan' THEN revenue ELSE NULL END) AS Jan_Revenue
    , SUM(CASE WHEN month = 'Feb' THEN revenue ELSE NULL END) AS Feb_Revenue
    , SUM(CASE WHEN month = 'Mar' THEN revenue ELSE NULL END) AS Mar_Revenue
    , SUM(CASE WHEN month = 'Apr' THEN revenue ELSE NULL END) AS Apr_Revenue
    , SUM(CASE WHEN month = 'May' THEN revenue ELSE NULL END) AS May_Revenue
    , SUM(CASE WHEN month = 'Jun' THEN revenue ELSE NULL END) AS Jun_Revenue
    , SUM(CASE WHEN month = 'Jul' THEN revenue ELSE NULL END) AS Jul_Revenue
    , SUM(CASE WHEN month = 'Aug' THEN revenue ELSE NULL END) AS Aug_Revenue
    , SUM(CASE WHEN month = 'Sep' THEN revenue ELSE NULL END) AS Sep_Revenue
    , SUM(CASE WHEN month = 'Oct' THEN revenue ELSE NULL END) AS Oct_Revenue
    , SUM(CASE WHEN month = 'Nov' THEN revenue ELSE NULL END) AS Nov_Revenue
    , SUM(CASE WHEN month = 'Dec' THEN revenue ELSE NULL END) AS Dec_Revenue
    FROM Department
    GROUP BY id

2교시

RFM Segmentation. CRM 마케팅 할 때 많이 사용된다.

  • CASE WHEN 날짜>='YYYY-MM-DD' THEN 1 ELSE 0 END
  • IF(주문수>=숫자, 맞으면 1, 틀리면 0) : 조건 만족하면 1, 아니라면 0 반환하여라
  • SELECT CASE~ AS 새이름1
    IF
    AS 새이름2
    COUNT(칼럼1) AS 새이름3
    FROM 테이블
    GROUP BY 새이름1, 새이름2 로 해도 된다.
  • 엑셀에서 삽입-피봇테이블 : 만들고 싶은 데이터 영역 지정, 만들기 하면 뼈대가 완성됨.
  • 엑셀에서 행과 열에 원하는 정보를 끌어서 옮겨도 되고, 추가해도 된다.

3교시 랜덤 문제 풀기

  • CASE WHEN 조건 THEN 칼럼 END (ELSE NULL) AS 새이름
    괄호 부분은 굳이 필요없는 조건
  • 제일 돈 많이 낸 사람 : 총 금액으로 ORDER BY DESC해서 LIMIT 1
  • WHERE 조건이 여러 개 일 때 : WHERE A AND B AND(C OR D) 도 가능하다는 것을 잊지 말자
  • WHERE에 날짜 조건 있을 때 : BETWEEN 날짜 AND 날짜
  • ROUND(AVG(칼럼), 2- 소수점둘째자리)
  • 홀수 : WHERE 칼럼 % 2 = 1 : / 슬래시가 아니라 % 기호인 것 기억하자
  • UPPER(LEFT(칼럼, 추출할 자릿수))
  • WHERE -> GROUP BY -> HAVING : 그룹바이-해빙에 집착하지 말고, 그룹 바이 전 WHERE로 먼저 조건을 넣을 수 있다면 그게 깔끔할 수 있다.

댓글