[내배캠] 데이터분석 6기/사전캠프 기록

[사전캠프 4일차] 파이썬 복습, SQL 복습 및 학습

물맨두 2025. 1. 23. 16:24

 

내가 한 발짝, 두 발짝 다가가면 세 발짝 멀어지는 SQL,
그리고 아직 가까워진 적 없는 파이썬...

 

팀 노션에서 오늘 쓸 데일리 스크럼 페이지를 열어 오늘 할 일을 정리하는 것으로 공부를 시작한다. 오늘 할 일은 크게 2가지.

  • 파이썬 공부
    • [파이썬 문법 기초] 1주차 - 1-8, 1-9 수강
    • 개인퀘스트(걷기반) - [Python 알아보기] 반복문 연습하기 Part 1
  • SQL 공부
    • 개인퀘스트(걷기반) - [SQL 문법 연습] (4), (5), (6)
    • [엑셀보다 쉽고 빠른 SQL] 3주차

오늘도 열심히 할 일을 하자.. 아직 쉬울 때 얼른 진도 좍좍 빼놓고 자격증 공부 일정 잡아야지.

 


 

파이썬 공부: ① [파이썬 문법 기초] 1주차 1-8~1-9

반복문: for

우선 어제 뭘 공부했는지 보지 않고 냅다 반복문 연습 문제를 풀어보았다. 근데 당연히 기억이 안 나서 한 30초 정도 파이참 창을 바라보다가 강의자료 노션 페이지를 뒤지기 시작하다..

 

[실습] 1-8-(21). 리스트에서 짝수만 출력하기

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

for even_number in num_list :
    print(even_number)

우선 이렇게 적어놓았다. 짝수는 2로 나눴을 때 나머지가 0인 수이니 그런 값만 가져오라고 조건을 넣으면 될 것 같다.

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

for even_number in num_list :
    if even_number % 2 == 0 :
    print(even_number)

그리고 이렇게 적어보았는데 "IndentationError : expected an indented block"라는 에러 메시지가 떴다. 들여쓰기가 잘못됐다고 한다. 친절하게 몇 번째 줄에서 문제가 생긴지까지 알려준다.

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

for even_number in num_list :
    if even_number % 2 == 0 :
        print(even_number)

이렇게 들여쓰기까지 고치면 2, 6, 2, 4, 6, 2, 4 라고 출력한다. 굿굿

  • % : 나머지를 계산하는 연산자
  • == : '같다'를 뜻하는 비교연산자
  • 들여쓰기는 중요하다! ( 들여쓰기: tab / 내어쓰기: shift+tab )

[실습] 1-8-(22). 리스트 내 짝수 개수 출력하기

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

for even_number in num_list :
    if even_number % 2 == 0 :
        print(count(even_number))

혹시 count() 함수를 쓸 수 있지 않을까 싶어서 위와 같이 써보았으나 count라고 변수 선언을 한 게 없다는 에러 메시지가 떴다.

 

찾아보니 count() 함수가 있긴 한 거 같은데 이 상태에서 어떻게 적용해야 할지 몰라서 강의에서 알려준 대로 입력하는 것으로 마무리...

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
count = 0

for even_number in num_list:
    if even_number % 2 == 0:
        count += 1
        print(count)

 

  • += : 변수에 값을 더한 후 할당하는 연산자

[실습] 1-8-(23). 리스트 내 모든 수를 더하기

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

print(sum(num_list))

이렇게 한 번 작성해봤는데 됐다... 뭐지? 파이썬에 sum() 함수를 쓸 수 있을 거 같아서 입력해보고 실행했더니 값이 출력됐다.

[실습] 1-8-(24). 리스트 내 자연수 중 가장 큰 숫자 출력하기

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

print(max(num_list))

...? 이것도 됐다. 최댓값을 찾는 함수가 max()라고 하길래 이렇게 썼더니 최댓값인 6을 출력해낸다. 굿~

 

함수

1-9-(26). 주민등록번호를 받아 성별을 출력하는 함수 만들기

def check_sex(pin):
    key = pin.split('-')[1]

my_pin = '200101-3012345'
check_sex(my_pin)

우선 하이픈을 기준으로 문자열을 쪼개고 그 중 뒷자리만 선택할 수 있게 쓴다.

def check_sex(pin):
    key = pin.split('-')[1]
    key_num = int(key[:1])

my_pin = '200101-3012345'
check_sex(my_pin)

그 다음으로 주민등록번호 뒷자리에서 첫 번째 문자만을 가져오도록 작성하고서

그것을 int()로 감싸 문자열을 숫자로 바꿔주었다.

def check_sex(pin):
    key = pin.split('-')[1]
    key_num = int(key[:1])
    if key_num % 2 == 0:
        print('여성입니다')
    else:
        print('남성입니다')

my_pin = '200101-3012345'
check_sex(my_pin)

이제 마지막으로 if를 사용해 짝수/홀수를 판단하여 짝수면 '여성입니다', 홀수면 '남성입니다'를 출력하도록 하면 함수가 완성됐다.

아제 아래의 my_pin에 입력하는 대로 '여성입니다' 혹은 '남성입니다'를 출력한다.

(단 내가 작성한 것 위와 같고 강의에서 설명한 방식은 다음과 같이 더 단순하게 작성한 방식이었다.

  • key = pin.split('-')[1]
    key_num = int(key[:1])
    if key_num % 2 == 0:
    • key = pin.split('-')[1][:1]
      if int(key) % 2 == 0:

파이썬 공부: ② 사전캠프 개인퀘스트 걷기반

어제부터 오늘까지 공부한 파이썬을 개인 퀘스트를 통해 연습해보기로 한다.

 

1️⃣ 반복문 연습하기 Part 1

리스트에서 해당 값이 몇 번 등장하는지 출력하기

numbers = [1, 2, 3, 4, 2, 2, 5, 2]
value_to_find = 2

위와 같이 주어진 정보들을 이용해서

numbers = [1, 2, 3, 4, 2, 2, 5, 2]
value_to_find = 2
count = 0

for num in numbers:
    if num == value_to_find:
        count += 1
        print('리스트에서 'value_to_find'는 ' count'회 등장합니다!')

이렇게 만들었다.

  1. numbers 리스트에 들어있는 값에 num이라는 이름을 붙여서 for를 활용해 작성할 생각이다.
  2. if를 사용해 조건을 작성한다. 리스트 안의 값(num)과 value_to_find가 일치하면(==), 
  3. count에 1을 더해라. (이때 위에다가 변수 count를 추가로 선언했다.)
  4. 그래서 출력 예시에 따라 print('리스트에서 'value_to_find'는 'count'회 등장합니다!') 라고 작성했다.

그리고서 실행을 했는데,

에러코드 등장! syntax error면 뭔가 문법이 틀린 것 같다.

 

그래서 힌트 1단계를 확인했는데 바로 내가 뭘 틀렸는지 알게 됐다.

numbers = [1, 2, 3, 4, 2, 2, 5, 2]
value_to_find = 2
count = 0

for num in numbers:
    if num == value_to_find:
        count += 1
        print('리스트에서 {value_to_find}는 {count}회 등장합니다!')

그러면 이제 2가 리스트에 4회 등장한다고 원하는 형식으로 답을 출력한다.

 

 

오늘 파이썬 공부 끝!


 

SQL 공부: ① [엑셀보다 쉽고 빠른 SQL] 3주차 강의

문자 포맷 가공하기

  • REPLACE(컬럼명, 원래 데이터에서 바꾸고 싶은 부분, 새로 변경될 내용) - 특정 문자 데이터 교체하기
  • SUBSTR(컬럼명, 몇 번째부터 뽑아올 것인지, 뽑아올 문자 수) - 특정 문자 데이터만 추출하기
    • 3번째를 생략하면 n번째부터 끝까지 뽑아온다
  • CONCAT() - 원하는 형태로 문자 데이터들을 붙여서 한 번에 
  • GROUP BY를 이용할 때 컬럼명이 아닌 SELECT에 입력했던 순서에 따라 1, 2 등으로도 입력 가능하다

조건문: IF 와 CASE

  • IF(조건, 조건을 충족할 때, 조건을 충족하지 못할 때) - 조건이 하나일 때
    • IF문 안에 다른 함수들도 함께 쓸 수 있다
    • 여러 함수들을 겹쳐서 사용할 때는 DBeaver에선 괄호에 커서를 가져가면 해당 괄호의 시작과 끝을 색칠해 보여주기 때문에 헷갈린다면 틈틈이 확인하자
  • CASE WHEN 조건a THEN aaa
               WHEN 조건b THEN bbb
               ELSE ccc END                                       - 조건이 둘 이상일
    • ELSE 부분은 필요에 따라서 생략 가능하다. 이렇더라도 항상 END로 조건문을 맺어야 함!
  • 조건문을 사용해서 새로운 카테고리를 만들거나 특정 조건에 따라 달리 연산식을 적용하는 등 다양하게 사용 가능하다

3주차 숙제 풀이

다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요. 
(주중 : 25분 이상, 주말: 30분 이상)

SELECT case when day_of_the_week ='weekday' and delivery_time >=25 then '배달이 늦어져요'
            when day_of_the_week ='weekend' and delivery_time >=30 then '배달이 늦어져요' end "지각 안내",
            day_of_the_week ,
            delivery_time 
FROM food_orders fo

처음에는 이렇게 작성했다. 이렇게 작성한 쿼리를 실행하면

내용이 많이 부족한 결과값이 나온다. 주문번호와 음식점 이름을 추가해야 하고, 또한 지각이 아닌 경우에 입력될 값도 지정해줘야 한다. 그래서 다음과 같이 쿼리를 수정한다.

SELECT order_id ,
       restaurant_name ,
       day_of_the_week ,
       delivery_time ,
       case when day_of_the_week ='Weekday' and delivery_time >=25 THEN '배달이 늦어져요'
            WHEN day_of_the_week ='Weekend' and delivery_time >=30 THEN '배달이 늦어져요'
            ELSE '제때 도착해요' END "지각 안내" 
FROM food_orders fo

250123 SQL 강의 진도 나간 정도를 보니 오늘 약간 과부하가 올 만했던 것 같다


SQL 공부: ② 사전캠프 개인퀘스트 걷기반 (4)~(6)

4) 👩‍🎓이제 놀 만큼 놀았으니 다시 공부해봅시다!

아래와 같은 sparta_students(학생) 테이블이 있습니다.

id name  track  grade  enrollment_year
1 르탄이 Node.js A 2023
2 배캠이 Spring B 2022
3 구구이 Unity C 2021
4 이션이 Node.js B 2022

13. 모든 학생의 이름과 트랙을 선택하기

select name, track
from sparta_students

14. Unity 트랙 소속이 아닌 학생들을 모두 선택하기

select *
from sparta_students
where track <> 'Unity'
  • 조건문 WHERE : WHERE 필터링 조건
  • 비교연산자
    • = : 같다
    • <> : 같지 않다(다르다)

15. 입학년도가 2021년, 2023년인 학생들을 선택하기

select *
from sparta_student
where enrollment_year = 2021,
      enrollment_year = 2023

처음에는 이렇게 쿼리를 작성했다. 그리고 정답을 확인하니 IN을 사용하여 한 번에 적은 것이다! 아, 까먹고 있었다...

select *
from sparta_students
where enrollment_year in (2021, 2023)
  • 다양한 조건의 종류
    • IN (1, 2, 3)
    • BETWEEN a AND b
    • LIKE 'a%'

16. Node.js 트랙 소속이면서 학점이 A인 학생의 입학년도를 선택하기

select enrollment_year
from sparta_students
where track = 'Node.js',
      grade = 'A'

 


5) 🎫 공부하다보니 팀 프로젝트 시간이 왔어요!

아래와 같은 team_projects(프로젝트) 테이블이 있습니다.

id
name
start_date
end_date
aws_cost
1
일조
2023-01-01
2023-01-07
30000
2
꿈꾸는이조
2023-03-15
2023-03-22
50000
3
보람삼조
2023-11-20
2023-11-30
80000
4
사조참치
2022-07-01
2022-07-30
75000

17. AWS 예산이 40,000 이상 들어간 프로젝트 명을 선택하기

select name
from team_projects
where aws_cost>=40000

18. 2022년에 시작한 프로젝트를 선택하기 (단, 조건으로 start_date < '2023-01-01'을 사용하지 말 것)

음.. 문제의 조건을 살피니 날짜에서 연도만 추출하는 법이 있는 것 같다.

 

[참고] https://marketinga.tistory.com/entry/SQL-%EB%82%A0%EC%A7%9C%EC%99%80-%EA%B4%80%EB%A0%A8%EB%90%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%B6%94%EC%B6%9CYEARMONTHDAYOFMONTH

select *
from team_projects
where year(start_date) = 2022

날짜와 관련된 함수는 다음과 같다

  • YEAR(컬럼명) : 연도 추출
  • MONTH(컬럼명) : 월 추출
  • DAYOFMONTH(컬럼명) : 일 추출
  • CURDATE() : 현재 날짜 출력
    • CURTIME() : 현재 시간 출력
    • NOW() : 현재 날짜와 현재 시간을 출력
  • DATEDIFF(a, b) : 날짜 a에서 날짜 b 사이의 차이

19. 현재 진행 중인 프로젝트를 선택하기 (단, 지금 시점의 날짜를 하드코딩하지 말 것)

하드코딩이라.. 대충 어림짐작으로 직접 날짜를 입력해놓지 말라는 건 알겠지만 정확한 의미를 찾아보았다.

  • 하드코딩 : 코드 내에 직접 값을 고정적으로 지정하는 것
  • 소프트코딩: 값을 변수 혹은 데이터베이스 같은 외부 리소스에 저장하고 코드에서는 해당 값을 참조하도록 작성하는 것
select *
from team_projects
where curdate() between start_date and end_date

20. 각 프로젝트의 지속 기간을 일수로 계산해 나타내기

select datediff(end_date, start_date) "진행한 일수"
from team_projects

처음엔 이렇게 작성했는데 정답을 확인해보니 프로젝트명도 함께 출력했길래 다음과 같이 수정했다. 하긴 숫자만 덜렁있으면 무슨 프로젝트인지 알 수 없으니까.

select name, datediff(end_date, start_date) "진행한 일수"
from team_projects

6) 🎮 팀 프로젝트 열심히 했으니 다시 놀아볼까요?

아래와 같은 lol_users(LOL 유저 테이블)이 있습니다.

id
name
region
rating
join_date
1
르탄이
한국
1300
2019-06-15
2
배캠이
미국
1500
2020-09-01
3
구구이
한국
1400
2021-01-07
4
이션이
미국
1350
2019-11-15

21. 테이블 내 유저들의 순위를 산출하기 (rating이 높을수록 순위가 높음)

select *
from lol_users
order by rating desc

위와 같이 작성해놓고 정답을 확인하니 모르는 함수가 보인다. RANK() OVER()...? 순위 함수에 대해서 알아보자.....

[참고] https://seoyuun22.tistory.com/44

  • 순위 출력하기: RANK() OVER(ORDER BY 사용하여 어떤 열 기준으로 오름차순/내림차순할지)
    • RANK() : 중복 순위를 고려하여 순위 매김
    • DENSE_RANK() : 중복 순위가 존재해도 순차적으로 순위 매김
select name, rating, rank() over(order by rating desc) "순위"
from lol_users

22. 가장 늦게 게임을 시작한 유저 이름을 불러오기

모르겠어서 바로 구글링해서 찾아봤다. 아래의 블로그를 참고해 최근 날짜를 조회하는 쿼리를 작성했다.
[참고] https://com-l.tistory.com/122

select name
from lol_users
order by join_date desc 
limit 1
  • LIMIT는 불러올 행의 수를 제한한다

23. 지역별로 순위가 높은 순으로 유저들을 정렬하기

select *
from lol_users
group by region
order by rating desc

처음에 작성한 쿼리다. GROUP BY가 들어간 이유는 '지역별로' 정렬해달라고 해서 넣었다.

그런데 정답을 확인하니 ORDER BY에 조건이 2개..? 찾아보니 ORDER BY에 조건을 두 개 넣을 수도(다중정렬) 있다고 한다.

select *
from lol_users
order by region, rating desc

24. 지역별로 평균 레이팅 계산하기

select region, avg(rating) "평균 레이팅"
from lol_users
group by region

오늘도 개인 퀘스트 완... 불 태웠드아

 


 

내일은 오늘 매니저님이 말씀해주신 대로 스타터 노트를 작성해야 하고, 세 번째 아티클 스터디 진행하고, [파이썬 문법 기초]를 마저 다 들으면 좋을 것 같다. 그리고 오늘 들은 [엑셀보다 쉽고 빠른 SQL]-3주차는 실습 예제들 혼자서 다시 복습해봐야겠다...

 

어제 파이썬을 처음 배울 때 '파이썬은 재미없다. SQL이 더 재밌는 듯' 이랬는데 오늘 SQL 3주차를 들으면서 SQL과도 반발짝 더 멀어졌다. 내가 한 발짝, 두 발짝 다가가면 세 발짝 멀어지는 너란 SQL... 재밌어 하하하

 

그리고 무엇보다 내일 금요일이다....!! 너무 좋아 랄랄라