데이터베이스/MySQL

프로그래머스 SQL 고득점 kit 준비 방법 -1(feat. SQL 강의: 초보자라면 꼭 알아야 할 10가지 문법 강의 노트)

Woonys 2022. 3. 28. 01:19
반응형

하..집 내려오니까 안그래도 안되던 공부가 훨씬 더 안된다..는 핑계를 벗삼아 되던 공부도 안되게 만드는 중(?)이다. 쉴 거면 아예 쉬고 할 거면 아예 해야 되는데 현재 신분이 신분인지라 이러지도 저러지도 못한 채 애매하게 공부하고 있다. 정신도 좀 차릴 겸 다시 개발일지를 써본다.

 

어제도 코테를 하나 봤고, 이번 주에는 3개나 봐야하는지라 부랴부랴 문제를 풀어보고 있다. 하지만 정작 문제는 이번 주에 봐야할 코테 중 하나에서 SQL 1문제가 출제된다는 것..! 이 문제를 그냥 버리기엔 가고 싶은 회사인데다 심지어 코테가 워낙 빡센 회사이니... SQL이라도 공부해서 뭐든 간에 한 문제라도 맞히자는 심정으로 주말 내내 SQL 삼매경에 빠졌다. 프로그래머스 SQL 고득점 kit를 어제 오늘 조금씩 풀고 있다. 그런데 처음에 이 SQL 고득점 kit를 공부하기 위해 관련 강의 혹은 콘텐츠가 있나 찾아보니 무엇을 들어야 할 지 1도 모르겠는게 아닌가. 구글링을 해도 뭔가 이것만 하면 된다!고 딱 깔끔하게 떨어지는 강의나 콘텐츠를 찾기 힘들었다. MySQL부터 공부를 해야 하는 건지, 그러면 맥에다가 MySQL부터 설치하고 봐야되는 건가? 하면서 설치를 하다가 샘플 데이터를 어떻게 넣어야 할 지 몰라 해메지를 않나..

 

그렇게 대략 몇 시간 동안 삽질을 하다가 이건 아니다 싶어 유튜브를 찾아봤다. 프로그래머스 고득점 kit 강의는 결국 찾을 수 없었지만, 그 대신 sql을 어떻게 공부하면 좋을지 깔끔하게 알려주는 유튜브 영상을 하나 발견할 수 있었다!

 

그래서 프로그래머스 sql 고득점 kit를 어떻게 준비하면 좋으냐!

 

1. MySQL 설치해서 로컬로 연습하기보다 프로그래머스에서 문제부터 풀도록 하자.

2. 아래 영상 보면 대략 어떤 식으로 코드를 입력하는지 감이 온다. 강의 다 듣고 나서 프로그래머스 문제 들어가보면 어떻게 해야 좋을지 감이 올 것. 아, 근데 강의만으로 커버되지 않는 것들이 있어 아래 강의노트를 참고하면 좋을 것 같다. 특히 distinct문과 having은 강의에 나오지 않으나 코테 문제를 풀기 위해서는 알아야 함!

3. 그래도 감이 안 오면 github에 작성 중인 프로그래머스 고득점 kit 풀이를 참고하도록 하자. 지금 글쓰는 시점으로 내일까지는 어떻게든 다 풀어볼 예정..

 

 

 

영상 시작부터 아주 깔끔하다. 10가지 문법부터 익히고 보자!라고 알려주는데 아주아주 좋다.

 

 

하지만 또 38분 강의를 380분 동안 듣는 나같은 사람이 있을 것을 염려해..강의를 들으며 정리한 강의노트를 여기에 공유한다.

 

1. SELECT문 & 테이블

select: 내가 보고 싶은 데이터를 보려 할 때 사용하는 문법. 가장 기본 중에 기본이다. from 과 함께 쓰는데, from으로부터 어떤 테이블을 불러올 것인지 선택한 다음 그 테이블 내에 어떤 컬럼을 볼 것인지를 고르는 게 select이다.

 

데이터는 테이블에 저장된다. 테이블은 일종의 엑셀 파일과 동일하다. 행과 열로 구성되어 있으며 하나의 테이블은 특정 주제 단위로 저장된다. 예컨대 아파트 거래 데이터라던지 혹은 다세대 주택 데이터라던지(영상 찍으신 분이 부동산 투자자셔서 그런지 예시가 전부 부동산이더라)

 

select * 와 같이 사용하는 예시가 자주 있는데, 여기서 *는 aster라고 하여 모든 데이터를 전부 지칭한다는 뜻이다. 

 

2. ORDER BY

order by는 select 문을 사용해 가져온 데이터를 특정 기준으로 정렬하는 문법이다. 여기서 정렬은 오름/내림차순에서의 그 정렬이 맞다. MySQL에서 정렬 디폴트는 오름차순이다. 아래 예시를 보자. (참고로 MySQL에서는 적는 순서가 중요하다고 한다. order by는 항상 마지막에 적어준다고 하니 이 점을 기억하자. 바로 밑에 예시를 보니 Limit보다는 위에 위치하는 듯. 참고로 limit는 몇 개의 데이터를 보여줄 것인지를 결정한다. pandas의 head()와 같다.)

 

내림차순으로 정렬하려면 desc를 마지막에 추가해준다.

혹은 여러 컬럼을 기준으로 정렬하고 싶다? 그럼 여러 개를 붙여준다. 아래 예시의 경우 연도 순으로 먼저 정렬하고 그다음 월/일 순으로 각각 오름차순 정렬한다는 뜻이다.

 

이 중 만약 월에 한해서만 내림차순으로 하고 싶다면? 해당 데이터에 대해서만 desc를 붙여주면 된다. (참고로 프로그래머스 kit 기준 대소문자를 따로 구별하지 않는 것을 확인해 아래도 따로 구분해주지 않았다.)

select *
from apt_list
order by year, month desc, day
limit 100

 

3. COUNT / GROUP BY / distinct

count는 건수가 몇 개인지 알아볼 때 사용하는 문법으로 group by 와 함께 자주 쓰인다. select 다음에 count를 입력하면 해당 조건에 대한 행 개수를 센다. 이렇게만 보면 간단한데 막상 고득점 kit를 풀 때 좀 헷갈리는 문제가 있다. 그럴 때는 github에 올려둔 풀이를 참고하도록 하자. 아래 예시를 보면 테이블 내 모든 행의 개수를 count한 값을 나타낸다.

 

group by는 특정 항목에 대한 데이터를 알 수 있도록 항목별로 묶어주는 문법이다. 이는 중복 제거에도 쓰인다. 예를 들어 동별로 아파트 매매 건수를 보고싶다고 해보자. 그러면 아래 예시와 같이 쿼리를 날릴 수 있다.

select dong, count(*)
from apt_list
group by dong

그러면 아래와 같이 동별 매매 건수 데이터를 얻는다.

여기서 중복 제거를 group by로 할 수 있다고 하는데, 잘 감이 오지 않아 찾아보니 distinct 문을 쓰는 게 나은 것 같아 소개한다. 프로그래머스 kit 중 중복 제거하기 문제를 보면 이름을 중복 없이 count한 데이터를 반환하라고 한다. 이에 대해 아래와 같이 count하고 싶은 column 앞에 distinct를 붙이면 중복을 제거한 값을 반환한다.

 

SELECT count (distinct name)
from ANIMAL_INS

 

4. WHERE / AND / OR & having 

where문은 테이블 내 일부 데이터만 보고 싶을 때 사용한다. 일종의 조건문이다. 예를 들어 학생 리스트 중 성별이 남자인 사람만 보고싶다거나 할 때 그렇다. 아래 예시는 동 이름이 '삼성동'인 데이터만 보고 싶을 때의 쿼리다.

 

 

여기서 조건을 추가하고 싶을 때 and/or을 사용한다. 둘 중 적어도 하나의 조건을 만족하게 하려면 or, 둘다 만족해야 한다면 and를 쓰면 된다.

 

그러면 이런 생각을 해볼 수 있을 것이다. "아, 그럼 나는 where문으로 생성한 조건에 대한 count를 확인하고 싶어!"(이게 무슨 말인지 모를 수 있는데 동명 동물 수 찾기를 풀어보면 대번에 이해한다.) 허나 아쉽게도 where문에서는 기존에 있는 컬럼에 대해서만 조건을 줄 수 있지, 우리가 새롭게 입력한 조건에 대한 데이터를 제공하지 못한다. 이를 위해 존재하는 것이 바로 having이다.

 

만약 지금까지 배운 정보만 가지고 동명 동물 수 찾기 문제를 풀어본다고 하자. 분명히 아래와 같이 입력할 것이다. 하지만 기존 테이블에는 count(name)이라는 컬럼이 존재하지 않기 때문에 오류가 발생한다.

SELECT NAME, count(name)
from ANIMAL_INS
where count(name) >=2
group by NAME
order by name

따라서 아래와 같이 having 문을 사용해 기존에 없는 컬럼에 대한 조건을 추가한다.

SELECT NAME, count(name)
from ANIMAL_INS
group by NAME
having count(name) >=2
order by name

 

5. Case when / else

데이터 값을 조건에 따라 다르게 묶어주는 문법이다. 일종의 group by와도 비슷한데 새로운 case를 추가하는 컬럼이 새로 생성된다고 보면 되겠다. 바로 아래 이미지를 보자.

 

아래 이미지 예시는 부동산을 price에 따라 분류해 얻은 데이터이다. 일종의 if 문과 같은데 새로운 컬럼이 생성되는 것이 특징. else를 이용할 수도 있다.

 

6. SUM / Min / Max / AVG

실제로는 열 번째에 소개해야 할 문법인데 아무래도 글이 길어져서 중간에 끊어야 할 것 같아 6번으로 마무리했다. 근데 왜 굳이 얘를 위로 올렸냐? 얘까지는 알아야 고득점 kit에서 위의 세 항목(select, group by, SUM/MIN/MAX/AVG)를 풀 수 있기 때문. 나머지 세 항목은 아직 나도 푸는 중이라..다음 글에서 마저 풀고서 정리하는 걸로!

 

sum/min/max/avg는 말 그대로다. 합계/최소/최대/평균이다. 긴말 할 것 없이 예시 이미지를 보자.

 

이 문법들도 group by와 함께 자주 쓰이니 유념할 것! 아래 예시는 연도별 데이터 합계/최소/최대/평균 데이터다.

 

 

나머지 네 항목(like/서브쿼리/join&outer join)은 다음 글에..

반응형