SQL

250528_SQL(RANK), 파이썬(함수)

baektree 2025. 5. 28. 21:03

 

오늘의 학습에 대하여

  • 파이썬은 쉽지 않다.
  • 하지만 차근차근 하면 가까워 질 수 있다. 아자잣!!

1. 오늘 학습 한 내용을 나만의 언어로 정리하기

  • while
    • while을 하면서 내가 응용했던(?) 오답과 정답을 비교해보기
    정답
    total = 0
    while True:
        num = input("숫자를 입력하세요 (종료하려면 'quit' 입력): ")
        if num == 'quit':
            break
        total += int(num)
    
    print("합:", total)
    
    total = 0
    while True:
        num = input("숫자를 입력하세요 (종료하려면 'quit' 입력): ")
        if num == 'quit':
            break
        total += num
    
    print("합:", total)
    
    • 숫자만 넣을거라서 num만 했더니 unsupported operand type(s) for +=: 'int' and 'str’ 라고 떴다.
    • 무슨 말인지 해석하니, “+=에 지원되지 않는 피연산자(연산에 사용되는 값 ) : 정수형, 문자)”라고 함
    • 다시 말해 파이썬에서 += 연산자를 사용하려고 했는데, 정수형(int) total 변수에 에 문자열(str) num을 더하려고 해서 에러가 난 것임
    • 왜 그런가 하면 input 함수는 모두 문자열로 반환된다고 함
  • 오답
  • def
    • 문제
      • 주어진 데이터셋의 평균을 계산하는 함수를 작성하고 함수의 결과를 출력해 보세요!
      • # 데이터는 이것을 사용하세요 data = [2, 4, 6, 8, 10]
    • 작디 작은 지식으로 만들어낸 코드
      • def mean(data):
            for num in data:
              total = 0
              total += num
              mean = total/len(data)
        
        data = [2, 4, 6, 8, 10]
        print(mean(data))
        
        #답 NONE
        ​

         
      • 왜 틀렸을까?
        • 함수는 mean이고 매개변수는 data야
        • data에 있는 리스트 요소를 하나씩 돌아가며 num에 받을거야
        • total은 0이야 → 반복문 안에 total= 0이라 누적해서 더할 수 없다. 매번 num 하나만 더하고 끝난다. 마지막엔 결국 10이 남는다. 따라서 total=0은 반복문 바깥에 있어야 한다.
        • total에 2를 더해
        • 그리고 mean을 구해 → data가 인수를 다 돌았을 때 결과값이 무엇인지 나타나게 해야 한다. return = total / len(data) 처럼, return이 없으면 함수가 아무것도 반환하지 않은 것이므로 NONE을 반환한다.
        • 다시 반복해 total을 누적해서 더했지만 또 0이야…
    • 정답
      • def mean(data):
            total = 0 
            for num in data:
              total += num
            return total/len(data)
        
        data = [2, 4, 6, 8, 10]
        print(mean(data))
    • 다른풀이
      • def mean(numbers):
        		return sum(numbers) / len(numbers)
        
  • def을 쓰면서 나의 오답과 정답을 비교해보기

 

2. 학습하며 겪었던 문제점 & 에러

  • 문제1) 코드카타 48번 (SQL)
    • 문제 출처
    • 내가 겪은 문제점?
      • RANK로 풀었는데, 다른 사람의 다른 풀이법(WHERE)이 이해되지 않는다.
    • WHERE을 활용한 풀이법 샅샅이 뜯어보기
      • 문제) 음식종류별 즐겨찾기가 가장 많은 식당의 음식종류, ID, 식당 이름, 즐겨찾기 수 조회하기
      • REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
      • 풀이
        • 첫번째 관문
          1. 음식종류별로 즐겨찾기가 가장 많은 식당 → 오 MAX( ) 써야하네를 생각한다.
          2. 독해를 한다.
            1. 어디 테이블에서? FROM rest_info
            2. 무엇을 food_type, max(favorites)
            3. 조건은?
            4. 그룹은? food_type
            5. 정렬은?
          3. 쿼리문을 작성한다.
          4. SELECT food_type, MAX(favoriteS) FROM rest_info GROUP BY food_type
        • 두번째 관문
          1. 위에서 구한 쿼리문을 WHERE 절을 활용해 음식종류별 즐겨찾기가 가장 많은 식당 음식 종류 등을 조회한다.
          2. 구문별 보기
            1. 어디에서 REST_INFO
            2. 무엇을 FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
            3. 조건은
            • FOOD_TYPE 과 FOOD_TYPE
            • FAVORITES 과 MAX(FAVORITES)이 쌍으로 같은 것을 필터링한다.
            1. 정렬은? FOOD_TYPE DESC
          3. 쿼리문 작성하기
          SELECT FOOD_TYPE,
          		REST_ID,
          		REST_NAME,
          		FAVORITES
          FROM REST_INFO
          WHERE (FOOD_TYPE, FAVORITES) IN 
                                      (SELECT FOOD_TYPE,
                                              MAX(FAVORITES)
                                      FROM REST_INFO
                                      GROUP BY FOOD_TYPE)
          ORDER BY FOOD_TYPE DESC	
          
          • WHERE ( A, B) IN ( A-, B-) : A와 A- B와 B-를 쌍으로 비교한다.
          • 즉 FOOD_TYPE과 FOOD_TYPE PRICE과 MAX(PRICE)가 쌍으로 비교된다. 따라서 MAX(PRICE)를 포함하는 값만 나오게 된다.
        • cf rank () over 풀이방법
          • WITH A AS (SELECT ~~ FROM) : SELECT 구문을 묶어 임시로 만든 테이블 A, 연산 과정이 차례대로 보이므로 가독성이 좋다. (그에 비해 서브쿼리는 가독성이 떨어지고, 쿼리문이 한꺼번에 실행되므로 WITH에 비해서 좋지 않다. 실무에선 WITH가 많이 쓰인다고 함.)
          • WITH A AS (SELECT FOOD_TYPE,
                    REST_ID,
                    REST_NAME,
                    FAVORITES,
                    RANK() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS rnt
            FROM REST_INFO)
            
            SELECT FOOD_TYPE,
                    REST_ID,
                    REST_NAME,
                    FAVORITES
            FROM A
            WHERE rnt = 1
            ORDER BY FOOD_TYPE DESC
            
            
  • 문제2) 코드카타 49번 (SQL)
    • 문제
    • FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
    • 풀이1
      • 풀이방법 상세
        1. 카테고리, 가격, 이름, 카테고리 별 가격 높은 순 랭킹을 조회한다.
        2. 이것을 WITH로 임시테이블을 만든다.
          • WITH : 임시 테이블을 만들어 놓는 것 (=서브쿼리(하위쿼리)를 미리 이름 붙여 주는 정의해두는 문법, Common Table Expression이라고 부른다.)
          • 복잡한 쿼리를 깔끔하게 만들 때, 같은 서브쿼리를 여러 번 반복하지 않기 위해, 가독성과 유지보수를 쉽게 하기 위해 사용한다.
        3. 본 쿼리를 통해 카테고리, 가격(max로 별칭), 이름을 조회한다.
        4. 이때 임시 테이블 A에서 조회한다.
        5. 필터링 조건은 RANKING = 1 인 것, 그리고 카테고리에 과자, 국, 김치, 식용유를 포함하는 것이다.
        6. 가격 내림차순으로 정렬한다.
      • SELECT CATEGORY,
                PRICE AS MAX_PRICE,
                PRODUCT_NAME
        FROM FOOD_PRODUCT
        WHERE (CATEGORY, PRICE) IN 
                                (SELECT CATEGORY,
                                        MAX(PRICE)
                                FROM FOOD_PRODUCT
                                GROUP BY 1)
                                AND
            CATEGORY IN ('과자', '국', '김치', '식용유')
        ORDER BY 2 DESC
        
    • 풀이2
      • def num(a, b):
        	return a + b
        
        num(3, 5) 
        
        #8
        cf return을 값을 반환하는 예약어이기 때문에 =을 붙일 필요 없음. =을 붙이면 할당해야 되는 변수가 됨
        ​

        여기서 잠깐, 파이썬 함수에는 무조건 return이 들어가야 하나요?
        • 함수에서 어떤 값을 반환하고 싶으면 return이 꼭 필요하다.
        • 함수가 단순히 동작만 하고, 값을 돌려줄 필요가 없을 때에는 return이 없어도 괜찮다.
        def greet(name):
        	print("hellow,",name)
        
        greet("HYEJIN")
        
        # hellow, HYEJIN
        

 

3. 내일 학습 할 것은 무엇인지

  • [ ] 파이썬 5주차 학습 바로!
  • [ ] 그리고 파이썬 3,4,5주차 복습

#내일배움캠프 #사전캠프 #TIL