-
2024-01-05스파르타/TIL(Today I Learned) 2024. 1. 5. 23:11더보기
SQL 코드카타
최댓값 구하기(SQL) (max, 날짜 date)
https://school.programmers.co.kr/learn/courses/30/lessons/59415
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요. 라는 문제이다.
SELECT max(DATETIME) "시간" FROM ANIMAL_INS
가장 최근 날짜를 출력하면 되는 간단한 문제이다.
조건에 맞는 사용자 정보 조회하기(SQL) (concat, substr, right join, having)
https://school.programmers.co.kr/learn/courses/30/lessons/164670
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요. 라는 문제이다.
SELECT u.USER_ID, u.NICKNAME, concat(STREET_ADDRESS1,STREET_ADDRESS2) "전체주소", concat(substr(TLNO,1,3),'-',substr(TLNO,4,7),'-',substr(TLNO,8,11)) "전화번호" FROM USED_GOODS_BOARD b right join USED_GOODS_USER u on b.WRITER_ID = u.USER_ID #USER라고 적으니 따로 함수가 있는듯하여 짧게 u만 사용(하는김에 b도 짧게) WHERE #중고거래등록 3건이상 #ORDER BY #회원id
첫 쿼리 작성 시 구조 보통 where이나 having절부터 작성하는데 이번의 경우는 필터 조건이 간단해 보였고, 먼저 select절부터 해도 괜찮겠다는 생각과 select절에서 주소와 전화번호의 틀을 바로 보여주는 것이 아니라 살짝 가공해서 출력 해줘야 하기 때문에 우선 테스트 겸 select절부터 작성해주었다
그 뒤 처음에는 where절에서 서브쿼리문을 통해 필터링 해주는 것을 생각하였으나, 어차피 user_id에 대하여 한 번씩만 닉네임, 주소, 전화번호를 보여주면 되고 user_id에 대하여 그 사람이 쓴 게시글의 갯수가 3개이상이면 되기에 user_id별로 그룹을 짓고 해주어도 되겠다는 생각에 그렇게 방식을 바꾸어 작성하였다
SELECT u.USER_ID, u.NICKNAME, concat(u.CITY,' ',u.STREET_ADDRESS1,' ',u.STREET_ADDRESS2) "전체주소", concat(substr(TLNO,1,3),'-',substr(TLNO,4,4),'-',substr(TLNO,8,4)) "전화번호" #, count(b.board_id) count_board FROM USED_GOODS_BOARD b right join USED_GOODS_USER u on b.WRITER_ID = u.USER_ID #USER라고 적으니 따로 함수가 있는듯하여 짧게 u만 사용(하는김에 b도 짧게) GROUP BY u.USER_ID HAVING count(b.BOARD_ID)>=3 ORDER BY u.USER_ID desc
아래는 필터가 똑바로 되었는지 확인하기 위한 게시물 글 목록 확인용 쿼리이다.
우선 HAVING절에 대하여는 정상적으로 적용되었고,
왜 착각한지는 모르겠지만, substr(컬럼,시작위치,몇글자)인데 몇글자를 어디까지로 착각해서 적어놓고는 이상하다고 느끼지 못하였다가 제출시 틀렸길래 눈치채고 수정하였다. 아, city도 빠트렸었다. 여기까지 해서 결과가 제출성공하신분 쿼리의 내용이 전부 같았던 것같은데
그래도 틀렸다고 나오길래 주소부분에서 띄어쓰기를 해주면서 붙여보았는데 그것이 문제였다 이것을 수정해서 제출하니 바로 제출성공하였다
SELECT u.USER_ID, b.board_id FROM USED_GOODS_BOARD b right join USED_GOODS_USER u on b.WRITER_ID = u.USER_ID #USER라고 적으니 따로 함수가 있는듯하여 짧게 u만 사용(하는김에 b도 짧게) order by u.user_id desc
특정 옵션이 포함된 자동차 리스트 구하기(SQL) (like, 한 컬럼에 값 여러개)
https://school.programmers.co.kr/learn/courses/30/lessons/157343
CAR_RENTAL_COMPANY_CAR 테이블에서 '네비게이션' 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요. 라는 문제이다
전에 풀었던 문제 거의 그대로로 옵션 컬럼에 원래는 하나의 값만 들어가야하지만 여러가지가 들어갔기에 불가피하게 like로 필터링 해주었다
SELECT car.CAR_ID, car.CAR_TYPE , car.DAILY_FEE ,car.OPTIONS FROM CAR_RENTAL_COMPANY_CAR car WHERE OPTIONS like '%네비게이션%' ORDER BY car.CAR_ID desc
조건에 부합하는 중고거래 상태 조회하기(SQL) (case when, where, date핕터조건형식)
https://school.programmers.co.kr/learn/courses/30/lessons/164672
USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요. 라는 문제이다.
SELECT board.BOARD_ID, board.WRITER_ID , board.TITLE , board.PRICE, case when board.STATUS='SALE' then "판매중" when board.STATUS='RESERVED' then "예약중" when board.STATUS='DONE' then "거래완료" end STATUS FROM USED_GOODS_BOARD board WHERE CREATED_DATE='2022-10-05' ORDER BY board.BOARD_ID desc
이번에는 크게 별 어려움 없이 무난무난했다
우선 USED_GOODS_BOARD테이블에서(이하 줄여서 board라고 하겠다) 데이터를 가져와서 작성일(created_date)가 2022-10-05인 데이터만 출력되도록 필터링해준 뒤, board_id,writer_id, title, price 그리고 거래상태를 sale이라고 적혀있을 경우 판매중, reserved라고 적혀있을 경우 예약중, done이라고 적혀있을 경우 거래완료라고 출력되도록 하여 데이터를 출력하는데, board_id를 기준으로 내림차순 정렬을 해주었다.
추가 여담으로 STATUS라는 함수가 또 따로 있는 듯 하다. 프로그래머스에서 입력할 때 함수?명령어?의 경우 보라색 글씨가 되는데 STATUS라고 치니 보라색 글씨가 되었다 다행히 컬럼명으로 사용하여도 문제는 일어나지 않았다 문제의 요구하는 컬럼명이 예시에 STATUS라고 되어있길래 똑같이 하기 위해 어쩔 수 없이 하였지만 만약 함수가 있다면 가급적 피하는 것이 좋을 듯하다.
검색 해본 결과 대략적으로 그냥 문자 그대로 DB서버 상태를 확인하는 함수인듯하다 그런데 내가 직접 써볼 일이 있는지는 정확히 모르겠어서 일단 이런게 있구나하고 패스하도록 하겠다
형식(SQL) (쿼리 방식별 시간비교하고 싶음, select 서브쿼리문, date_format)
https://school.programmers.co.kr/learn/courses/30/lessons/132204
PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요. 라는 문제이다.
2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역이라는게 정확히 무슨 의미인지 모르겠어서 여러 의미로 테스트 해봐야 할듯하다. 취소날짜가 4월13일날이 아닌? / 4월13일날 확인했을 떄 취소가 되지 않은? 우선 4월13일날 예약 취소가 된 날짜는 보이지 않는 듯하여, 4월 13일 확인했을 때 취소가 되지 않은 의미로 해석하여 작성해보겠다.
SELECT appo.APNT_NO, (SELECT pt.PT_NAME FROM PATIENT pt WHERE pt.PT_NO = appo.PT_NO) PT_NAME, appo.PT_NO, appo.MCDP_CD, (SELECT dr.DR_NAME FROM DOCTOR dr WHERE dr.DR_ID=appo.MDDR_ID) DR_NAME, appo.APNT_YMD FROM APPOINTMENT appo WHERE (appo.APNT_CNCL_YN = 'N' or (appo.APNT_CNCL_YN = 'Y' and APNT_CNCL_YMD>'2022-04-13')) and MCDP_CD='CS' ORDER BY appo.APNT_YMD
→아.. 하다보니 4월13일 예약된 것들중 취소되지 않은 것만이라는 의미인듯하다..
SELECT appo.APNT_NO, (SELECT pt.PT_NAME FROM PATIENT pt WHERE pt.PT_NO = appo.PT_NO) PT_NAME, appo.PT_NO, appo.MCDP_CD, (SELECT dr.DR_NAME FROM DOCTOR dr WHERE dr.DR_ID=appo.MDDR_ID) DR_NAME, appo.APNT_YMD FROM APPOINTMENT appo WHERE date_format(appo.APNT_YMD,'%Y-%m-%d') = '2022-04-13' and appo.APNT_CNCL_YN = 'N' and appo.MCDP_CD='CS' ORDER BY appo.APNT_YMD
위 쿼리가 최종 제출본이다
우선 APPOINTMENT테이블에서(이하 appo라고 하겠음) 데이터를 가져와서 예약일자(appo. APNT_YMD)가 (형태가 YYYY-mm-dd hh:mm:ss.ns?형태로 되어있어서 date_format으로 YYYY-mm-dd형식의 문자열로 바꿔주었다) 2022-04-13이고, 예약취소여부(appo. APNT_CNCL_YN)가 N인, 그리고 진료과코드(appo.MCDP_CD)가 CS(흉부외과)인 데이터만 출력하도록 필터링하였다
그 뒤 진료예약번호(appo.APNT_NO), 환자이름, 환자번호(appo.PT_NO), 진료과코드(appo.MCDP_CD), 의사이름, 진료예약일시(appo.APNT_YMD)를 출력하도록 하였는데 이중 환자이름과 의사이름은 서브쿼리로써 각각 patient, doctor 테이블에서 appp의 pt_no와 mddr_id가 일치하는 데이터를 출력하도록 작성하여 사용하였다. 그리고 마지막으로 예약진료일시(appo.APNT_YMD)를 기준으로 오름차순 정렬시켜주었다
그리고 위에서 잘못 작성한 쿼리로 출력하였을 시 이름이 빈 데이터가 있었는데 환자번호가 24,25로 끝나는 환자들이였는데, patient테이블을 보아도 22번까지만 정보가 나와있어서 누락되거나 아직 최신화를 하지 않은 듯하다
대충 join해서 하는 것과 서브쿼리로 바로 select에서 사용하는 것 중 뭐가 더 빠를지 확인해보고 싶다
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(SQL) (case when, where, group, date날짜 필터조건, 쿼리 방식별 시간비교하고 싶음)
https://school.programmers.co.kr/learn/courses/30/lessons/157340
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요. 라는 문제이다.
우선 데이터가 안에 기간 범위가 어떻게 되어있나 훑어볼려고 대강 보니 저번에 풀었던 문제(번호 순서 상은 뒷 번호 문제였던 것 같긴 하다)와 같은 데이터를 쓰는 듯 하였고, 저번과 다르게 10월16일에 맞춰진게 아닌 10월 31일까지 데이터가 있었고, 데이터 형태가 시간까지 같이 나와있어서 date_format나 date를 써야하지 않을까 예상된다→ 완성까지 했을 때 기준으로 생각했을 때 이번에도 그냥 날짜컬럼 =’날짜’ 이렇게 하니 잘 필터 되었다 점점 옛날에 다른 것 때문에 필터링이 제대로 안 됐고 사실 날짜 필터링은 까다롭지 않고 융통성있게 잘 적용되는 것이 아닌가 하는 생각도 든다.
SELECT * FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY order by start_date desc, end_date desc
처음에는 필터링 조건이 따로 필요하지 않다고 생각하여 바로 AVAILABILITY이라고 대여 가능한지 2022년 10월 16일 기준으로 판별하는 컬럼을 먼저 만들기 시작하였는데 만드는 과정 중에 필터를 넣어서 판단하는게 더 좋지 않을까라는 생각이 들어 필터를 넣어주기로 했다(서브쿼리 형태로 안에서 필터링한 데이터에 대해서 메인쿼리와 연결하여 가져온 것과, 그냥 따로 서브쿼리는 쓰지않고 간단히 함수?정도만 사용하여 메인쿼리에 필터를 한 것중 어느 것이 성능이 더 좋을지 비교해보고 싶기는 하다. 내 예상과 선택은 우선 후자를 선택하였다 ) 그리고 car_id에 대하여 가장 최근 데이터만 보면 되기 때문에 car_id로 그룹지어주었다
SELECT hist.CAR_ID,max(hist.start_date),max(hist.end_date) FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY hist where hist.start_date<='2022-10-16' GROUP BY hist.CAR_ID #Having max(hist.end_date)<'2022-10-16' order by 1
데이터가 한개도 안나오길래 설마 이전으로 가장 최근 날짜로 end date끝나는 게 없나 싶어서 보니 없었다(사실 아래 생각한 내용에 따르면 당연한 것 같다)
일일히 눈으로 확인하였었는데 가장 최근 기록만으로 비교할 시 끝나는 날짜가 전부 2022-10-17일 이후였다. 그래서 가장 최근 것으로 비교하면 22년 10월 16일 이후 시점 기록도 다있어서 안될듯하다 그리고 내용상 당연히 10월 16일 이전으로 가장 최근 데이터를 봐야하는 것이다.
SELECT hist.CAR_ID, case when max(hist.end_date)<'2022-10-16' then "대여 가능" else "대여중" end AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY hist where hist.start_date<='2022-10-16' GROUP BY hist.CAR_ID order by hist.CAR_ID desc
위 쿼리가 최종 제출본이다.
쿼리에 대하여 설명해보면 CAR_RENTAL_COMPANY_RENTAL_HISTORY(이하 hist)테이블에서 우선 대여 시작일(hist.start_date)이 2022-10-16이전인 데이터(16일 당일도 포함할지는 애매해서 처음에 고민하였으나, 넣어도 사실 결과 후 이상하다 생각되면 제외되게 수정하면 되고 사실 하면서 16일날 대여할 경우도 대여중이라고 판단을 해야하기 때문에 포함하는게 맞다고 판단하였다)만 가져와서 hist.CAR_ID으로 그룹지어서 hist.CAR_ID와 AVAILABILITY컬럼을 출력하도록 하였는데 AVAILABILITY는 case when을 사용하여 2022-10-16이전인 데이터 중 가장 최근 대여 종료일을 2022-10-16보다 이전이라면 대여가능하고, 16일을 포함하여 이후라면 대여중으로 표시되게 하였다. 그러고 최종적으로 마지막에 hist.CAR_ID을 기준으로 내림차순 정렬해주었다.
오늘은 풀려고 하던 파이썬 코드카타가 계속 안풀리고 어디서 실패가 발생하는지 확인 하지 못하여 수정하는데 시간을 너무 많이 써버려 한문제도 못풀었다
그리고 오늘 임정 튜터님이 파이썬 처음 배우시거나 헤매시는 분들을 위해 파이썬 즉석세션을 열어서 강의해 주셨는데 나는 어느정도 파이썬을 알기에 굳이 들을 필요는 없었지만, 대부분 독학느낌으로 필요한 것만 찾아서 공부한 느낌이라 드문드문 비어있는 구멍이 아직도 좀 있다고 느끼기에 혹시몰라 가볍게라도 들을려고 SQL특강자료를 같이 보면서 같이 들었다
더보기파이썬 즉석 세션 간단 나한테 새로 알았거나 도움 될만한 내용들만 적은 것
(파이썬 코드카타를 풀다 시간이 많이 소모되어 필기체로 타자쳐둔 것을 거의 수정하지 않고 그대로 옮겼다)
위 두개는 파이썬의 대해 찾아볼 때 바이블처럼 쓸 수 있는 곳 2가지라 참고해두면 좋을듯해 기록해두었다.
아직 나는 파이썬 자체?의 IDLE(shell?)을 사용하여 주로 코딩을 하는데 편의성이 좋고 가시성이 좋은 tool을 빨리 찾아서 정할 필요성은 요즘들어 부쩍 느껴지고는 있다(그래도 아직 익숙한 것은 IDLE이라 사용법도 새로 익히고 해야할 것을 생각하면 빨리 찾아봐야할 듯하다.)
IDE개발환경
pycharm 개발할 때 편한 툴은 아님 →따로 여쭤보고 추천 받는 것도 괜찮을지도 우선 먼저 서칭을 해보자 난 아직도 기본 IDLE로 해서.. 쥬피터 노트 이런걸로 많이 하던거 같던데
명시적이고 간단한게 복잡하고 그런 것보다 좋다는게 파이썬 신념?
인바이럴 tool?
:같은 것 빠트리면 syntax error?로 알려줌 대신 간단한 것만 복잡한것은 안해줌
노란색이 문제는 없으나 파이썬 문법에선 적합하지 않다고 약점?같은 걸로 알려주는 것
error내용 복사하여 검색하거나 빨간색 전구를 클릭하여 확인
for문에서 주로 쓰던 i
몰랐던 사실 iteration의 i를 쓰는 거였음
그리고 for문에서 쓰던 i자리에 특수문자 _같은 것 써도 됨 이건 몰랐음
def에서 return 안적어주면
return none한것과 동일
none이 리턴됨
여기서 실제 입력되는 값을 전달인자(argument)라고 함
a.append(x)랑 a[len(a):]=[x] 동일 파이썬 독스에 있는 부분
반복문에 break, continue자리에 pass라는 것도 있다고 함 근데 하는게 없음 그냥 줄채우기용?
말그대로 pass를 패스해버림
함수와 메소드의 차이
->05-1 클래스 대강 읽어봤지만 자세히는 이해되지 않아 일단은 그렇구나 하는 정도만 파악하고 넘어갔다
pep 8 파이썬 문법상 실행은 문제는 없지만 맞춤법같이 좀 형식이 잘 맞지 않을 경우
pep가 그런 규약 , 파이썬 맞춤법 규약같은 것
그리고 참고로 탭은 띄어쓰기 네번해야함
빡센 환경에서는 탭쓰지말고 띄어쓰기 4번 쓰라고함
vs(비쥬얼스튜디오)코드
쥬피터 노트북
컴퓨터 기능 좀 좋아야하면 구글 collab 사용
파이참은 개발용도?느낌?
오늘 전체적으로 SQL 코드카타를 풀고 파이썬 개인과제 튜터님께 애매하다고 판단되는 점 확인해서 보완하여 제출하고, SQL 특강복습하고 파이썬 즉석세션 같이 듣고, 그 뒤로는 어제 풀다 못풀은 파이썬 코드카타 문제를 계속 붙잡고 있었데 별다른 알고리즘이나, 수학적 개념 등을 사용하지 않아서 그런지 조금 경우의 수를 머리속으로 헤아려 조건문을 많이 달아서 하는 방식으로 하게되었는데 결론적으로는 잘 해결되지 않아 슬프다..ㅠ
그런데 SQL 코드카타 문제들이 전체적으로 쉬운 문제만 오늘 나온 것인지 아니면 이제 좀 익숙해져서 풀만해진 것인지는 정확히 모르겠으나, 오늘 SQL 코드카타들은 할만했고 풀이과정에서 이해되지 않거나 불확실한 부분은 없었던 것 같아 그점은 그동안의 노력이 조금은 효과를 발휘하는가 싶어 기쁘다.
'스파르타 > TIL(Today I Learned)' 카테고리의 다른 글
2024-01-08 (0) 2024.01.08 2024-01-06~2024-01-07 (1) 2024.01.08 2024-01-04 (0) 2024.01.04 2024-01-03 (2) 2024.01.03 2024-01-02 (1) 2024.01.02