[2025.11.05] 오늘의 학습 키워드 - 파이썬 조건문과 반복문, SQL JOIN 완전 정복

허진원·2025년 11월 5일

내일배움캠프 TIL

목록 보기
13/41

파이썬은 SQL과 상당히 많이 다르다. 둘 다 데이터를 다루기 위해 필요한 도구들이지만, 서로 사용하는 언어가 상이하다. SQL을 먼저 배워서 파이썬이 더 어렵게 느껴지는 것도 같다. 그래서 어떤 개념이 어떻게 사용되고, 무슨 목적으로 사용하는지 정확히 이해할 필요가 있다.

  1. 오늘 학습 키워드
  • 파이썬 조건문 if 및 반복문 for, while 이해하기
  • SQL JOIN문 응용 실습하기
  1. 오늘 학습한 내용을 나만의 언어로 정리하기
    파이썬은 아직 많이 어색하다. 계속 만지면서 코드 작성 감각을 익혀야 앞으로 응용이 가능할 것 같다.

  2. 학습 내용
    일단 오늘 배운 개념들은 다음과 같다

  • IF 조건문 : 조건을 따라 실행 여부를 결정하는 문법

    if 조건식:
    실행문1
    elif 다른_조건식:
    실행문2
    else:
    실행문3
    *범위 지정
    for ... in range(1, n+1):

  • for 반복문 : 같은 동작을 여러 번 반복할 때

    for 변수 in 반복대상:
    실행문

  • while 반복분 : 횟수를 지정할 수 없을 때, 즉 어떤 특정 조건에서 동작하게 만들 때 사용

    while 조건식:
    실행문

    각각의 코드 문법들은 개별로 사용해도 충분히 효율적인 도구들이다. 그러나 이들을 동시에 활용하면 더 뛰어난 성능을 발휘할 수 있다고 한다. 실제로 보다 복잡한 코드를 실현하기 위해서는 이들을 적절히 합용해야만 한다. 개별 문법만 가지고는 한계가 명확하기 때문이다. 따라서 위 세 가지 파이썬 문법은 반드시 숙지하고 혼합할 줄 알게 되어야만 한다.

    SQL에서는 실습 문제를 풀었다. 난이도가 상당히, 아주 어려워서 거의 하루종일 이 문제만 붙들게 되었다.

    문제는 다음과 같다.

    아래 조건을 만족하여, 알맞은 조인방식으로 users 테이블과 payment 테이블을 조인해주시고,
    게임계정별 보유캐릭터수 및 평균 결제금액을 구해주세요.

    조건1) users 테이블에서 서버번호가 2 이상인 데이터를 구해주세요.
    그리고, payment 테이블에서 결제방식이 CARD 인 경우의 게임계정별 결제금액 합계를 구하고 이름을 total_amt 로 지정해주세요.
    그 다음,이 조건 모두를 만족하는 경우를 알맞은 방식으로 join 해 주세요.

    조건2) 조인한 결과를 바탕으로 users 테이블의 게임계정을 기준으로 게임캐릭터수를 중복값없이 세고 컬럼 이름을 actor_cnt로 지정해주세요. 또한 total_amt 값의 평균을 구해주시고, 컬럼 이름을 avg_amount로 지정해주세요.

    조건3) having 을 사용하지 않고, 인라인 뷰 subquery 사용으로 actor_cnt수가 2 이상인 경우만 추출해주세요. 그리고 avg_amount를 기준으로 내림차순 정렬해주세요.

조건만 봐도 꽤나 복잡하고 요구하는 것이 많다. 특히 서브쿼리문과 join문을 동시에 활용하는 문제였기에, 난이도가 더 높게 느껴졌다.

어찌저찌 풀어내기는 했지만, 어떻게 풀었는지는 잘 기억이 나질 않는다...

다음은 해당 문제에 대해 작성한 쿼리이다.

SELECT
	*
FROM
	(
	SELECT
		a.game_account_id,
		count(DISTINCT a.game_actor_id) AS actor_cnt,
		avg(b.total_amt) AS avg_amount
	FROM
		(
		SELECT
			*
		FROM
			basic.users
		WHERE
			serverno >= 2
) AS a
	INNER JOIN 
(
		SELECT
			game_account_id,
			sum(pay_amount) AS total_amt
		FROM
			basic.payment
		WHERE
			pay_type = 'card'
		GROUP BY
			1
) AS b
ON
		a.game_account_id = b.game_account_id
	GROUP BY
		1
) AS c
WHERE
	c.actor_cnt >= 2
ORDER BY
	avg_amount DESC
;

쿼리의 길이가 상당히 길어졌다. 다른 팀원은 내가 작성한 쿼리와 내용은 같지만, 함수의 적용 순서가 약간 달랐다. 예를 들어 나는 '테이블 a'에서 count 함수를 사용했는데, 팀원은 왼쪽 테이블을 서브쿼리로 활용하지 않고 바로 count 함수를 사용해서 쿼리를 작성했다.

위 쿼리를 실행하면 다음과 같이 출력된다.

같은 문제라도 쿼리를 각자 다르게 작성하게 되는 것은 언제 봐도 흥미로우면서도 경계하게 된다.
문제는 총 6번까지 있다. 오늘은 중간까지 풀다 말았다. 오늘 하루종일 6번 문제를 바라만 보다가 히루를 넘길 듯하여 오늘은 이만 중단하고, 내일 다시 도전해볼 것이다.

  1. 학습하며 느낀 점
    참 어려운 것 같다. 파이썬은 그렇다쳐도, 꽤 많이 익혔다고 생각한 SQL도 이렇게나 어려워질 수 있다는 걸 잠시 잊고 있었다. 시간이 지나도 오늘 풀었던 문제를 생각하면서 "얕보지 말 것"을 되새김질할 것이다.

마치며 : 내일이 지나면 파이썬을 집중해서 공부할 여유가 생긴다. 그렇게 되면 더 수월하게 파이썬에 대해서 이해하고 활용할 수 있게 될 것이다. 물론 SQL도 손을 놓지 않고 지속적으로 풀 것이다. 두 마리 토끼를 다 잡는 내가 될 수 있도록 정진하자.

profile
국문과 전공 데이터 입문자

0개의 댓글