[코딩 공부] 11일차(2/23)

성철민·2023년 2월 23일
0

배움

목록 보기
11/42


Schedule1. 스파르타코딩클럽

내일배움캠프 5기 합류 전 기본적인 강의를 들어야 한다고 한다.

강의: [왕초보] 비개발자를 위한, 웹개발 종합반

웹개발을 위한 기본적인 강의 (HTML, CSS, JavaScript)

진도

  • 네가지 심플한 과제를 통해 숙달하고자 한다
  • 화성에 땅 사기, 영화 평점
  1. 프로젝트 폴더를 만들어주고 백엔드를 담당할 app.py와 프론트엔드를 담당할 templates/index.html 파일 만들어준다
  2. 명령어창에 python -m venv venv로 프로젝트 전용 가상환경을 만들어준다
  3. 필요한 모듈들을 이제 venv에 담아준다(pip install ~~~)
  4. Flask(웹 애플리케이션 개발 모듈), pymongo(MondoDB 라이브러리), dnspython(파이썬의 DNS관련 모듈)

감상
프론트엔드와 백엔드를 맛볼 수 있는 과제들이었다



Schedule2. 프로그래머스 스쿨

코딩테스트 연습

MySQL

자동차 평균 대여 기간 구하기(Lv.2)

개요: 자동차의 평균 대여 기간이 7일 이상인 자동차들의 평균 대여 기간을 구하는 문제

정답

SELECT * FROM (SELECT CAR_ID, round(avg(DATEDIFF(end_date, start_date)) + 1,1) as AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID) as A
WHERE A.AVERAGE_DURATION >= 7
ORDER BY A.AVERAGE_DURATION DESC, A.CAR_ID DESC;
  • DATEDIFF(기준날짜, 빼는날짜) : DATE 차이를 구해주는 함수
  • 이 문제에서 날짜 차이를 DATEDIFF(end_date, start_date) + 1로 +1해주는 게 키 포인트였다.
  • 대여기간이 9월27일부터 9월 29일일 경우 대여기간은 3일인데 DATEDIFF로는 단순 뺄셈만 하므로 2일로 나온다
  • 위 코드를 HAVING절을 사용해서 풀면 이렇게 된다
SELECT car_id, round(avg((DATEDIFF(END_DATE, START_DATE) + 1)),1) as AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY car_id
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, car_id DESC;
  • 사실 SQL 표준 실행순서 상 SELECT절 이후에 ORDER BY절이 시행되고 끝나기 때문에 SELECT절의 alias는 ORDER BY절에서만 사용 가능하다. 하지만 MySQL은 HAVING절을 평가하기 전에 SELECT절을 일부 평가하므로 위 문제처럼 사용가능하다.


중성화 여부 파악하기(Lv.2)

개요: 문자열 중에 특정 단어가 포함되어 있으면 새로운 칼럼에 O, X 표시하기

정답

SELECT ANIMAL_ID,
        NAME,
        IF(SEX_UPON_INTAKE LIKE '%Neutered%' or
        SEX_UPON_INTAKE LIKE '%Spayed%', 'O', 'X') as '중성화'
 FROM ANIMAL_INS;
  • LIKE함수를 IF함수 안에도 사용할 수 있다
  • WILDCARD문자 : '%': 0개 이상의 문자 표현, '_': 1개의 문자 표현
  • LOCATE('검색값', 문자열) : 문자열 안에 검색값이 있으면 그 위치를 반환
  • LOCATE()함수를 이용해 위치가 1이상이라면 O, 아니면 X로 문제를 풀 수도 있다


오랜 기간 보호한 동물(2)(Lv.3)

개요: 두 개의 테이블을 조인(JOIN)해서 특정 튜플을 찾는 문제

정답

SELECT T.ANIMAL_ID, T.NAME FROM 
(SELECT ins.ANIMAL_ID, 
       ins.NAME,
       (DATEDIFF(outs.DATETIME, ins.DATETIME) + 1) as longtime
FROM ANIMAL_INS as ins
INNER JOIN ANIMAL_OUTS as outs
ON ins.ANIMAL_ID = outs.ANIMAL_ID
ORDER BY longtime DESC
LIMIT 2) as T;
  • 두 테이블을 조인하고 SELECT절에서 입양기간을 찾은 다음 그걸 서브쿼리로 활용하는 방법이었는데 더 짧게 푸는 방법이 있었다
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
JOIN ANIMAL_INS I
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2
  • ORDER BY절 자체에 DATEDIFF(O.DATETIME, I.DATETIME)로 순서를 구해주는 방법이다
  • ORDER BY절에 함수가 들어갈 수 있다


오랜 기간 보호한 동물(2)(Lv.3)

개요: 두 개의 테이블을 조인(JOIN)해서 특정 튜플을 찾는 문제

정답

SELECT T.ANIMAL_ID, T.NAME FROM 
(SELECT ins.ANIMAL_ID, 
       ins.NAME,
       (DATEDIFF(outs.DATETIME, ins.DATETIME) + 1) as longtime
FROM ANIMAL_INS as ins
INNER JOIN ANIMAL_OUTS as outs
ON ins.ANIMAL_ID = outs.ANIMAL_ID
ORDER BY longtime DESC
LIMIT 2) as T;
  • 두 테이블을 조인하고 SELECT절에서 입양기간을 찾은 다음 그걸 서브쿼리로 활용하는 방법이었는데 더 짧게 푸는 방법이 있었다
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
JOIN ANIMAL_INS I
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2
  • ORDER BY절 자체에 DATEDIFF(O.DATETIME, I.DATETIME)로 순서를 구해주는 방법이다
  • ORDER BY절에 함수가 들어갈 수 있다


### 카테고리 별 상품 개수 구하기(Lv.2)

개요: 문자열 자르기

정답

SELECT SUBSTRING(PRODUCT_CODE, 1, 2) as CATEGORY,
       count(*) as PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY
  • SUBSTRING(COLUMN, 시작할 문자열 위치(1 시작), 끝낼 문자열 위치) : 문자열을 일부만 추출


### 오프라인/온라인 판매 데이터 통합하기(Lv.4)

개요: 칼럼이 다른 두 테이블을 UNION하고 특정 범위의 데이터를 추출하는 문제

정답

SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d"), PRODUCT_ID, USER_ID, SALES_AMOUNT 
FROM
((SELECT SUBSTRING(SALES_DATE, 1, 10) as SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE)
UNION ALL
(SELECT SALES_DATE, PRODUCT_ID, NULL USER_ID, SALES_AMOUNT FROM OFFLINE_SALE)) as A
WHERE MONTH(SALES_DATE) = 3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
  • 너무 더러운 문제였다
  • 3월 데이터를 뽑아 달라고 해놓고 OFFLINE_SALE 테이블에는 3월 데이터는 없고, 계속 안되길래 뭐가 문제지 하니까 데이터 타입을 DATE로 바꿔줬어야 했다
  • DATE_FORMAT(column, '%Y-%m-%d') : DATE 타입 변경
  • SELECT절에서 NULL column명 하면 해당 columns을 NULL로 채우겠단 소리


profile
developer

0개의 댓글