🚩 프로그래머스(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
) 정렬한다.