프로그래머스 SQL 고득점 kit - SELECT 3

BaeBae·2024년 11월 28일
0

문제풀이

목록 보기
8/8
post-thumbnail

📌 1. 업그레이드 된 아이템 구하기

첫 제출 답안은 아래와 같다

SELECT INFO_2.ITEM_ID, INFO_2.ITEM_NAME, INFO_2.RARITY
FROM (SELECT ITEM_ID, PARENT_ITEM_ID
        FROM ITEM_TREE
        WHERE PARENT_ITEM_ID IS NOT NULL) TREE
JOIN (SELECT ITEM_ID, ITEM_NAME, RARITY
        FROM ITEM_INFO
        WHERE RARITY = 'RARE') INFO ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
JOIN ITEM_INFO INFO_2 ON INFO_2.ITEM_ID = TREE.ITEM_ID
ORDER BY INFO_2.ITEM_ID DESC

💡아이디어

  1. ITEM_TREE 테이블 에서 업그레이드가 가능한 정보를 선별
    = PARENT_ITEM_ID가 NULL이 아닌 것
  2. ITEM_INFO 테이블에서 희귀도가 'RARE'인 정보를 선별
  3. 1번과 2번의 select 결과를 join
    여기서 1번의 PARENT_ITEM_ID가 2번의 ITEM_ID
    (PARENT_ITEM_ID가 업그레이드 이전의 ID 정보이기 때문)
  4. 마지막으로 업그레드될 아이템의 정보를 출력하기 위해서 ITEM_INFO를 TREE의 ITEM_ID로 한 번 더 join해준다.

통과는 했지만 서브쿼리 두개 + join 두개라
서브쿼리나 조인 중 하나라도 없애서 쿼리를 만들어보고 싶었다

그렇게 해서 나온 쿼리가 바로 아래 쿼리!

SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM (SELECT ITEM_ID, PARENT_ITEM_ID
        FROM ITEM_TREE
        WHERE PARENT_ITEM_ID IS NOT NULL) TREE
JOIN ITEM_INFO INFO ON INFO.ITEM_ID = TREE.ITEM_ID
WHERE TREE.PARENT_ITEM_ID IN (SELECT ITEM_ID
                                FROM ITEM_INFO
                                WHERE RARITY = 'RARE')
ORDER BY INFO.ITEM_ID DESC

비록 서브쿼리는 두개를 썼지만 ㅜㅜ
join 연산을 하나 줄인 것에 의미가 있다 생각한다

찾아보니 서브쿼리와 join을 각각 한번만 사용해서 푼 쿼리도 있더라,,,
아직 배울 것이 많군 ㅎㅎ

📌 2. Python 개발자 찾기

제출한 답

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python' OR SKILL_2 = 'Python' OR SKILL_3 = 'Python'
ORDER BY ID

다른 사람들의 풀이

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID

IN 절에 컬럼을 넣을 수 있다는 사실을 알 수 있었다
OR로 같은 값을 여러 컬럼에서 본다면 해당 컬럼들을 IN절에 넣어 간결하게 작성하자!
또한, 찾아보니 IN절에 다중 컬럼을 사용할 수 있다는 것도 배울 수 있었다

📌 3. 조건에 맞는 개발자 찾기

SELECT ID, EMAIL,FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE FROM SKILLCODES  WHERE NAME = 'Python')
OR SKILL_CODE & (SELECT CODE FROM SKILLCODES  WHERE NAME = 'C#')
ORDER BY ID

SQL의 비트연산에 대해 알아보고 연습해볼 수 있는 문제

비트 연산이란?
숫자를 2진수로 표현하여 각 비트 단위로 연산을 수행하는 것
SQL에서는 주로 특정 비트가 설정되어 있는 지 확인하는 데 사용함

비트연산의 종류
1. AND 연산 (&): 두 비트가 모두 1일 때만 1을 반환한다.
2. OR 연산 (|): 두 비트 중 하나라도 1이면 1을 반환한다.
3. XOR 연산 (^): 두 비트가 다르면 1, 같으면 0을 반환한다.
4. NOT 연산 (~): 비트를 반전시킨다.

비트연산의 예시

-- 예를 들어 2진수 1010 (10)과 0110 (6)을 AND 연산하면:

  1010
& 0110
------
= 0010

SELECT 10 & 6; -- 결과는 2 (0010)

-- 예를 들어 2진수 1010 (10)과 0110 (6)을 OR 연산하면:

  1010
| 0110
------
= 1110

SELECT 10 | 6;  -- 결과는 14 (1110)

📌 4. 잔챙이 잡은 수 구하기

SELECT COUNT(1) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL

📌 5. 가장 큰 물고기 10마리 구하기

SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
LIMIT 10

만약, ORACLE이라면 ROWNUM이 10이하인 것을 출력하면 될 듯하다

📌 6. 특정 물고기를 잡은 총 수 구하기

JOIN을 이용한 쿼리

SELECT COUNT(1) AS FISH_COUNT
FROM FISH_INFO INFO
JOIN FISH_NAME_INFO NAME ON INFO.FISH_TYPE = NAME.FISH_TYPE
WHERE NAME.FISH_NAME IN ('BASS', 'SNAPPER')

서브쿼리를 이용한 쿼리

SELECT COUNT(1) AS FISH_COUNT
FROM FISH_INFO INFO
WHERE FISH_TYPE IN (SELECT FISH_TYPE
                    FROM FISH_NAME_INFO
                    WHERE FISH_NAME IN ('BASS', 'SNAPPER'))

다음엔 대장균 시리즈를 풀어봐야지 ㅎㅎ


참고

[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산
[프로그래머스][SQL] Python 개발자 찾기 lv1

profile
Data가 좋은 Web 개발자

0개의 댓글