[SQL] 프로그래머스 SQL 고득점 KIT 문제 풀이_SELECT

bin1225·2024년 11월 16일
0

DATABASE

목록 보기
17/19
post-thumbnail

데이터베이스를 이용하기 위해서 SQL문을 쓸 줄 알아야할 것 같다.
익숙해지기 위해 프로그래머스에 있는 문제를 차근차근 풀어볼 생각이다.

Selcect

가장 큰 물고기 10마리 구하기 (Level 1)

문제

FISH_INFO 테이블에서 가장 큰 물고기 10마리의 ID와 길이를 출력하는 SQL 문을 작성해주세요. 결과는 길이를 기준으로 내림차순 정렬하고, 길이가 같다면 물고기의 ID에 대해 오름차순 정렬해주세요. 단, 가장 큰 물고기 10마리 중 길이가 10cm 이하인 경우는 없습니다.

ID 컬럼명은 ID, 길이 컬럼명은 LENGTH로 해주세요.

풀이

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

배운 점

진짜 첫 sql문제였는데, 내 상태가 심각하다는 걸 깨달았다.
부끄럽지만 구글링을 통해 LIMIT의 존재를 알았다.. 하
어차피 코드도 짧고 틈틈히 풀기 좋을 것 같으니 당분간 노력 좀 해야겠다.


평균 일일 대여 요금 구하기(Level 1)

코드

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV";

배운 점

  • ROUND(숫자, 반올림할 위치)
    • 0을 기준으로 음수면 소수점 우측, 양수면 소수점 좌측 위치를 기준으로 한다.

과일로 만든 아이스크림 고르기(Level 1)

코드

SELECT FLAVOR FROM FIRST_HALF
WHERE TOTAL_ORDER > 3000
AND FLAVOR IN (SELECT FLAVOR 
                FROM ICECREAM_INFO 
                WHERE INGREDIENT_TYPE = "fruit_based")
ORDER BY TOTAL_ORDER DESC;

배운 점

IN을 이용하여 특정 값이 서브쿼리 결과 내에 존재하는지 확인할 수 있다.


조건에 부합하는 중고거래 댓글 조회하기 (Level 1)

문제

USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

코드

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS B JOIN USED_GOODS_REPLY AS R
ON B.BOARD_ID = R.BOARD_ID
WHERE DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = "2022-10"
ORDER BY R.CREATED_DATE, B.TITLE;

배운 점

  • 날짜 포맷 변경 후 비교
 DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = "2022-10"

재구매가 일어난 상품과 회원 리스트 구하기(Level 2)

문제

ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

코드

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*)>1
ORDER BY USER_ID, PRODUCT_ID DESC;

배운 점

  • GROUP BY 문으로 특정 컬럼의 속성별 집합을 구성한 후 집계함수를 사용해 결과를 얻어올 수 있다.
  • HAVING COUNT(*)문으로 특정 속성 집합에 포함되는 요소의 개수를 구할 수 있다.

강원도에 위치한 생산공장 목록 출력하기(Level 1)

문제

FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.

코드

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID;

배운 점

  • LIKE 로 특정 키워드를 조건으로 검색할 수 있다.

12세 이하인 여자 환자 목록 출력하기(Level 1)

문제

PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

코드

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO,"NONE")
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = "W"
ORDER BY AGE DESC, PT_NAME;

배운 점

  • IFNULL
    특정 값이 NULL인 경우 default값을 지정할 수 있다.

조건에 맞는 도서 리스트 출력하기(Level 1)

문제

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

코드

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, "%Y-%m-%d") AS PUBLISHED_DATE
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021 AND CATEGORY = "인문"
ORDER BY PUBLISHED_DATE;

조건에 맞는 회원수 구하기(Level 1)

문제

USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.

코드

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
AND AGE BETWEEN 20 AND 29;

배운 점

  • COUNT(*) = COUNT(1)
  • COUNT(컬럼명): NULL값을 제외하고 가져온다

업그레이드 된 아이템 구하기(Level 2)

문제

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.

코드

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


조건에 맞는 개발자 찾기(Level 2)

문제

DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.

결과는 ID를 기준으로 오름차순 정렬해 주세요.

코드

SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS D
JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE)>0
WHERE S.NAME IN("Python", "C#")
ORDER BY D.ID;

특정 물고기를 잡은 총 수 구하기(Level 2)

문제

FISH_INFO 테이블에서 잡은 BASS와 SNAPPER의 수를 출력하는 SQL 문을 작성해주세요.
컬럼명은 'FISH_COUNT`로 해주세요.

코드

SELECT COUNT(*) AS 'FISH_COUNT'
FROM FISH_INFO A
JOIN FISH_NAME_INFO B
ON A.FISH_TYPE = B.FISH_TYPE
WHERE B.FISH_NAME IN('BASS', 'SNAPPER');

부모의 형질을 모두 가지는 대장균 찾기(Level 2)

문제

부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.

코드

SELECT A.ID, A.GENOTYPE, B.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA A
JOIN ECOLI_DATA B 
ON A.PARENT_ID = B.ID
WHERE (A.GENOTYPE & B.GENOTYPE) = B.GENOTYPE
ORDER BY A.ID;

&연산을 활용하여 부모의 형질을 모두 보유하고 있는지 확인할 수 있다.

대장균들의 자식의 수 구하기(Level 3)

문제

대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

코드

SELECT A.ID, COUNT(B.PARENT_ID) AS CHILD_COUNT
FROM ECOLI_DATA A
LEFT JOIN ECOLI_DATA B 
ON A.ID = B.PARENT_ID
GROUP BY A.ID
ORDER BY A.ID;

LEFT JOIN으로 테이블을 구성하여 모든 ID를 포함하도록 한다.
GROUP BY의 결과는 집계함수의 인수로 전달된다. A.ID로 그룹화 한 후 COUNT의 인수로 전달한다.
COUNT(B.PARENT_ID)로 컬럼명을 지정함으로써 NULL값인 ROW는 카운트 하지 않는다.


대장균의 크기에 따라 분류하기 1(Level 3)

문제

대장균 개체의 크기가 100 이하라면 'LOW', 100 초과 1000 이하라면 'MEDIUM', 1000 초과라면 'HIGH' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류(SIZE)를 출력하는 SQL 문을 작성해주세요.이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

코드

SELECT ID, 
CASE 
    WHEN SIZE_OF_COLONY <= 100 THEN 'LOW'
    WHEN SIZE_OF_COLONY <= 1000 THEN 'MEDIUM'
    ELSE 'HIGH'
END AS SIZE
FROM ECOLI_DATA
ORDER BY ID;

CASE WHEN을 이용해 조건과 반환값을 지정하여 출력할 수 있다.


대장균의 크기에 따라 분류하기 2(Level 3)

문제

대장균 개체의 크기를 내름차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 . 단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

코드

-- 코드를 작성해주세요
SELECT A.ID,
CASE
    WHEN A.PER <= 0.25 THEN 'CRITICAL'
    WHEN A.PER <= 0.5 THEN 'HIGH'
    WHEN A.PER <= 0.75 THEN 'MEDIUM'
    ELSE 'LOW'
END AS COLONY_NAME
FROM (SELECT ID, PERCENT_RANK()OVER(ORDER BY SIZE_OF_COLONY DESC) AS PER 
     FROM ECOLI_DATA) AS A
ORDER BY A.ID;
  • PERCENT_RANK()OVER()을 사용하여 그룹 내의 상대적 위치를 나타내는 값을 얻을 수 있다.

  • 서브 쿼리를 이용해 테이블을 가져올 때는 별칭을 지정해줘야 한다.

2개의 댓글

comment-user-thumbnail
2024년 11월 18일

오 나도 이거 했는데! 정리가 아주 잘되어있네

1개의 답글