[코테] 프로그래머스 SQL 고득점 Kit - SELECT 21번

ʕ•ﻌ•ʔ·2024년 3월 25일
0

코딩테스트 (SQL)

목록 보기
15/31
post-thumbnail

❇️ SELECT

  • 💡 조회

    • select 열 from 테이블 where 조건 order by asc / desc;

  • 💡 조건

    • 다중 : where (조건1) and (조건2)
    • 문자열 : where 열 like '문자'
      • where 열 like '____03___'
      • where 열 like '%사원'
    • 널 제외 : where 열 is not null

  • 💡 날짜 변환

    • select 열1, 열2, date_format(날짜열, '%Y-%m-%d') as 날짜열 from 테이블

  • 💡 정렬

    • 열1 오름차순, 같으면 열2 내림차순 : order by 열1 asc, 열2 desc;

  • 💡 집계함수

    • select 집계함수(열1) from 테이블이름;
      - 행 개수 : count( )
      - 합 : sum( )
      - 평균 : avg( )
      - 최소 : min( )
      - 최대 : max( )

  • 💡 그룹화

    • select 열1, 열2 from 테이블 group by 열1, 열2 having 조건 (order by 열1 정렬);
      - 그룹화 : GROUP BY 열 HAVING 조건
      - (ex) HAVING COUNT(*) > 1
      - GROUP BY 열 : 열에 대해 같은 값을 가지는 친구들끼리 그룹별로 묶임
      - (실제 출력은 그 중 한 행만 대표로 출력. 실제로는 그룹으로 존재)
      - 정렬 : ORDER BY ▶ (ASC)/DESC

  • 💡 합치기

    • 구문1 union 구문2;
      - union : select 구문1의 결과와 구문2의 결과를 합쳐 출력

  • 💡 NULL 값으로 출력

    • select 열1, 열2, null as 열3;
      - 열3을 행이름으로 두고, 값은 null로

  • 💡 열의 최소 값 가진 행 출력

    • select 열1 from 테이블이름 where (열1 = (select min(열1) from 테이블이름));
      - where 조건에도 select 사용 가능
      - 단 (select 구문)을 꼭 괄호로 감싸줘야함

  • 💡 숫자 값 비교

    • 열 between 수1 and 수2
      - 수1<=열<=수2 의미
      - 열>=수1 and 열<=수2 결과와 동일

  • 💡 반올림

    • select round((열), 반올림할 소수 자리)

  • 💡 빈 값 처리

    • select coalesce(열, '대체할 값') as 열 from 테이블이름

  • 💡 테이블 합치기

    • select a.열1, b.열2 from 테이블1 as a
      inner / left / right join 테이블2 as b on a.기준열 = b.기준열
      where ... group by ... having ... order by ...
    • 테이블1 (별칭: a) + 테이블2 (별칭: b) -> 기준열 같으면 합치기
    • inner join : 두 테이블 모두 있는 열만 살리기
    • left join : 왼쪽 테이블의 열은 모두 살리고, 오른쪽 테이블 열은 있는 것만
    • right join : 오른쪽 테이블 열 모두 살리고, 왼쪽 테이블 열은 있는 것만

  • 💡 서브쿼리 연결 (new)

    • 서브쿼리 연결할 때 in 사용
      • (ex) A 테이블에서 사번이 '2024'로 시작하는 사원의 담당사수 사번 출력
      • 1) 사수 이름 확인 : select 사수이름 from A where(사번 like '2024%')
      • 2) 사수 이름을 통해 사수 사번 가져오기 :
        select 사번 from A where 이름 in (select 사수이름 from A where(사번 like '2024%')

1. SELECT 21번 (1)

업그레이드 된 아이템 구하기


SELECT ITEM_ID, ITEM_NAME, RARITY FROM ITEM_INFO
WHERE ITEM_ID IN (
    SELECT ITEM_ID FROM ITEM_TREE
    WHERE PARENT_ITEM_ID IN (
        SELECT ITEM_ID FROM ITEM_INFO 
        WHERE RARITY = 'RARE'
    )
)
ORDER BY ITEM_ID DESC;

🍀 해설

1) ITEM INFO에서 RARITY가 RARE인 행 조회

SELECT ITEM_ID FROM ITEM_INFO 
WHERE RARITY = 'RARE'

2) ITEM TREE에서 1에 조회된 ITEM ID와 같은 값 가지는 PARENT ITEM ID 행의 ITEM ID 조회

SELECT ITEM_ID FROM ITEM_TREE
    --- 와 같은 값을 가지는 ITEM_TREE 테이블의 PARENT ITEM ID 행 조회
    WHERE PARENT_ITEM_ID IN (
    --- 1에 조회된 ITEM ID)
        SELECT ITEM_ID FROM ITEM_INFO 
        WHERE RARITY = 'RARE'
    )

3) ITEM INFO에서 2에 조회된 ITEM ID 행의 ITEM ID, ITEM NAME, RARITY 조회

SELECT ITEM_ID, ITEM_NAME, RARITY FROM ITEM_INFO
--- 와 같은 값을 가지는 ITEM_INFO 테이블의 ITEM ID 행 조회
WHERE ITEM_ID IN (
    --- 2에 조회된 ITEM ID
    SELECT ITEM_ID FROM ITEM_TREE
    --- 와 같은 값을 가지는 ITEM_TREE 테이블의 PARENT ITEM ID 행 조회
    WHERE PARENT_ITEM_ID IN (
        --- 1에 조회된 ITEM ID
        SELECT ITEM_ID FROM ITEM_INFO 
        WHERE RARITY = 'RARE'
    )
)
ORDER BY ITEM_ID DESC;


2. SELECT 21번 (2)

  • inner join으로 더 간결히 가능

SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY FROM ITEM_INFO AS I 
INNER JOIN ITEM_TREE AS T ON I.ITEM_ID = T.ITEM_ID
WHERE T.PARENT_ITEM_ID IN(
    SELECT ITEM_ID FROM ITEM_INFO 
    WHERE RARITY = 'RARE')
ORDER BY I.ITEM_ID DESC;
profile
김햄톨

0개의 댓글

관련 채용 정보