첫 제출 답안은 아래와 같다
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
💡아이디어
- ITEM_TREE 테이블 에서 업그레이드가 가능한 정보를 선별
= PARENT_ITEM_ID가 NULL이 아닌 것- ITEM_INFO 테이블에서 희귀도가 'RARE'인 정보를 선별
- 1번과 2번의 select 결과를 join
여기서 1번의 PARENT_ITEM_ID가 2번의 ITEM_ID
(PARENT_ITEM_ID가 업그레이드 이전의 ID 정보이기 때문)- 마지막으로 업그레드될 아이템의 정보를 출력하기 위해서 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을 각각 한번만 사용해서 푼 쿼리도 있더라,,,
아직 배울 것이 많군 ㅎㅎ
제출한 답
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절에 다중 컬럼을 사용할 수 있다는 것도 배울 수 있었다
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)
SELECT COUNT(1) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL
SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
LIMIT 10
만약, ORACLE이라면 ROWNUM이 10이하인 것을 출력하면 될 듯하다
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