ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023-12-29
    스파르타/TIL(Today I Learned) 2023. 12. 29. 23:43
    더보기

    SQL 코드카타

    앞으로는 다시 모아서 확인 비교하기 쉽게 좀 헷갈리거나 하는 개념이다 싶은 메소드? 함수?들은 태그처럼 같이 기록해둘 예정이다.

    보호소에서 중성화한 동물 (join, like, and)

    https://school.programmers.co.kr/learn/courses/30/lessons/59045

    보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.라는 문제이다.

    SELECT o.ANIMAL_ID, o.ANIMAL_TYPE, o.NAME
    from ANIMAL_INS I inner join ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
    where I.SEX_UPON_INTAKE like '%Intact%' and O.SEX_UPON_OUTCOME not like '%Intact%'
    order by 1
    

    마찬가지로 위에 테이블명. 해줘야 오류안났음, join 여전히 살짝 애매하게 판단된다.

     

    조건에 맞는 도서와 저자 리스트 출력하기 (join, date_format)

    https://school.programmers.co.kr/learn/courses/30/lessons/144854

    '경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요. 라는 문제이다.

    SELECT BOOK_ID, AUTHOR_NAME, 
            DATE_FORMAT(PUBLISHED_DATE,"%Y-%m-%d") PUBLISHED_DATE
    from book b left join author a on b.AUTHOR_ID=a.AUTHOR_ID
    where CATEGORY="경제"
    order by 3
    

     

    현재 일부러 확인해본다고 select부분에서 테이블명.컬럼으로 안적고 컬럼만 적고 있는데 테스트해본 결과로 판단해봤을 때 양 테이블에 중복되는 컬럼명이 있을 때는 테이블명. 붙여줘야하고 아닐 때는 굳이 안붙여도 알아서 잘 되는 듯하다.

    그리고 앞에서 내용을 적었는지는 정확히 기억이 나지 않지만, 할 때 정확히 기억이 나지 않아 적자면 DATE_FORMAT(컬럼,”형식”) 할때 형식에서 %Y :2023같이 4글자 연도 %y 23같이 2글자 연도, %M June 같이 영어로 월 %m 숫자로 06, 11같이 월, %D 10th처럼 일 표시, %d 숫자로 03,10같이 일이 표시된다.

     

    조건별로 분류하여 주문상태 출력하기 (join, case when)

    https://school.programmers.co.kr/learn/courses/30/lessons/131113

    FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요. 라는 문제이다.

    SELECT ORDER_ID, PRODUCT_ID,
            DATE_FORMAT(OUT_DATE,"%Y-%m-%d") OUT_DATE,
            if(DATE_FORMAT(OUT_DATE,"%m-%d")<05-02,'출고완료','출고미정') "출고여부"
    from FOOD_ORDER
    order by 1
    

    <=05-01으로 조건을 적으면 아마 05-01 시간~ 이 원래 데이터라서 그런지 0501은 출고미정으로 나와서 <05-02로 바꿨더니 모든 데이터가 출고미정으로 나와서 정확한 이유를 모르겠다 → ‘05-02’를 붙여주지 않아 오류가 있어서 그랬던 것같다

    SELECT ORDER_ID, PRODUCT_ID,
            DATE_FORMAT(OUT_DATE,"%Y-%m-%d") OUT_DATE,
            case when DATE_FORMAT(OUT_DATE,"%m-%d")<='05-01' then '출고완료'
                when DATE_FORMAT(OUT_DATE,"%m-%d")>'05-01' then '출고대기'
                else '출고미정'
                end "출고여부"
    from FOOD_ORDER
    order by 1
    

    그리고 추가로 null값등은 출고미정으로 해주고 5월1일 이후날짜는 출고대기인데 출고대기를 못보는 바람에 빠트려서 몇 분 동안맞게 한거 아닌가 왜 틀렸지 했다

     

    더보기

    대충 만든 자판 (필터링, lambda람다 함수) (python코드카타)

    https://school.programmers.co.kr/learn/courses/30/lessons/160586

    대강 휴대폰 자판처럼 몇 개의 키가 주어지는데 하나의 키당 여러개의 값 할당 가능 연속으로 여러 번 누르면 할당된 값으로 바뀜, 문자열 몇 개 주고 그것을 입력가능한지, 가능하다면 최소 몇번의 입력으로 가능한지 (풀면서 살짝 애매했던 것은 키가 “AB”일때 “ABA“처럼 연속해서 같은 키를 눌러야 하는 경우 “AB”키를 1번2번1번 이렇게 눌러야하는데 연달아 값만 계속 변하진 않을까 생각한 점도 있지만 그래도 모티브가 휴대폰 자판을 삼은 듯하여 휴대폰 자판입력처럼 같은키를 계속 눌러 입력해야 하더라도 텀을 두거나 커서를 옮겨서 입력하는 등으로 가능하다고 가정하고 코드를 작성하였다)

    def solution(keymap, targets):
        answer = []
        for string in targets:
            count=0 #글자별로 초기화
            sw1="run" #더 반복문 돌릴 필요 없을 경우는 스킵하기 위해
            for i in range(len(string)):
                min_check=[0 for i in keymap] #횟수기록 초기화
                for j in range(len(keymap)): #버튼종류별 반복문
                    if string[i] in keymap[j]:
                        min_check[j]=keymap[j].index(string[i])+1    
                    if j+1==len(keymap): #버튼별 전부 확인후 정산적용
                        if max(min_check)>0:
                            count+= min(list(filter(lambda x: x > 0, min_check)))
                        else:
                            count=-1  #전부 다 확인해서 없으면 -1값 저장
                            sw1="stop"
                if sw1 == "stop":
                    break
            answer.append(count)
            
        return answer
    
    #과정 시각화 보기용
    '''def solution(keymap, targets):
        answer = []
        for string in targets:
            count=0 #글자별로 초기화
            sw1="run" #더 반복문 돌릴 필요 없을 경우는 스킵하기 위해
            for i in range(len(string)):
                min_check=[0 for i in keymap] #횟수기록 초기화
                for j in range(len(keymap)): #버튼종류별 반복문
                    if string[i] in keymap[j]:
                        print(string[i])
                        min_check[j]=keymap[j].index(string[i])+1    
                    if j+1==len(keymap): #버튼별 전부 확인후 정산적용
                        if max(min_check)>0:
                            print(min(list(filter(lambda x: x > 0, min_check))))
                            count+= min(list(filter(lambda x: x > 0, min_check)))
                        else:
                            count=-1  #전부 다 확인해서 없으면 -1값 저장
                            sw1="stop"
                        
                print("글자이동 ",min_check,count)
                if sw1 == "stop":
                    break
            print(string)
            answer.append(count)
            
        return answer'''
    

    필터링하는 함수랑 그것을 하면서 lambda함수를 처음 써봤는데 간단한 사용법은 다음과 같다

    filter(조건 함수, 순회 가능한 데이터)

     조건 함수에  순회 가능한 데이터[ ]== 어떤 값 이나 x>어떤값 등의 조건을 의미하는 내용을 리턴해주는 함수가 들어가면 된다.

    보통 조건이 한줄 정도로 간단하다면 lambda 함수와 같이 많이 쓰이는 듯하다.

    lambda 매개변수 : 표현식

    람다 함수의 형식은 위와 같으며  예시 하나 들어보면 아래와 같다.

    >>> (lambda x,y: x + y)(10, 20)
    30

    filter함수를 아직 알듯 말듯해서 간단한 이용은 예시도 꽤 있고 이번에는 간단한 사용만 하여서 자세히 얘기하기엔 조금 부족하지만, 다음에 자세히 쓸 일이 있다면 좀 더 자세히 정리해 보도록 할 예정이다.

    그 외 오늘 원래는 SQLD강의를 끝까지 들을 예정이였는데 오늘 공개된 개인과제가 SQLD강의 내용(오라클 SQL)과 관련이 적다고 볼 수 있는 기존에 들었던 엑셀보다 쉬운 SQL강의에서 배운 Mysql 문법을 사용하여 푸는 문제가 주어졌기에 우선 하면서 물어볼 부분은 주말에 튜터님들에게 물어보기 힘드니 미리 한번 간단히 쭉 풀어보고 강의를 들을 예정이였는데, 처음에 MySQL을 설치해야한다는 사실도 인지하지 못하여 조금 헤매다가 동기분들과 검색을 통해 해결하고는 설치와 기본 세팅을 마치고 풀이를 시도해 볼 수 있었다. 하지만 생각보다 이런저런 문제가 발생한 것을 해결하는데 시간이 많이 걸린 점과, 아직 SQL이 미숙하기도 하고 아직 데이터의 내용에 대해 어떠한 내용을 어떻게 저장되어있는지 제대로 인지 못한 상태로 풀다보니 초급 문제는 다 풀고, 중급 문제는 몇 문제 정도 풀었지만, 아직 고급은 손대 보지 못하였고, 중급 몇 문제도 시간이 꽤 들여 풀어볼려고 했으나, 결국 제대로 풀지 못한 상태로 오늘 하루를 마무리 짓게 되었다. (그 결과 오늘 강의도 한 개도 못듣고, 어제 들은 7주차 강의 내용도 확인 및 정리를 하지 못하였다.) 아마 연휴를 이용하여 덜한 부분들을 마저 채워나가야 할듯하다.

    그리고 추가로 왜 이런 버그아닌 버그로 인한 무슨 설정이 바뀌었는지 확인 못하고 장시간 소비한 문제가 있었는데

    아래와 같이 컬럼명이 빨간색으로 뜨고, 밑줄이 그어졌다. 튜터님에게 도움도 받아봤지만, 튜터님도 처음 보시는 경우에, 튜터님이 재현을 못하셔서, 결국 몇몇 시도를 해보다 DBeaver삭제 후 재설치로 해결을 하였다.

    추가로 안 정보에 대해서는 그전에 주로 보통 쓰던 date_format (날짜 시간 형식을 문자형식으로)과 반대되는 기능의 함수를 알게 되었다 str_to_date로 문자형식을 날짜형식으로 바꿔주는 함수 이며, '%d'(두자리 일), '%m'(두자리 월), '%Y'(네자리 년도) 등이 있다.

    그리고 3개 이상 테이블 join하는 법은 그냥 두개 join할떄처럼 from 테이블1 (join종류) join 테이블2 on 테이블1.공통컬럼1 =테이블2.공통컬럼1에서 추가로 뒤에 또 한다는 느낌의 형식이다. from 테이블1 (join종류) join 테이블2 on 테이블1.공통컬럼1 =테이블2.공통컬럼1 (join종류) join 테이블3 on 테이블1.공통컬럼2 =테이블2.공통컬럼2  그런데 아직 확실히 어떻게 해야하는지는 좀 다뤄보면서 테스트해봐야 알 것 같다 적당히 같은 컬럼이라고 붙였더니 이상하게 데이터가 복제되어 늘어났었다.. 아마 공통컬럼을 잘 선정해서 붙여야하는데 적당히 같네?하고 붙여버린게 원인인듯하다(고유성이 없는 컬럼을 붙였던 것같다.) 그리고 3번째로 붙이는 테이블에 대헤서는 아마 테이블1과 공통컬럼으로 붙여도 되고 테이블2에 붙여도 될 것 같은데 테스트 해봐야 알 수 있을 듯 하다.

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    2024-01-02  (1) 2024.01.02
    2023-12-30~2023-01-01  (0) 2024.01.02
    2023-12-28  (1) 2023.12.28
    2023-12-27  (0) 2023.12.27
    2023-12-26  (1) 2023.12.27
Designed by Tistory.