https://school.programmers.co.kr/learn/courses/30/lessons/132203
프로그래머스 > MySQL > 코딩테스트 연습 > SELECT > 흉부외과 또는 일반외과 의사 목록 출력하기
문제
DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
( 날짜 포맷은 예시와 동일하게 나와야합니다. )
나의 풀이
-- 코드를 입력하세요
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;
까먹었던 개념
1) DATA_FORMAT()
DATA_FORMAT()은 datetime의 속성을 바꿀 수 있는 함수이다.
본래 DATETIME 타입은 YYYY-MM-DD hh:mm:ss의 형식을 가진다.
반면 DATE 타입은 YYYY-MM-DD의 형식을 가지며, DATA_FORMAT으로 %Y-%m-%d %h:%m:%s 형식을 지정하면 시분초값은 0으로 채워지게 된다.
%M | Month 월(Janeary, February ...) |
%m | Month 월(01, 02, 03 ...) |
%W | Day of Week 요일(Sunday, Monday ...) |
%D | Month 월(1st, 2dn, 3rd ...) |
%Y | Year 연도(1999, 2000, 2020) |
%y | Year 연도(99, 00, 20) |
%X | Year 연도(1999, 2000, 2020) %V와 같이쓰임 |
%x | Year 연도(1999, 2000, 2020) %v와 같이쓰임 |
%a | Day of Week요일(Sun, Mon, Tue ...) |
%d | Day 일(00, 01, 02 ...) |
%e | Day 일(0, 1, 2 ..) |
%c | Month(1, 2, 3 ..) |
%b | Month(Jen Feb ...) |
%j | n번째 일(100, 365) |
%H | Hour 시(00, 01, 24) 24시간 형태 |
%h | Hour 시(01, 02, 12) 12시간 형태 |
%I(대문자 아이) | Hour 시(01, 02 12) 12시간 형태 |
%l(소문자 엘) | Hour 시(1, 2, 12) 12 시간 형태 |
%i | Minute 분(00, 01 59) |
%r | hh:mm:ss AP |
%T | hh:mm:ss |
%S, %s | Second 초 |
%p | AP, PM |
%w | Day Of Week (0, 1, 2) 0부터 일요일 |
%U | Week 주(시작: 일요일) |
%u | Week 주(시작 월요일) |
%V | Week 주(시작: 일요일) |
%v | Week 주(시작:월요일) |
모든 데이터를 출력하면 다음과 같이 나온다. 우리는 HIRE_YMD 데이터 타입이 '2011-03-01 00:00:00' 인데,
이를 '2011-03-01'로 바꾸고 싶다!
DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') as HIRE_YMD 를 통해 형식을 바꿔준다!
2) WHERE IN
WHERE IN은 여러 값 중 하나를 검색할 수 있는 기능이다. 주어진 값 집합 중 하나와 일치하는 레코드를 검색하고, 여러 값을 검색할 때 유용하다.
나는 or 절을 활용해 조건을 달았지만, 위의 문제처럼 다중 조건이 있을 때에는 WHERE IN을 사용하는 것이 좋을 것 같다!
# WHERE MCDP_CD = 'CS' or MCDP_CD = 'GS'
WHERE MCDP_CD IN ('CS', 'GS')
조금 더 어려운 문제에서는 IN 구문에 서브쿼리를 작성할 수도 있다. 서브쿼리가 반환한 결과 중 일치하는 결과가 선택된다.
ex)
select * from test_db a where user in (select user from test_db_copy where a.user=user);
조건으로 인해 전체 DATA가 출력된다!
아래는 IN 조건으로 다중컬럼을 검색하는 쿼리다. 다중 열을 검색할 때는 각 열을 괄호로 묶어 각각의 값의 집합을 지정해 주면 된다.
SELECT * FROM test_db a WHERE (a.user, a.group) IN (('test2', 'B'), ('test3', 'C'), ('hoo', 'A'));
끄읏-!
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스][MySQL] Lv. 1 조건에 맞는 도서 리스트 출력하기 (1) | 2024.03.16 |
---|---|
[프로그래머스][MySQL] Lv. 1 Python 개발자 찾기 (0) | 2024.03.15 |
[프로그래머스][MySQL] Lv. 1 평균 일일 대여 요금 구하기 (0) | 2024.03.03 |
[프로그래머스][MySQL] Lv. 1 모든 레코드 조회하기 (0) | 2024.03.03 |
[프로그래머스][MySQL] Lv. 1 경기도에 위치한 식품창고 목록 출력하기 (0) | 2023.12.11 |