회고/TIL(매일)

TIL 19일차 : 팀장, DATE_FORMAT, HOUR, HAVING, COALESCE, OR

0sean 2023. 12. 26. 10:19

 

도전한 점

  • 새로운 팀 : SQRD 강의는 기존에 줬던 건데 이게 기초라고 심화라고 뭐지
  • SQL 코드카타 5문제 풀이 : DATE_FORMAT 완전정복, HOUR 배움
  • 팀별 회의 : 팀장됨 이쯤되면 운명인가
  • 실습 1, 2 서브쿼리 사용에 대한 고뇌 : 없이도 만들어 보기 -> 해답은 DATE_FORMAT
  • 데이터분석 강의 3주차 복습 내용은 여기에 : https://specialda.tistory.com/29

 

  • 실습 26. (조건 붙은) 입양 시각 구하기 : SUBSTR, 서브쿼리, COUNT
# 1차 작성코드, 7시와 8시는 제거해야 하는데 어떻게 하더라? 자꾸 IF먼저 생각하지마
SELECT HOUR,
       COUNT(HOUR) COUNT
FROM
(SELECT SUBSTR(DATETIME, 12, 2) HOUR
FROM ANIMAL_OUTS
) A
GROUP BY 1
ORDER BY 1
# 2차 작성코드, 조건 하나만 줄 때는 WHERE절 사용한다. 근데 자꾸 틀렸대
SELECT HOUR,
       COUNT(HOUR) COUNT
FROM
(SELECT SUBSTR(DATETIME, 12, 2) HOUR
FROM ANIMAL_OUTS
) A
WHERE HOUR >= 9
GROUP BY HOUR
ORDER BY HOUR
# 범위를 BETWEEN으로 주니까 정답이다.
SELECT HOUR,
       COUNT(HOUR) COUNT
FROM
(SELECT SUBSTR(DATETIME, 12, 2) HOUR
FROM ANIMAL_OUTS
) A
WHERE HOUR BETWEEN 9 AND 19
GROUP BY HOUR
ORDER BY HOUR
# 데이트 포맷을 이해한 나(서브쿼리 없는 정답 코드)
SELECT DATE_FORMAT(DATETIME, '%H') HOUR,
       COUNT(1) COUNT
FROM ANIMAL_OUTS
WHERE DATE_FORMAT(DATETIME, '%H') BETWEEN 9 AND 19
GROUP BY 1
ORDER BY 1
# HOUR, HAVING을 사용할 수 있다. HOUR은 함수가 아님을 나타내기 위해 HUR로 변경함.
SELECT HOUR(DATETIME) AS HUR,
       COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HUR 
HAVING HUR BETWEEN 9 AND 19
ORDER BY HUR

 

*DATE_FORMAT 실제 사용 결과 모음 (년/월/일/시/분/초/요일/시간)

 

DATETIME 컬럼 기본 값
DATE_FORMAT(%Y) : 년도 대문자
DATE_FORMAT(%y) : 년도 소문자
DATE_FORMAT(%M) : 월별 대문자
DATE_FORMAT(%m) : 월별 소문자
DATE_FORMAT(%D) : 일자 대문자
DATE_FORMAT(%d) : 일자 소문자
DATE_FORMAT(%W) : 요일 대문자
DATE_FORMAT(%w) : 요일 소문자
DATE_FORMAT(%T) : 시간 대문자 (소문자는 없음)
DATE_FORMAT(%H) : '시'/분/초 대문자(24시간제)
DATE_FORMAT(%h) : '시'/분/초 소문자(12시간제)
DATE_FORMAT(%i) : 시/분/'초' 소문자(대문자I는 h랑 결과 같음)
DATE_FORMAT(%S) : 시/분/'초' 대문자(=소문자)

 

  • 실습 27. 진료과별 총 예약 횟수 출력하기 : 조건 하나만 딱! 주고 싶을 때는 WHERE, 서브쿼리 A+B(너무 길어) -> WHERE LIKE 또는 DATE_FORMAT 사용하기
# 2022년도라는 조건을 빼먹었는데 정답이라고 나오는데 정확한 건 아니다.
SELECT MCDP_CD "진료과 코드",
       COUNT(MCDP_CD) "5월예약건수"
FROM
# '05'월만 선택 출력하다.
(
SELECT MCDP_CD,
       APNT_M
FROM 
# '월'까지만 선택 출력하다.
(
SELECT SUBSTR(APNT_YMD, 6, 2) APNT_M,
       MCDP_CD
FROM APPOINTMENT
) A
WHERE APNT_M = 05
) B
GROUP BY 1
ORDER BY 2, 1
# 간단하게 LIKE절을 이용한 구문
SELECT MCDP_CD "진료과코드",
       COUNT(1) "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD LIKE '%2022-05%'
GROUP BY 1
ORDER BY 2, 1
# DATE_FORMAT에 등호(=) 조건 주기
SELECT MCDP_CD "진료과코드",
       COUNT(1) "5월예약건수"
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD, '%Y-%m') = '2022-05'
GROUP BY 1
ORDER BY 2, 1

 

*DATE_FARMAT을 SELECT에도 쓰고 WHERE에도 쓴 실습 3-2 : https://specialda.tistory.com/25

 

  • 실습 28. 12세 이하 여자 환자 목록 출력하기 : 이번 문제는 IF절을 SELECT에 써야한다. WHERE절은 조건을 한정시키는 것이지 컬럼내용을 변경시키려면 오류 뜬다. (자세한 건 코딩테스트 캡쳐로 확인하기)
# 위(IF), 아래(COALESCE) 모두 정답이다.
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
       IF(TLNO IS NULL, 'NONE', TLNO) TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC
# NULL값에는 COALESCE 사용을 익히도록 한다.
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
       COALESCE(TLNO, 'NONE') TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

 

*COALESCE 개념 설명 및 예시 참고 : https://specialda.tistory.com/25

 

1. 기본 구문
2. WHERE절에 AND IF(TLNO IS NULL, 'NONE', TLNO) 추가하니까
사라진 NULL값 : SELECT절에 사용해야 한다.

 

  • 실습 29. 인기있는 아이스크림 : GROUP BY, ORDER BY, DESC, ASC
SELECT FLAVOR
FROM FIRST_HALF
GROUP BY 1 -> 생략가능
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC

 

  • 실습 30. 특정 옵션이 1개 이상 추가된 자동차 수 구하기 : LIKE, OR 반복구문

 

*조건을 지정하는 방법 종류 참고 : https://specialda.tistory.com/23

 

1차 작성 구문 : 등호 오류
2차 작성 구문 : IN함수 오류, 그리고 OR아니고 콤마임.
3차 작성 구문 : 부분 포함에는 IN+콤마도 틀림(결과 값이 안나옴)
4차 작성 구문 : LIKE에는 괄호 쓰지 않습니다. 아주 까다롭군.
5차 작성 기본 구문 : 맞는데? 아니다 ㅈㅅ

# 트럭도 들어가고 맞는데 왜 틀렸다고 합니까?
SELECT car_type CAR_TYPE,
       COUNT(car_id) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE options LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'
GROUP BY 1
ORDER BY 1

 

* 최근에 같은 실수 한 부분 참고 : https://specialda.tistory.com/35

 

# OR절 사이에는 독자적인 구문이 들어감을 기억하자.
SELECT car_type CAR_TYPE,
       COUNT(car_id) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE options LIKE '%통풍시트%' OR
      options LIKE '%열선시트%' OR
      options LIKE '%가죽시트%'
GROUP BY 1
ORDER BY 1

 

좋았던 점

  • 파이썬을 기초부터 배우니 아주 신난다.


아쉬운 점

  • 실무에 배운 게 어떻게 쓰이는지 알고 싶다.


잊지말 점

  • DATE_FORMAT 사용법을 완벽 정리하고 배웠으니 잊지 말기


시도할 점

  • 데분복습, 파이썬 2장 완강하기