본문 바로가기

알고리즘/프로그래머스

[PG / SQL] 프로그래머스 SQL 고득점 Kit - SELECT

풀면서 계속 추가하는 중

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/133025

 

  • 주문량, 주성분 데이터가 나뉘어짐 → 조인 필요, 필드명 동일하므로 USING 사용
  • 주문량, 주성분 타입 조건 필요 → WHERER
  • 주문량 순으로 내림차순 정렬 → ORDER BY DESC
SELECT FLAVOR
FROM FIRST_HALF JOIN ICECREAM_INFO
USING (FLAVOR)
WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC;

 

 

2. 평균 일일 대여 요금 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151136

 

 

  • 별칭 필요 → AS
  • 평균값, 반올림 → AVG, ROUND(값, 반올림 결과 자리수)
  • 차 종류 조건 필요 → WHERE
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

 

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/132203

 

  • 진료과 조건 필요 → WHERE IN (값)
  • 고용일자 날짜 포맷 → DATE_FORMAT(칼럼명, "%Y-%m-%d)
  • 정렬 여러개 → ORDER BY 기준1, 기준2 
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, "%Y-%m-%d") AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS','GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/131112

 

  • 공장 위치에 강원도 포함 조건 필요 → WHERE ADDRESS LIKE "강원도%"
    • 정규표현식 사용 가능    WHERE ADDRESS REGEXP "^강원도"
  • 정렬 필요 → ORDER BY ASC
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID ASC;

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/132201

 

  • 환자 성별, 나이 조건 필요   WHERE
  • 전화번호 NULL 처리
    • COALESCE(칼럼명, 일치하는 값, 대체할 값): 모든 DBMS에서 사용 가능
    • IFNULL(칼럼명, 대체할 값): MySQL에서만 사용 가능
    • https://likenow.tistory.com/55
  • 나이, 환자이름 다중 정렬    ORDER BY 조건1, 조건2
-- SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, "NONE") AS TLNO
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, NULL, "NONE") AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = "W"
ORDER BY AGE DESC, PT_NAME ASC;

 

6. 인기있는 아이스크림

https://school.programmers.co.kr/learn/courses/30/lessons/133024

 

  • 총주문량, 출하번호 기준 정렬 → ORDER BY 조건1, 조건2
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/144853

  • 출판일 조건 필요 → WHERE A LIKE "2021%"
  • 카테고리 인문 조건 → WHERE
  • 출판일 기준 오름차순 → ORDER BY 출판일 ASC
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, "%Y-%m-%d") AS PUBLISHED_DATE
FROM BOOK
WHERE CATEGORY = '인문' AND PUBLISHED_DATE LIKE "2021%"
ORDER BY PUBLISHED_DATE ASC

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/164673

 

 

  • 두 테이블 BOARD_ID 기준으로 조인 필요 → A JOIN B USING (BOARD_ID)
  • 게시글 작성일 기준 조건 필요 → B.CREATED_DATE BETWEEN 시작 AND 끝
  • 댓글 작성일, 게시글 제목 기준 오름차순 정렬 → ORDER BY 조건1 ASC, 조건2 ASC

 

SELECT TITLE, BOARD_ID, 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
USING (BOARD_ID)
WHERE B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY R.CREATED_DATE ASC, TITLE ASC

 

 

9. 모든 레코드 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/59034

 

  • 모든 레코드 조회 → *
  • 정렬 조건 → ORDER BY 조건 ASC
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

 

 

10. 역순 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/59035

 

  • 역순 정렬 조건 → ORDER BY 조건 DESC
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/131120

  • NULL 제외 → IS NOT NULL
  • 생일 패턴 3월 → LIKE '%-%03%'
  • YYYY-MM-DD 출력 → DATE_FORMAT(MEMBER_PROFILE.DATE_OF_BIRTH, '%Y-%m-%d')
    • +) 만약 YY-MM-DD 형식이라면 '%y-%m-%d'
    • Y = 2025 4자리 년도 표현, M = March 달 이름으로 표현, D = 16th 서수로 표현

 

12. 아픈 동물 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59036

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID;

 

13. 어린 동물 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59037

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

  • 회원ID, 상품ID 기준으로 묶기 → GROUP BY USER_ID, PRODUCT_ID
  • 중복 데이터가 2개 이상인지 확인 → HAVING COUNT(*) >=2
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;

 

15. 상위 n개 레코드

https://school.programmers.co.kr/learn/courses/30/lessons/59405

 

  • 들어온 날짜 기준으로 정렬 → ORDER BY 
  • 상위 1개만 출력 → LIMIT 1
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

 

 

16. 조건에 맞는 회원수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131535

  • 2021년에 가입
    • JOINED LIKE '2021%'
    • YEAR(JOINED) = 2021
  • 나이 조건
    • AGE >= 20 AND AGE <=29
    • AGE BETWEEN 20 AND 29
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
    AND AGE BETWEEN 20 AND 29;

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

  • 두 테이블 REST_ID 기준으로 조인
  • 평점 AVG 사용, 소수점 세번째에서 반올림 ROUND(대상, 2)
  • 리뷰 테이블에서 REST_ID 기준으로 그룹화 (리뷰 평점 구해야됨)
  • 내림차순 정렬 DESC 
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, 
	ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO AS I
JOIN REST_REVIEW AS R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
GROUP BY R.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC;

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/273711

 

조회는 자식 아이템 기준으로, 조건은 부모 아이템 기준으로 해야함

1. TREE와 INFO를 ITEM_ID 기준으로 조인하기

2. 조인한 값의 부모가 RARITY  = 'RARE'를 만족해야함

- 서브 쿼리로 RARE 한 아이템의 아이디만 구하고

- 부모 아이템 아이디가 그에 속하는지 확인

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

 

19. Python 개발자 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/276013

  • SKILL_1, SKILL_2, SKILL_3 칼럼에 Python 값이 포함되어 있는지 확인
    • → IN 사용
    • OR로 조건문 써도 됨
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID;
반응형