MySQL_프로그래머스-6

soyeong·2022년 10월 21일
0

프로그래머스 SQL

목록 보기
6/6
post-thumbnail

🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 String, Date

📌 Level 2

🟩 이름에 el이 들어가는 동물 찾기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59047
2. 코드

SELECT ANIMAL_ID, NAME
  FROM ANIMAL_INS
  WHERE ANIMAL_TYPE='Dog' AND NAME LIKE '%EL%'
  ORDER BY NAME ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 개의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 할머니가 기르던 개(ANIMAL_TYPE='Dog')는 이름에 'el'(NAME LIKE '%EL%')이 들어가므로 해당 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 이름(NAME) 순으로 오름차순(ASC) 정렬한다.

🟩 DATETIME에서 DATE로 형 변환

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59414
2. 코드

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
  FROM ANIMAL_INS
  ORDER BY ANIMAL_ID ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 각 동물의 아이디(ANIMAL_ID)와 이름(NAME), 들어온 날짜(날짜)를 조회하기 위해 SELECT~FROM문을 사용하고, 들어온 날짜는 시각(시-분-초)을 제외한 날짜(년-월-일,'%Y-%m-%d')만 보여주기 위해 DATE_FORMAT(date, format)함수를 사용한다. 또한 ORDER BY절을 사용하여 아이디(ANIMAL_ID) 순으로 오름차순(ASC) 정렬한다.

🟩 중성화 여부 파악하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59409
2. 코드

SELECT ANIMAL_ID, NAME, 
CASE WHEN SEX_UPON_INTAKE LIKE 'Intact%' THEN 'X' ELSE 'O' END AS 중성화
  FROM ANIMAL_INS
  ORDER BY ANIMAL_ID ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME), 중성화 여부(중성화)를 조회하기 위해 SELECT~FROM문을 사용하고, 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있기 때문에 중성화 여부는 CASE~END절로 조건문을 작성한다. 또한 ORDER BY절을 사용하여 아이디(ANIMAL_ID) 순으로 오름차순(ASC) 정렬한다.

🟩 루시와 엘라 찾기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59046
2. 코드

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
  FROM ANIMAL_INS
  WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
  ORDER BY ANIMAL_ID ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME), 성별 및 중성화 여부(SEX_UPON_INTAKE)를 조회하기 위해 SELECT~FROM문을 사용한다. 동물 보호소에 들어온 동물 중 이름이 'Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty'인 동물(NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')) 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 아이디(ANIMAL_ID) 순으로 오름차순(ASC) 정렬한다.

🟩 카테고리 별 상품 개수 구하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131529
2. 코드

SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
  FROM PRODUCT
  GROUP BY CATEGORY
  ORDER BY CATEGORY ASC;

3. 코드 해석
해당 문제는 PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리,CATEGORY) 별 상품 개수(PRODUCTS)를 출력하기 위해 SELECT~FROM문을 사용한다. PRODUCT_CODE 앞 2자리는 LEFT(문자열, 길이) 함수를 사용하여 문자열의 일부를 추출하고, 상품 카테고리 코드(CATEGORY)별 상품 개수를 구하기 위해 GROUP BY절을 사용한다. 또한 ORDER BY절을 사용하여 상품 카테고리 코드(CATEGORY)를 기준으로 오름차순(ASC) 정렬한다.


📌 Level 3

🟩 오랜 기간 보호한 동물(2)

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59411
2. 코드

SELECT O.ANIMAL_ID, O.NAME
  FROM ANIMAL_INS I
  RIGHT OUTER JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID=O.ANIMAL_ID
  ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
  LIMIT 2;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용하고, 두 테이블을 동물의 아이디(ANIMAL_ID)로 외부 조인(OUTER JOIN)한다. ORDER BY절을 사용하여 보호 기간이 긴 순으로 정렬하기 위해 입양일(O.DATETIME)과 보호 시작일(I.DATETIME) 두 날짜의 차이를 DATEDIFF(날짜1, 날짜2)함수로 계산하여 내림차순(DESC) 정렬하고, LIMIT 숫자로 보호 기간이 가장 긴 동물 두 마리를 조회한다.

🟩 조건별로 분류하여 주문상태 출력하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131113
2. 코드

SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE,
CASE WHEN OUT_DATE IS NULL THEN '출고미정' WHEN DATE_FORMAT(OUT_DATE, '%m-%d') > '05-01' THEN '출고대기' ELSE '출고완료' END AS 출고여부
  FROM FOOD_ORDER
  ORDER BY ORDER_ID ASC;

3. 코드 해석
해당 문제는 FOOD_ORDER 테이블에서 주문 ID(ORDER_ID), 제품 ID(PRODUCT_ID), 출고일자(OUT_DATE), 출고여부(출고여부)를 조회하기 위해 SELECT~FROM문을 사용한다. 이때 출고일자는 '년-월-일'('%Y-%m-%d')만 보여주기 위해 DATE_FORMAT(date, format)함수를 사용하고, 출고여부는 5월 1일('05-01')을 기준으로 출고미정, 출고대기, 출고완료이 정해지므로 CASE~END절로 조건문을 작성한다. 또한 ORDER BY절을 사용하여 주문 ID(ORDER_ID)를 기준으로 오름차순(ASC) 정렬한다.

📌 Level 4

🟩 취소되지 않은 진료 예약 조회하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/132204
2. 코드

SELECT A.APNT_NO, B.PT_NAME, A.PT_NO, A.MCDP_CD, C.DR_NAME, A.APNT_YMD
  FROM (SELECT * FROM APPOINTMENT WHERE DATE_FORMAT(APNT_YMD, '%Y-%m-%d') ='2022-04-13' AND MCDP_CD='CS' AND APNT_CNCL_YN='N') A
  JOIN PATIENT B
  ON A.PT_NO=B.PT_NO
  JOIN DOCTOR C
  ON A.MDDR_ID=C.DR_ID
  ORDER BY APNT_YMD ASC, PT_NO ASC;

3. 코드 해석
해당 문제는 PATIENT 테이블, DOCTOR 테이블, APPOINMENT 테이블에서 진료예약번호(A.APNT_NO), 환자이름(B.PT_NAME), 환자번호(A.PT_NO), 진료과코드(A.MCDP_CD), 의사이름(C.DR_NAME), 진료예약일시(A.APNT_YMD) 항목이 출력하기 위해 SELECT~FROM문을 사용한다. 우선 2022년 4월 13일(DATE_FORMAT(APNT_YMD, '%Y-%m-%d') ='2022-04-13') 취소되지 않은(APNT_CNCL_YN='N') 흉부외과(CS) 진료(MCDP_CD='CS') 예약 내역을 조회하기 위해 APPOINTMENT 테이블에서 SELECT~FROM문을 사용하고, WHERE 조건절을 추가한다. 앞의 테이블 A라고 별칭을 붙이고, A 테이블과 PATIENT 테이블을 환자번호(PT_NO)로 내부 조인(INNER JOIN)한다. 또한 앞의 테이블과 DOCTOR 테이블을 의사ID(A.MDDR_ID=C.DR_ID)로 내부 조인(INNER JOIN)한다. 그 결과는 ORDER BY절을 사용하여 진료예약일시(APNT_YMD)를 기준으로 오름차순(ASC) 정렬하고, 진료예약일시가 같다면 환자번호(PT_NO)를 기준으로 오름차순(ASC) 정렬한다.


profile
The ultimate goal is to be a Data Scientist.

0개의 댓글