본문 바로가기
Data Analysis/Query

[MySQL] 프로그래머스 Lv.1

by 베짱이28호 2024. 1. 1.

[MySQL] 프로그래머스 Lv.1

 


문제

1. 역순 정렬하기

코딩테스트 연습 - 역순 정렬하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

 

  • 단순 이름, 날짜 데이터 추출해서 정렬기준 column 정해주기.

2. 상위 n개 레코드

코딩테스트 연습 - 상위 n개 레코드 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
  • 정렬 기준도 알고있고, 가장 단순하게 상위 데이터를 뽑는 LIMIT

3. 이름이 있는 동물의 아이디

코딩테스트 연습 - 이름이 있는 동물의 아이디 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID
  • NULL 사용법. NAME column에 NULLABE이 TRUE이다.
  • IS NOT NULL로 NULL값을 체크해준다.

4. 동물의 아이디와 이름

코딩테스트 연습 - 동물의 아이디와 이름 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
  • 그냥 FROM SELECT문

5. 여러 기준으로 정렬하기

코딩테스트 연습 - 여러 기준으로 정렬하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
  • 디폴트는 ASC, 역순 정렬할거면 DESC

6. 어린 동물 찾기

코딩테스트 연습 - 어린 동물 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

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

 

  • INTAKE CONDITION보면 aged가 있다. 부정형은 !=

7. 아픈 동물 찾기

코딩테스트 연습 - 아픈 동물 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

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

 

  • INTAKE COND가 SICK인 DATA 추출.

8. 나이 정보가 없는 회원 수 구하기

코딩테스트 연습 - 나이 정보가 없는 회원 수 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT COUNT(*)
FROM USER_INFO
WHERE AGE IS NULL;

 

  • COUNT(*) AGE가 NULL이 아닌 모든 데이터를 COUNT
  • *는 NULL도 세는 구문, 그냥 COLUMN은 NULL을 세지 않는 구문

9. 가장 비싼 상품 구하기

코딩테스트 연습 - 가장 비싼 상품 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT PRICE AS MAX_PRICE
FROM PRODUCT
ORDER BY PRICE DESC
LIMIT 1;

 

  • 최대,최소 -> 정렬 후 LIMIT로 조회

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

코딩테스트 연습 - 강원도에 위치한 생산공장 목록 출력하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE LEFT(ADDRESS,3) = '강원도'
ORDER BY FACTORY_ID;

 

  • LEFT, RIGHT, MID : 부분 문자열 출력. 
  • 왼쪽부터 x개, 오른쪽부터 x개, x번째부터 y개

11. 강원도에 위치한 식품공장 목록 출력하기

코딩테스트 연습 - 경기도에 위치한 식품창고 목록 출력하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, COALESCE(FREEZER_YN,'N')
FROM FOOD_WAREHOUSE
WHERE LEFT(ADDRESS,3) = '경기도'
ORDER BY WAREHOUSE_ID

 

  • COALESCE 인자가 2개인 경우 : col이 Null인 경우 -> 입력 값 반환
  • COALESCE에서 인자가 3개 이상인 경우 : Null이 아닌 가장 빠른 값을 출력한다. 모두 Null이면 Null 반환

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

코딩테스트 연습 - 흉부외과 또는 일반외과 의사 목록 출력하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT DR_NAME, DR_ID, MCDP_CD, LEFT(HIRE_YMD,10) AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;

 

  • 의사 코드 추출해서 새 col로 할당해주기. 단순 where, order 문제

13. 이름이 없는 동물의 아이디

코딩테스트 연습 - 이름이 없는 동물의 아이디 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;

 

  • Null은 IS NULL, IS NOT NULL로 판단

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

코딩테스트 연습 - 조건에 맞는 회원수 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE LEFT(JOINED,4) = '2021' AND AGE >= 20 AND AGE < 30;

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

 

 

  • 위에 코드보다는 아래 코드가 조금 더 직관적인듯
  • JOINED라는 컬럼이 DATA TYPE인거를 쿼리만 봐도 알 수 있다.
  • BETWEEN은 닫힌구간

15. 인기있는 아이스크림

코딩테스트 연습 - 인기있는 아이스크림 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;

 

  • 다중정렬 순서대로.

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

코딩테스트 연습 - 12세 이하인 여자 환자 목록 출력하기 | 프로그래머스 스쿨 (programmers.co.kr)

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

 

  • 전화번호 TLNO 없으면 NONE
  • 나머지는 WHERE / ORDER 쿼리

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

코딩테스트 연습 - 조건에 맞는 도서 리스트 출력하기 | 프로그래머스 스쿨 (programmers.co.kr)

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;

 

 

  • DATE에서는 YEAR, MONTH 등으로 추출하는게 쿼리에서 보기 편하다.
  • YYYY-MM-DD는 %Y-%m-%로

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

코딩테스트 연습 - 평균 일일 대여 요금 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE 
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';
  • ROUND, TRUNCATE : 반올림, 내림

19. 모든 레코드 조회하기

코딩테스트 연습 - 모든 레코드 조회하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT * FROM ANIMAL_INS;

SELECT
    ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS;
  • 과거의 나는 무슨 생각으로 푼걸까...
  • SELECT * : 모든 레코드

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

코딩테스트 연습 - 과일로 만든 아이스크림 고르기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT A.FLAVOR
FROM FIRST_HALF AS A
JOIN ICECREAM_INFO AS B ON A.FLAVOR = B.FLAVOR
WHERE A.TOTAL_ORDER > 3000 AND B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY A.TOTAL_ORDER DESC;
  • 테이블 A,B를 조인할 때, 조인하는 컬럼이 B의 기본키이다.
  • 어찌됐건, 조건을 TABLE A에서, B에서 한 번씩 걸어주고 ORDER BY로 정렬해준다.

21. 최댓값 구하기

코딩테스트 연습 - 최댓값 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT DATETIME AS 시간
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
  • ORDER BY COL 정렬기준 + LIMIT 조회 레코드 수

22. 특정 옵션이 포함된 자동차 리스트 구하기

코딩테스트 연습 - 특정 옵션이 포함된 자동차 리스트 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT *
FROM CAR_RENTAL_COMPANY_CAR 
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;
  • 특정 단어로 시작 'X%'
  • 특정 단어로 끝 '%X'
  • 특정 단어 포함 '%X%'
  • %가 나머지 단어들로 치환된다고 생각하면 된다.

23. 자동차 대여 기록에서 장기/단기 대여 구분하기

코딩테스트 연습 - 자동차 대여 기록에서 장기/단기 대여 구분하기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT HISTORY_ID, CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE,
       DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
       IF(DATEDIFF(END_DATE,START_DATE) >= 29, '장기 대여','단기 대여') AS RENTAL_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) = 9
ORDER BY HISTORY_ID DESC;
  • TIMEDIFF 이용, 끝값 - 시작값이다.
  • 이 문제에서는 동일 날짜 로그가 남으면 1일로 처리되므로 29로 해야한다.
  • 날짜 문제에서 잘 생각하고 풀이

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

코딩테스트 연습 - 조건에 부합하는 중고거래 댓글 조회하기 | 프로그래머스 스쿨 (programmers.co.kr)

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 YEAR(B.CREATED_DATE) = 2022 AND MONTH(B.CREATED_DATE) = 10 AND R.BOARD_ID = B.BOARD_ID
ORDER BY R.CREATED_DATE, B.TITLE;
  • 조인. 두 개의 테이블이 나오니까, AS로 별칭 달아줘서 간편하게 하자. 한 번 바꾸면 항상 붙여야함.
  • 게시글 ID 컬럼이 겹치니까 그 컬럼을 기준으로 JOIN을 진행

 

25. Python 개발자 찾기

코딩테스트 연습 - Python 개발자 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

SELECT ID,EMAIL,FIRST_NAME,LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python' OR SKILL_2 = 'Python' OR SKILL_3 = 'Python'
ORDER BY 1
  • 그냥 where + or, 정렬 컬럼 숫자로 지정

코멘트

기본 문법 + 내장함수 다루기.

24는 난이도 올려도 되지 않을까.... 흠...

댓글