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

餘園·2025년 1월 13일

SQL 고득점 Kit

목록 보기
107/109
post-thumbnail

평균 일일 대여 요금 구하기

테이블에서 종류가 'SUV'인 상품들의 평균 일일 대여 요금을 출력, 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림, 컬럼명은 AVERAGE_FEE로 지정

--SQL문
SELECT ROUND(AVG(DAILY_FEE,0)) AS AVERAGE_FEE
	FROM TABLE
    WHERE TYPE='SUV'
  • 주의할 점 :
    • ROUND(값,숫자) -> (숫자)까지 반올림

3월에 태어난 여성 회원 목록 출력하기

테이블에서 생일에 3월인 여성 회원의 ID, 이름, 성별, 생년월일 조회, 전화번호가 NULL인 경우는 출력대상에서 제외, 결과는 회원ID 기준으로 오름차순 정렬

--SQL문
SELECT ID, NAME, GENDER, DATE_FORMAT(BIRTH,'%Y-%m-%d')
	FROM TABLE
    WHERE BIRTH LIKE '_____03%' AND GENDER='W' AND TLNO IS NOT NULL
    ORDER BY ID ASC
  • 주의할 점 :
    • '_%' 앞에 무조건 LIKE
    • WHERE 안에 조건 다 작성, WHERE 2개 X
    • DATE_FORMAT에서 %y는 25, %Y는 2025

흉부외과 또는 일반외고 의사 목록 출력하기

테이블에서 진료과가 CS이거나 GS인 의사의 이름, ID, 진료과, 고용일자를 조회, 결과는 고용일자 기준 내림차순, 같다면 이름 기준 오름차순

--SQL문
SELECT NAME, ID, CD, DATE_FORMAT(YMD, '%Y-%m-%d')
	FROM TABLE
    WHERE CD = 'CS' OR CD = 'GS'
    ORDER BY YMD DESC, NAME ASC
  • 주의할 점 :
    • OR 할 때 똑같은 컬럼이라도 각각 해주기

인기있는 아이스크림

상반기에 판매된 상품 맛을 총주문량 기준으로 내림차순 정렬, 같다면 출하 번호 기준으로 오름차순 정렬

--SQL문
SELECT FLAVOR FROM TABLE
	ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC

12세 이하인 여자 환자 목록 출력하기

테이블에서 12세 이하인 여자환자의 이름, 번호, 성별, 나이, 전화를 조회, 전화번호 없으면 'NONE' 출력, 나이 기준 내림차순, 같으면 이름 기준 오름차순

--SQL문
SELECT NAME, NO, GEN, AGE, COALESCE(TLNO, 'NONE')
	FROM TABLE
    WHERE AGE<=12 AND GEN='W'
    ORDER BY AGE DESC, NAME ASC
  • 주의할 점 :
    • COALESCE(컬럼명, '반환')
    • IFNULL과 IF(IS NULL은 왜 되지 않았는가...

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

테이블에서 강원도에 위치한 식품공장의 ID, 이름, 주소 조회, ID 기준으로 오름차순 정렬

--SQL문
SELECT ID, NAME, ADDRESS
	FROM TABLE
    WHERE ADDRESS LIKE '강원도%'
    ORDER BY ID ASC
  • 주의할 점 :
    • 조건 WHERE에 LIKE 사용하기

조건에 맞는 도서 리스트 출력하기

테이블에서 2021년 출판된 '인문' 카테고리에 속하는 도서 리스트 찾아서 ID, DATE 출력, DATE 기준 오름차순

--SQL문
SELECT ID, DATE_FORMAT(DATE,'%Y-%m-%d') AS DATE
	FROM TABLE
    WHERE DATE LIKE '2021%' AND CATEGORY='인문'
    ORDER BY DATE ASC
  • 주의할 점 :
    • WHERE 조건문에서 _% 안 들어가면 = 가능

모든 레코드 조회하기

ID 순으로 전체 조회

--SQL문
SELECT * FROM TABLE
	ORDER BY ID ASC

역순 정렬하기

테이블의 이름과 시작일을 조회, ID의 역순

--SQL문
SELECT NAME, DATE FROM TABLE
	ORDER BY ID ASC

아픈 동물 찾기

테이블에서 아픈 동물의 ID, 이름 조회, ID 순서

--SQL문
SELECT ID, NAME FROM TABLE
	WHERE CONDITION = 'Sick'
    ORDER BY ID ASC

어린 동물 찾기

테이블에서 젊은 동물(=not aged)의 아이디, 이름을 아이디 순으로 조회

--SQL문
SELECT ID, NAME FROM TABLE
	WHERE CONDITION != 'Aged'
    ORDER BY ID ASC

동물의 아이디와 이름

모든 동물의 아이디, 이름을 아이디 순으로 조회

-SQL문
SELECT ID, NAME FROM TABLE
	ORDER BY ID ASC

여러 기준으로 정렬하기

모든 동물의 아이디, 이름, 보호시작일을 이름 순으로 조회, 같으면 보호를 나중에 시작한 동물 먼저 조회

--SQL문
SELECT ID, NAME, DATE
	FROM TABLE
    ORDER BY NAME ASC, DATE DESC

가장 큰 물고기 10마리 구하기

테이블에서 가장 큰 물고기 10마리의 ID와 길이 출력, 길이를 기준으로 내림차순, 길이 같다면 ID 오름차순

--SQL문
SELECT ID, LENGTH FROM TABLE
	ORDER BY LENGTH DESC, ID ASC
    LIMIT 10
  • 주의할 점 :
    • LIMIT의 순서는 ORDER BY보다도 뒤인 제일 마지막

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

테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터 구하여, 재구매한 회원 ID와 상품 ID 출력, 회원 ID 기준 오름차순, 같다면 상품 ID 기준 내림차순

--SQL문
SELECT USER_ID, PRODUCT_ID
	FROM TABLE
    GROUP BY USER_ID, PRODUCT_ID
    HAVING COUNT(*)>1
    ORDER BY USER_ID ASC, PRODUCT_ID DESC
  • 주의할 점 :
    • GROUP BY - 여러 행을 하나의 그룹으로 묶을 수 있음
    • HAVING - GROUP BY 뒤에서 묶인 그룹을 집계함

상위 n개의 레코드

DATE가 가장 빠른 동물의 이름을 조회

--SQL문
SELECT NAME FROM TABLE
	ORDER BY DATE ASC
    LIMIT 1

Python 개발자 찾기

테이블에서 Python 스킬 가진 개발자 정보 조회, ID, 이메일, 이름, 성 조회하고 ID 기준 오름차순 정렬

--SQL문
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
	FROM TABLE
    WHERE SKILL_1='Python' OR SKILL_2='Python' OR SKILL_3='Python'
    ORDER BY ID ASC

과일로 만든 아이스크림 고르기

총주문량이 3000보다 높으면서 주성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회

--SQL문
SELECT f.FLAVOR FROM TABLE1 f
	JOIN TABLE2 i ON f.FLAVOR=i.FLAVOR
    WHERE f.TOTAL_ORDER > 3000
    AND i.INGREDIENT_TYPE = 'fruit_based'
    ORDER BY f.TOTAL_ORDER DESC
  • 주의할 점 :
    • JOIN은 공통된 컬럼 기준으로 둘 이상의 테이블을 하나로 결합함
      • INNER
      • LEFT
      • RIGHT
      • FULL
    • f와 i처럼 테이블명의 별칭을 지정함

조건에 부합하는 중고거래 댓글 조회하기

BORED와 REPLY 테이블에서 2022년 10월에 작성된 게시글의 제목, ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 작성일을 조회, 작성일 기준 오름차순, 같으면 게시글 제목 기준으로 오름차순

--SQL문
SELECT b.TITLE, BOARD_ID, r.REPLY_ID, r.WRITER_ID, r.CONTENTS, DATE_FORMAT(r.CERATED_DATE, '%Y-%m-%d')
	FROM USED_GOODS_BOARD b
    JOIN USED_GOODS_REPLY r
    ON b.BOARD_ID=r.BOARD_ID
    WHERE b.CERATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
    ORDER BY r.CREATED_DATE ASC, b.TITLE ASC
  • 주의할 점 :
    • LIKE '2022-10%'랑 BETWEEN AND 둘 다 됨
    • 문제를 잘 읽자...

조건에 맞는 회원수 구하기

테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력

--SQL문
SELECT COUNT(AGE) FROM TABLE
	WHERE JOINED LIKE '2021%'
    AND AGE BETWEEN 20 AND 29

잔챙이 잡은 수

잡은 물고기 중 길이가 10cm 이하인 물고기의 수 출력

--SQL문
SELECT COUNT(*) AS FISH_COUNT
	FROM FISH_INFO
    WHERE LENGTH IS NULL
  • 주의할 점 :
    • COUNT는 NULL 세지 않으므로 LENGTH 대신 * 사용

특정 형질을 가지는 대장균 찾기

2번 형질이 보유하지 않으면서 1번이나 3번 형질은 보유하고 있는 대장균 개체의 수 출력

--SQL문
SELECT COUNT(*) AS COUNT
	FROM TABLE
    WHERE GENOTYPE&2=0
    AND (GENOTYPE&1>0 OR GENOTYPE&4>0)
  • 주의할 점 :
    • 이진수 1번 형질은 2^0=1
    • 이진수 2번 형질은 2^1=2
    • 이진수 3번 형질은 2^2=4
    • 그러므로 3번 형질은 4 사용해서 0이 아닌 것(=보유) 탐색

특정 물고리를 잡은 총 수 구하기

테이블에서 잡은 BASS와 SNAPPER의 수를 출력

--SQL문
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='BASS' or b.FISH_NAME='SNAPPER'

조건에 맞는 개발자 찾기

테이블에서 Python이나 C# 스킬을 가진 개발자 정보 조회, ID, 이메일, 이름, 성 조회, ID 기준 오름차순

--SQL문
SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D
JOIN SKILLCODES AS S
ON (D.SKILL_CODE & S.CODE) = S.CODE AND  S.NAME IN ('Python', 'C#')
ORDER BY D.ID;
  • 주의할 점 :
    • ON 뒤에 저런걸 쓴다고..? 책 다시 찾아보자

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

아이템의 휘귀도가 'RARE'인 아이템의 모든 다음 업그레이트 아이템의 ID, 명, 희귀도 출력하고 ID 기준 내림차순

--SQL문
SELECT b.ID, a.NAME, a.RARITY
	FROM ITEM_INFO a
    JOIN ITEM_TREE b
    ON a.ID=b.ID
    WHERE b.PARENT_ID IN
    (SELECT ID FROM ITEM_INFO WHERE RARITY='RARE')
    ORDER BY a.ID DESC
  • 주의할 점 :
    • WHERE 안에 서브쿼리의 등장..!

대장균의 크기에 따라 분류하기 1

대장균 개체 크기가 100 이하라면 'LOW', 100 초과 1000 이하라면 'MEDIUM', 1000 초과라면 'HIGH'로 분류. ID, SIZE 출력, ID에 대해 오름차순

--SQL문
SELECT ID,
	CASE
    	WHEN SIZE_OF_COLONY<100 THEN 'LOW'
        WHEN SIZE_OF_COLONY>1000 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS SIZE
    FROM TABLE
    ORDER BY ID ASC
  • 주의할 점 :
    • case는 반드시 end as로 끝나야 함

부모의 형질을 모두 가지는 대장균 찾기

부모 형질을 모두 보유한 대장균의 ID, 형질, 부모 대장균의 형질을 출력, ID에 대해 오름차순

--SQL문
SELECT a.ID, a.GENOTYPE, b.GENOTYPE
	AS PARENT_GENOTYPE
    FROM TABLE a
    JOIN TABLE b
    ON a.PARENT_ID=b.ID
    WHERE (b.GENOTYPE&a.GENOTYPE)=b.GENOTYPE
    ORDER BY a.ID
  • 주의할 점 :
    • 같은 테이블끼리도 JOIN 활용 가능
    • 이진수는 여전히 이해가 안 된다..ㅠㅜ

대장균들의 자식의 수 구하기

대장균 개체의 ID와 자식의 수를 출력, 자식 없다면 자식의 수 0으로 출력, ID 기준 오름차순

--SQL문
SELECT a.ID, COUNT(b.ID) AS ChILD_COUNT
	FROM TABLE a
    LEFT JOIN TABLE b
    ON a.ID=b.PARENT_ID
    GROUP BY a.ID
    ORDER BY a.ID
  • 주의할 점 :
    • 자식이 없는 경우에도 부모가 결과에 포함되도록 LEFT JOIN
    • 부모 아이디 기준으로 집계하다록 GROUP BY

대장균의 크기에 따라 분류하기2

개체 크기를 내림차순으로 정렬할 때, 상위 0~25%를 'critical', 26~50%를 'high', 51~75%를 'medium', 76~100%를 'low'라고 분류한다. ID와 분류된 이름을 출력, ID에 대해 오름차순으로 정렬

--SQL문
SELECT ID,
	CASE
    	WHEN NTILE(4) OVER (ORDER BY SIZE DESC) = 1 THEN 'CRITICAL'
        WHEN NTILE(4) OVER (ORDER BY SIZE DESC) = 2 THEN 'HIGH'
        WHEN NTILE(4) OVER (ORDER BY SIZE DESC) = 3 THEN 'MEDIUM'
        WHEN NTILE(4) OVER (ORDER BY SIZE DESC) = 4 THEN 'LOW'
    END AS COLONY_NAME
    FROM TABLE
    ORDER BY ID
  • 주의할 점 :
    • NTILE(n)은 n개로 분위수 쪼개기
    • OVER은 윈도우 함수 뒤에 꼭 따라온다?
    • OVER 뒤의 기준으로 데이터를 정렬한 후 계산할 그룹을 정의

서울에 위치한 식당 목록 출력하기

INFO와 REVIEW 테이블에서 서울에 위치한 식당들의 ID, 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수 조회, 이때 리뷰 평균 점수는 소수점 세 번째 자리에서 반올림, 결과는 평균점수를 기준으로 내림차순, 같다면 즐겨찾기수 기준 내림차순

--SQL문
SELECT info.REST_ID, info.REST_NAME, info.FOOD_TYPE, info.FAVORITES, info.ADDRESS, ROUND(AVG(review.REVIEW_SCORE),2) AS SCORE
	FROM REST_INFO info
    JOIN REST_REVIEW review
    ON info.REST_ID=review.REST_ID
    WHERE ADDRESS LIKE '서울%'
    GROUP BY inf.REST_ID
    ORDER BY SCORE DESC, info.FAVORITES DESC
  • 주의할 점 :
    • GROUP BY 유무, 집계 함수는 그룹화를 통해 작동하므로
    • DESC의 경우 order by A,B DESC 이렇게 안 되네..

오프라인/온라인 판매 데이터 통합하기

ON고 OFF 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력, OFF 테이블의 판매 데이터는 USER_ID 값은 NULL 표시, 판매일 기준 오름차순, 같다면 상품ID 기준 오름차순, 또 같다면 유저ID 기준 오름차순

--SQL문
SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d'), PRODUCT_ID, USER_ID, SALES_AMOUNT
	FROM (
    	-- ONLINE_SALE 테이블의 2022년 데이터
        SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 
        FROM ONLINE_SALE
        WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-01'
        
        UNION ALL
        
        -- OFFLINE_SALE 테이블의 2022년 3월 데이터
        SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
        FROM OFFLINE_SALE
        WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31') AS combined_sales
    ORDER SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;
  • 주의할 점 :
    • UNION ALL로 두 테이블에서 중복 제거하지 않고 합친다
    • AS combined_sales로 서브 쿼리를 꼭 정의해줘야 함
      • 두 테이블로부터 합쳐진 데이터를 바로 사용할 수 없으므로

특정 세대의 대장균 찾기

3세대 대장균의 ID 오름차순 출력

--SQL문
SELECT ID FROM ECOLI_DATA
	WHERE TABLE IN
    (SELECT ID FROM TABLE WHERE PARENT_ID IN
    (SELECT ID FROM TABLE WHERE PARENT_ID IS NULL))
    ORDER BY ID ASC
  • 주의할 점 :
    • 3세대니까 단순히 서브쿼리로 null까지 갔는데, 더 큰 숫자였다면 어땠을까? (나중에 일반화 버전으로 다시 풀어보기)

멸종위기의 대장균 찾기

각 세대별 자식이 없는 개체의 수와 세대 출력, 세대에 대해 오름차순

--SQL문
WITH RECURSIVE GEN AS(
	SELECT ID, PARENT_ID, 1 AS GE
    FROM TABLE
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    
    SELECT N.ID, N.PARENT_ID, G.GE+1
    FROM TABLE N
    JOIN GEN G ON N.PARENT_ID=G.ID
    )
 
 SELECT COUNT(ID) AS COUNT, GE AS GENERATION
 	FROM GEN
    WHERE ID NOT IN (
    	SELECT PARENT_ID
        FROM GEN
        WHERE PARENT_ID IS NOT NULL
        )
	GROUP BY GE
  • 주의할 점 :
    • 재귀? CTE? 처음 사용해봤음 (for문 같은 기능인듯!)
profile
What else can I do

0개의 댓글