개발자는 기록이 답이다
프로그래머스 SQL 76문제 풀기 ( 정답률 높은 순 기준 10개 ) - 2 본문

LV.2 중성화 여부 파악하기 (정답률 : 89%)
https://school.programmers.co.kr/learn/courses/30/lessons/59409
SELECT ANIMAL_ID, NAME, (CASE WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
ELSE 'X' END) AS 중성화
FROM ANIMAL_INS;
SELECT ANIMAL_ID, NAME,
CASE
WHEN SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%'
THEN 'O'
ELSE 'X'
END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME,
IF(SEX_UPON_INTAKE LIKE '%NEUTERED%' OR SEX_UPON_INTAKE LIKE '%SPAYED%','O','X') AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
LV.1 흉부외과 또는 일반외과 의사 목록 출력하기 (정답률 : 89%)
https://school.programmers.co.kr/learn/courses/30/lessons/132203
Date포맷이 결과값이랑 일치하는지 꼭 쿼리문 작성할때 확인!
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
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;
LV.2 고양이와 개는 몇 마리 있을까 (정답률 : 89%)
이때 고양이를 개보다 먼저 조회해주세요. - 문제 끝까지 보기
SELECT ANIMAL_TYPE, COUNT(*)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
LV.1 12세 이하인 여자 환자 목록 출력하기 (정답률 : 89%)
IFNULL()대신 COALESCE()함수도 사용 가능
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, 'NONE') AS TLNO
FROM patient
WHERE age <= 12 AND gend_cd = 'W'
ORDER BY age DESC, pt_name;
LV.1 조건에 맞는 회원 수 구하기 (정답률 : 89%)
https://school.programmers.co.kr/learn/courses/30/lessons/131535
날짜 데이터 찾을때 LIKE 문자열%로 해도 되고, BETWEEN사용해도 되고, YEAR을 써도 된다.
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29 AND JOINED LIKE '2021%'
SELECT count(*) as 'USERS'
FROM USER_INFO
where AGE between 20 and 29 and JOINED between '2021-01-01' and '2021-12-31';
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE >= 20 AND AGE <= 29 AND YEAR(JOINED) = 2021
LV.2 카테고리 별 상품 개수 구하기 (정답률 : 89%)
https://school.programmers.co.kr/learn/courses/30/lessons/131529
LEFT(컬럼명, 왼쪽에서 가져올 개수)를 통해 문자열 자르기 가능
substring(칼럼명, 시작부분, 끝부분)을 통해 문자열 자르기 가능 (zero base아님 1부터 시작)
SUBSTR()랑 마찬가지임 - 문자열 자르기 관련 함수는 아래 참고링크 3번째 확인
SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
SELECT substring(PRODUCT_CODE,1, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
SELECT SUBSTR(PRODUCT_CODE,1, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
LV.2 입양 시각 구하기(1) (정답률 : 88%)
https://school.programmers.co.kr/learn/courses/30/lessons/59412
DATE_FORMATE(컬럼명, 옵션) 대신 HOUR(컬럼명)함수로 대체 가능
// %h로 하면 안됨
SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR;
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR
ORDER BY HOUR;
HAVING대신 WHERE도 가능하지만, WHERE절에서는 SELECT절에서 정의한 alias를 사용 못 하고 직접 컬럼명 명시 필요
일반적으로 알리아스는 SELECT 절에서 정의하고, WHERE 절에서는 원래 열 이름이나 테이블의 별칭을 사용합니다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR
ORDER BY HOUR;
/*
오라클 : TO_CHAR(컬럼명, '형식') : 해당 컬럼을 형식(HH24 : 24시간)에 맞게 추출
*/
SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*) AS COUNT FROM ANIMAL_OUTS
WHERE TO_CHAR(DATETIME, 'HH24') BETWEEN 09 AND 19
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24');
MySQL의 DATE_FORMAT 함수에서 사용할 수 있는 날짜 및 시간 형식 문자열 목록
1. 연도 및 월 (Year and Month):
- `%Y`: 4자리 연도 (예: 2023)
- `%y`: 뒤 2자리 연도 (예: 23)
- `%m`: 월 (01부터 12까지)
- `%b`: 축약된 월 이름 (예: Jan, Feb, ...)
- `%M`: 전체 월 이름 (예: January, February, ...)
2. 일자 (Day):
- `%d`: 일 (01부터 31까지)
- `%e`: 일 (1부터 31까지)
- `%D`: 일자의 서수 표현 (예: 1st, 2nd, 3rd, 4th, ...)
3. 요일 (Day of the Week):
- `%w`: 일요일(0)부터 토요일(6)까지의 숫자
- `%a`: 축약된 요일 이름 (예: Sun, Mon, ...)
- `%W`: 전체 요일 이름 (예: Sunday, Monday, ...)
4. 시간 (Time):
- `%H`: 24시간 형식의 시간 (00부터 23까지)
- `%h`: 12시간 형식의 시간 (01부터 12까지)
- `%i`: 분 (00부터 59까지)
- `%s`: 초 (00부터 59까지)
- `%p`: AM 또는 PM (예: AM, PM)
5. 날짜 및 시간 (Date and Time):
- `%Y-%m-%d`: 'YYYY-MM-DD' 형식의 날짜
- `%Y-%m-%d %H:%i:%s`: 'YYYY-MM-DD HH:MI:SS' 형식의 날짜와 시간
6. 기타 형식:
- `%T`: 시간을 'HH:MI:SS' 형식으로 나타냄
- `%r`: 12시간 형식의 시간을 'hh:mi:ss AM' 또는 'hh:mi:ss PM' 형식으로 나타냄
- `%U`: 연도의 몇 번째 주 (일요일부터 시작)
- `%u`: 연도의 몇 번째 주 (월요일부터 시작)
- `%j`: 연도의 몇 번째 날 (001부터 366까지)
LV.2 진료과별 총 예약 횟수 출력하기 (정답률 : 88%)
https://school.programmers.co.kr/learn/courses/30/lessons/132202
원래 ORDER BY절에서 SELECT절메 명시한 Alias를 사용할 수 있지만,
ORDER BY절에서 홑따옴표로 감싸져있는건 안되는 것 같다. 대신 백틱을 사용해야 한다.- 알리아스에 관한건 참고링크 4번째 확인
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY COUNT(*) ASC, MCDP_CD ASC;
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS 5월예약건수
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY 5월예약건수 ASC, MCDP_CD ASC;
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY 5월예약건수 ASC, MCDP_CD ASC;
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY `5월예약건수` ASC, MCDP_CD ASC;
SELECT MCDP_CD AS '진료과코드', COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE YEAR(APNT_YMD) = '2022' AND MONTH(APNT_YMD) = '05'
GROUP BY MCDP_CD
ORDER BY `5월예약건수` ASC, MCDP_CD ASC;
LV.1 인기있는 아이스크림 (정답률 : 87%)
https://school.programmers.co.kr/learn/courses/30/lessons/133024
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;
LV.3 오랜 기간 보호한 동물(1) (정답률 : 86%) - 서브쿼리 연습
https://school.programmers.co.kr/learn/courses/30/lessons/59044
LEFT JOIN과 WHERE 문에 B.ANIMAL_ID IS NULL을 넣어 A에는 있지만 B에는 없는 값만 뽑아내면 총 4행이 나오는데
포인트는 ANIMAL_INS 테이블의 DATETIME 순으로 3행만 뽑아와야 한다는 것이다
ORDER BY A.DATETIME 수행 후 LIMIT 3을 넣어줘서 3행만 가져오면 된다.
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B on A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3;
-- from절에 서브쿼리 만들면 테이블로 사용하는거라 이름이 있어야함 'a'
SELECT *
FROM
(
SELECT ins.NAME, ins.DATETIME
from ANIMAL_INS ins left join ANIMAL_OUTS outs
on ins.ANIMAL_ID = outs.ANIMAL_ID
where outs.ANIMAL_ID is null
order by ins.DATETIME
) a limit 3;
참고 링크
https://coding-factory.tistory.com/113
[MSSQL] 조건문 (CASE WHEN, IF) 함수 사용법 & 예제
프로그래밍 언어 중에서 조건에 따라 작업방식을 달리 할 수 있는 조건문이라는 것이 있습니다. 대표적인 문법이 IF문과 CASE문인데요. MSSQL에서도 조건절인 CASE문과 IF문을 지원하니 한번 활용해
coding-factory.tistory.com
https://prinha.tistory.com/entry/MySQL-COALESCE-%ED%95%A8%EC%88%98
[MySQL] NULL을 다른 값으로 변환하는 함수
COALESCE() MS SQL에서 IFNULL(컬럼, 0) 컬럼값이 null이면, 0을 넣는 함수가 있다. MySQL에서는 COALESCE(컬럼, 0)을 이용해서 null이면, 0을 넣는 함수를 사용한다. 1) COALESCE(컬럼,0) SELECT COALESCE(height, '###'), COALES
prinha.tistory.com
[SQL] 카테고리 별 상품 개수 구하기(프로그래머스/MySQL/Level 2)
안녕하세요! 데코입니다! 오늘은 프로그래머스 코딩테스트 연습에 있는 "카테고리 별 상품 개수 구하기" 문제를 포스팅하려고 합니다! 바로 포스팅 시작할게요! :) (출처 : https://school.programmers.co.
kkw-da.tistory.com
[MYSQL] 진료과별 총 예약 횟수 출력하기 (프로그래머스/Level 2)
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설
suminii.tistory.com
https://jione-e.tistory.com/79
[ 프로그래머스 ] LEVEL3 - 오랜 기간 보호한 동물(1) (Oracle,MySQL)
문제 설명 ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동
jione-e.tistory.com
'Database > 프로그래머스' 카테고리의 다른 글
프로그래머스 SQL 76문제 풀기 ( 정답률 높은 순 기준 6개 ) - 5 (1) | 2023.10.06 |
---|---|
프로그래머스 SQL 76문제 풀기 ( 정답률 높은 순 기준 20개 ) - 4 (1) | 2023.10.05 |
프로그래머스 SQL 76문제 풀기 ( 정답률 높은 순 기준 20개 ) - 3 (1) | 2023.10.04 |
프로그래머스 SQL 76문제 풀기 ( 정답률 높은 순 기준 20개 ) - 1 (0) | 2023.09.29 |