본문 바로가기
복기

[SQL] 프로그래머스 고득점 Kit SELECT

by nahowo 2025. 2. 15.

https://school.programmers.co.kr/learn/courses/30/parts/17042

 

GROUP BY

  • SELECT 문에 있는 모든 열은 집계 함수가 되거나 GROUP BY절에 나타나야 함

NTILE & CASE

https://school.programmers.co.kr/learn/courses/30/lessons/301649?language=mysql

SELECT ID, 
    CASE
        WHEN NR = '1' THEN 'CRITICAL'
        WHEN NR = '2' THEN 'HIGH'
        WHEN NR = '3' THEN 'MEDIUM'
        WHEN NR = '4' THEN 'LOW'
    END AS COLONY_NAME
FROM (
    SELECT ID, NTILE(4) OVER (
            ORDER BY SIZE_OF_COLONY DESC) AS NR
    FROM ECOLI_DATA) AS t
ORDER BY ID;
  • CASE
    • CASE - END AS {컬럼명}
    • WHEN - THEN
  • NTILE
    • NTILE({나눌 단위}) OVER (ORDER BY {정렬 기준 컬럼})

WITH

https://school.programmers.co.kr/learn/courses/30/lessons/301649?language=mysql

WITH LANKING AS (
    SELECT NTILE(4)
        OVER (ORDER BY SIZE_OF_COLONY DESC)
        AS LANK, ID
    FROM ECOLI_DATA)

SELECT ID,
    (CASE
        WHEN LANK = 1 THEN 'CRITICAL'
        WHEN LANK = 2 THEN 'HIGH'
        WHEN LANK = 3 THEN 'MEDIUM'
        ELSE 'LOW'
    END
    ) AS COLONY_NAME
FROM LANKING
ORDER BY ID
  • 서브쿼리를 저장해 테이블처럼 사용할 수 있다. 반복이나 재귀 등에 사용할 수 있다.
  • 여러 서브쿼리를 저장할 때에는 WITH을 여러개 작성하는 것이 아니라 컴마로 구분하여 작성한다.
  • WITH A AS ( ...) , B AS ( ...)

IFNULL/LEFT OUTER JOIN

https://school.programmers.co.kr/learn/courses/30/lessons/299305?language=mysql

WITH CC AS (
    SELECT PARENT_ID, COUNT(*) AS CHILD_COUNT
    FROM ECOLI_DATA
    WHERE
        PARENT_ID IS NOT NULL
    GROUP BY PARENT_ID)

SELECT A.ID, IFNULL(CC.CHILD_COUNT, 0) AS CHILD_COUNT
FROM ECOLI_DATA AS A
LEFT JOIN CC
    ON A.ID = CC.PARENT_ID
  • LEFT JOIN
    • 왼쪽(A) 컬럼의 모든 정보를 포함시킨다. 매칭되지 않으면 NULL값이 채워진다.
  • IFNULL
    • IFNULL({컬럼명}, {NULL을 치환할 값})

UNION(합집합)

https://school.programmers.co.kr/learn/courses/30/lessons/131537?language=mysql

SELECT A.SALES_DATE, A.PRODUCT_ID, A.USER_ID, A.SALES_AMOUNT
FROM (
    SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
        FROM ONLINE_SALE
    UNION
    SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
        FROM OFFLINE_SALE) AS A
WHERE
    YEAR(SALES_DATE) = '2022'
    AND
    MONTH(SALES_DATE) = '3'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
  • UNION은 중복을 제거해 병합, UNION ALL은 중복을 포함해 병합한다.
  • {테이블 1} UNION {테이블 2} AS {별칭}
  • NULL AS/0 AS
    • 테이블 1에만 존재하고 테이블 2에는 존재하지 않는 컬럼일 때 NULL AS {컬럼명}으로 합집합이 가능하다.
    • 컬럼 순서를 맞춰 NULL AS {컬럼명} 대신 NULL만 작성해도 똑같이 동작한다.

INTEREECT(교집합)

  • 두 테이블 모두에 포함된 행을 검색한다.

MINUS(차집합)

  • 첫 번째 테이블에서 두 번째 테이블의 행을 제거한 행을 검색한다.

'복기' 카테고리의 다른 글

[SQL] LEETCODE SQL 50 문제풀이  (0) 2025.03.06
[SQL] 프로그래머스 고득점 Kit GROUP BY  (0) 2025.02.17
[모의고사] 구현 1회차 복기  (0) 2025.02.04
[모의고사] DP 1회차 복기  (0) 2025.02.04