본문 바로가기

IT, Computer

[MySQL] SQL SELF JOIN & DATE type format

반응형

 

 

목차

     

     

    썸네일

     

     

     

     

     

     

    SELF JOIN & DATE type format에 대해 알아보기 위해 SQL 문제 사이트인 리트코드에서 https://leetcode.com/problems/rising-temperature/ 요문제를 풀어보자.  SELF JOIN에 대한 다른 포스팅은 여기로 가면 된다.

     

    [MySQL] SELF JOIN에 대해 알아보자

    목차   MySQL SELF 조인이란MySQL을 공부하며 제일 헷갈리는게 조인인데 (left join, right join, inner join 등등등) SELF JOIN이라는 놈도 있다ㅋㅋ SELF JOIN이란 무엇인가 . .  쉽게 말하면 자기 자신을 조인하

    quiseol.com

     

     

     

    문제

    얘가 요구하는걸 보면, 전날 온도보다 더 높은 온도를 가진 아이디를 뽑아라이다.  

    Weather table:
    +----+------------+-------------+
    | id | recordDate | temperature |
    +----+------------+-------------+
    | 1  | 2015-01-01 | 10          |
    | 2  | 2015-01-02 | 25          |
    | 3  | 2015-01-03 | 20          |
    | 4  | 2015-01-04 | 30          |
    +----+------------+-------------+

     

    여기서 전날의 온도와 비교를 하려면 SELF JOIN을 해야되는데 .. 그냥 셀프 조인하면 걍 옆에 붙는데요 전날이랑 어케 연결하죠?ㅋㅋ 이걸 으떻게 하느냐? 바로 -> INNER JOIN WEATHER AS YESTERDAY ON YESTERDAY.(ID+1) = TODAY.ID요렇게 하면 된다. (SELF JOIN을 할 땐 명칭을 다르게 하는게 구분할때 좋다. 난 머리 좋아서 안 헷갈리는데요ㅋㅋ 이러지마로 걍.. 하는거 추천요.)

     
    SELECT * 
    FROM WEATHER AS TODAY
    INNER JOIN WEATHER AS YESTERDAY ON YESTERDAY.(ID+1) = TODAY.ID

     

     

    이렇게 선언하면 결과값으로 아래와 같이 나오는데, 빨간색 볼드체로 된 것이 현재 그리고 그 오른쪽이 어제의 날씨가 이너조인이 된 상태라고 보면 된다. 

     

    | id | recordDate | temperature | id | recordDate | temperature |
    | -- | ---------- | ----------- | -- | ---------- | ----------- |
    | 2 | 2015-01-02 | 25 | 1 | 2015-01-01 | 10 |
    | 3 | 2015-01-03 | 20 | 2 | 2015-01-02 | 25 |
    | 4 | 2015-01-04 | 30 | 3 | 2015-01-03 | 20 |

     

    이제 저기에다가 where절로 today.tmp > yesterday.tmp 를 선언하고 id 출력하면 된다.

     

    | id | recordDate | temperature | id | recordDate | temperature |
    | -- | ---------- | ----------- | -- | ---------- | ----------- |
    2 | 2015-01-02 | 25 | 1 | 2015-01-01 | 10 |
    | 3 | 2015-01-03 | 20 | 2 | 2015-01-02 | 25 |
    4 | 2015-01-04 | 30 | 3 | 2015-01-03 | 20 |

     

    그럼 이렇게 나오고?ㅋㅋ id가 2,4 나오것지? 역시난 천재야ㅋㅋㅋㅋ 하고 submit을 누르면? 틀린다.

    왜냐 id가 날짜랑 정비례, 1:1대응 된다고 된다는 전제가 없기 때문에.. 출제자가 테스트케이스에.. 숨겨놓은것

    믜.칑.것.

     


    DATE format 관련 함수

    - DATE format 더하기 함수 : SELECT DATE_ADD(NOW(), INTERVAL 1 ___)

    ___에 들어갈 수 있는건 SECOND, MINUTE, HOUR, DAY, MONTH,YEAR가 있다. 1대신 다른 숫자 넣으면 이틀 추가 두시간 추가 , 음수 넣으면 빼지기도함.. sub함수도 있다. 편한거 쓰면 된다.

     

    - DATE format 빼기 함수 : SELECT DATE_SUB(NOW(), INTERVAL 1 ___)

    ___에 들어갈 수 있는건 ADD함수와 같이 SECOND, MINUTE, HOUR, DAY, MONTH,YEAR가 있다. 역시 숫자 말고 ㅇㅋ하면됨. 

     


     

    DATE type format  함수를 이용한 문제 풀이

     

    SELECT TODAY.ID 
    FROM WEATHER AS TODAY
    INNER JOIN WEATHER AS YESTERDAY ON DATE_ADD(YESTERDAY.RECORDDATE,INTERVAL 1 DAY) = TODAY.RECORDDATE
    WHERE TODAY.TEMPERATURE > YESTERDAY.TEMPERATURE

     

    결론적으로 위와 같이 적는 것이 본 문제의 정답이 된다.

    띠용

     

     혹시 "즈는 SUB에다가 음수 처넣어서 양수로 더하기 만들건데요." 라고 생각하는 사람이 있으쉰지..?ㅋㅋ 사실 이거 저임ㅋㅋ 아니 궁금하자나요.. 되는지 안되는지 확인은 할 수 있는거 아닌가요.

    문제 예시

     

    해본 결과 잘 돌아간다. 님들은 이런 뻘짓하지 마시고 그냥 ADD 쓰세요. 그냥 해본거임 궁금해서요. 저도 ADD함수 쓸겁니다. 이상으로  [MySQL] SQL SELF JOIN & DATE format type 포스팅을 마칩니다. 즐거운 SQL 허시길.