기타/Python

250618_SQL변수선언 @hour / 파이썬 for if if

baektree 2025. 6. 18. 21:49

요약/나만의 인사이트

  • select는 행마다 돌며 조건에 맞는 값을 출력해서 조회한다.
  • 따라서 @hour = @hour +1 할 경우 1씩 더하며 변수에 저장 후 행마다 돌기 때문에 반복문을 실행하는 것과 같은 효과가 나타난다.
  • 단 반복하는 구간을 지정하고 싶으면 where < 23 해주면 된다.
  • 행이 0부터 시작하길 원하면 변수 초기값을 -1로 셋팅하면 수월하다.
  • 파이썬 코드짤 때 요구사항 → 로직정리(이때 첫번째관문, 두번째 관문 등의 거쳐하는 관문을 블록처럼 생각하면 수월하다.)
  • 공통으로 거쳐야 하는 요소 (예를들어 빈 반환값 셋팅 anwer = []) 은 상단에 만들어 놓는다.)
  • for문 if문 등은 같은 들여쓰기 위치에 있으면 독립적으로 실행된다.
  • 위의 if의 참, 거짓과 상관없이 둘다 실행 if if
  • 순서대로 실행, 만약 참이면 참인 구문만 실행 if elif else

새롭게 알게 된 것

  • SQL 변수선언 @hour := hour + 1
    • 변수선언
    • 변수 값 할당
    #변수 선언
    DECLARE @product_name VARCHAR(50);
    DECLARE @product_price DECIMAL(10, 2);
    
    #참고 DECIMAL(10, 2) : 소수점을 포함하는 숫자 데이터를 저장하기 위한 자료형
    10 - 전체자릿수
    2 - 소수점 이하 자리수
    즉 최대 10자리 숫자까지 저장할 수 있으며 2자리는 소수점 이하 자릿수로 사용
    12345678.90
    
    #변수 할당
    SET @product_name = 'Laptop';
    SET @product_price = 1200.50;
    
    #쿼리 결과 변수 할당
    SELECT @product_name = name, @product_price = price
    FROM products
    WHERE product_id = 1;
    
    • 관련 문제
      • 문제:https://school.programmers.co.kr/learn/courses/30/lessons/59413
      • 요구사항
        • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회
        • 시간대 순으로 정렬
      • 오답
      • #단순하게 시간대별 입양횟수를 파악하기 위해 COUNT 함수를 수행했다. #그러나 0시 ~ 6시 정보가 없다는 점을 파악했다. SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) FROM ANIMAL_OUTS GROUP BY HOUR(DATETIME) ORDER BY 1
      • 정답SET @hour := -1; hour이라는 변수를 만들고 값을 -1로 초기화
        @hour := @hour +1 0 = -1 +1
        그래서 HOUR는 0  
        count(*) datetime의 시간 값이 0인 행의 개수 카운트
        FROM ANIMAL_OUTS 이 테이블의 행 수만큼 반복해서 실행하게 만들어줌
        즉 @hour := @hour + 1 평가되어 증가된 값이 변수에 저장되고 다음 행 이어서 실행  
        @hour < 23 다만 @hour <23일 때까지만 결과 출력
        (즉, 0시부터 23시까지)  
        • 꼭 기억해야 할 핵심 포인트
          • set @hour := -1 은 변수 선언해서 초기값 -1을 할당하는 것
          • @hour := @hour +1 select가 실행될 때마다 1씩 증가하며 누적됨, → 각 행(row)이 평가될 때 이 식이 실행돼서, @hour가 차례대로 0, 1, 2...로 변함
          • from animal_outs 이 테이블의 행 수만큼 select가 반복실행됨
          • @hour <23 hour이 23 전까지는 멈춤
          다시 말해 행(row)의 수만큼 SELECT가 반복 실행되며, 각 행마다 @hour를 1씩 증가시켜 hour 값을 만들고 @hour <23 조건을 통해 24만 출력되도록 제한된다. 행 수만큼 SELECT가 반복 실행되는 이유는 SELECT문이 행 단위로 데이터를 처리하는 언어이기 때문. 즉 FROM 절에 있는 테이블의 각 행마다 SELECT 절이 한번씩 실행된다는 개념
SET @hour := -1; -- 변수 선언 SELECT (@hour := @hour + 1) as HOUR, -- 행이 1씩 추가되도록 함 (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT FROM ANIMAL_OUTS WHERE @hour < 23

 

특히 어려웠던 것

  • 파이썬 나누어 떨어지는 숫자 배열
    • 문제
    • 요구사항
      • array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
      • divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
    • 문제 살펴보기
      1. divisor로 나누어떨어지는 몫이 있다. > 빈 리스트에 받아서 > 오름차순 정렬
      2. divisor로 나누어떨어지는 몫이 없다. > -1 반환
    • 공통 요소를 기준으로 로직 설정하기
      • 내가 설정해본 로직
        • 해당조건에 맞는 반환값을 받을 빈 리스트를 선언해 놓는다.
        첫번째 관문
        • divisor로 나눈다
        • 나누어떨어지는 원소로 신규 배열을 만든다. 그것을 오름차순 정렬한다.
        두번째 관문
        • 다 만들어 놨다. 그리고 조건을 하나 더 붙인다. 나누어떨어지는 게 아무것도 없을 때 len(answer) == 0 answer는 -1이다.
    • 구체적인 숫자로 코드 짜보기
    • 일반화하기
    def solution(arr, divisor):
    	answer = []
    	for i in arr:
    		if i % divisor == 0:
    				answer.append(i)
    				answer = sorted(answer)
    	if len(answer) == 0:
    			answer = [-1]
    			
    	return answer
    

다음에 적용해 볼 것

  • [ ] 가벼운 마인드, 꾸준히 재밌게 정진해서 실력을 향상한다. 나는 나만의 속도로 간다!
  • [ ] 중요한건 학습의 즐거움이다!!