🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 String, Date
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) 정렬한다.
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) 정렬한다.
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) 정렬한다.
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) 정렬한다.