자기계발 Diary

오늘의 공부day_9(SQL 질문 잘하는방법,SQL 개인공부)

siron94 2024. 11. 18. 18:36

SQL 질문 잘하는 방법

 

문제를 해결하는 두 가지 방법

  1. 인터넷으로 검색한다.
  2. 같이 공부하고 있는 사람 또는 멘토에게 물어본다.

각각 어떤 전략으로 접근해야 내가 원하는 답변을 빠르게 얻어내고 문제를 해결할 수 있을지 생각해 봅시다.

 

 

질문 전 체크리스트

SQL 초보자들이 자주 하는 실수들을 정리해 봤습니다. 아래 사항을 꼭 점검해 봅시다.

  1. 코드에 오탈자가 있는지 확인했나요?
  2. 쿼리 실행 후 에러메시지를 읽어보고 그에 맞게 조치를 취했나요?
  3. 문제에서 요구하는 조건을 빠짐없이 작성했나요? (WHERE절의 필터링 조건, ORDER BY절의 정렬 조건, SELECT절의 컬럼명이 정확하게 정의 됐는지 확인해 주세요!)
  4. 질문에 포함된 쿼리를 실행해 봤나요? (질문 사항 이외에 다른 에러가 발생하는지 꼭 확인하세요!)
  5. 여러 DBMS를 선택할 수 있는 플랫폼을 사용 중이라면 문법에 맞는 DBMS가 선택되어 있는지 확인해 주세요. (예를 들어, 데이터 리안의 SQL캠프 수강생이라면 solvesql에서 SQLite 대신 MySQL이 선택되어 있는지 확인해 주세요!)

 

 

구글에서 검색하기

기술 검색은 반드시 구글에 합니다. 그 이유는 네이버는 네이버 블로그나 카페 위주로 검색 결과를 보여주기 때문에 전문가의 지식보다는 초심자가 공부를 위해 남겨놓은 정보나 카페에서의 잡담이 검색 결과로 나올 확률이 높습니다.

반면 구글에 검색을 하면 관련 공식문서나 잘 구축된 기술 커뮤니티인 stackoverflow가 검색 결과로 자주 등장하기 때문입니다. 그래서 구글로 검색하는 습관을 들여야 합니다.

 

 

영문으로 검색하기

기술 문서는 한글로 쓰이거나, 영어에서 한글로 번역된 것도 물론 있지만, 영어 문서의 양이 압도적으로 많습니다. MySQL, PostgreSQL 같은 대표적인 DBMS의 웹사이트도 일부 문서의 경우 번역본이 있지만 기본 언어는 영어입니다.

구글에서 영문으로 검색을 해도 언어 설정이 한국어로 되어있으면 한글 문서들이 검색결과 상위로 올라오니 언어설정을 영어로 바꿔 놓은 것이 좋습니다. 그리고 제가 생각하기에는 "영어를 잘할 필요는 없다"입니다. 왜냐하면 어떻게 검색을 해도 구글이 찰떡같이 결과를 보여주기 때문입니다.

 

 

검색 키워드를 잘 넣기

내가 원하는 검색 결과를 얻으려면 검색 쿼리의 범위를 좁혀줘야 합니다.예를 들면, PostgreSQL의 CUBE라는 함수가 궁금해서 구글에 “cube”라고 검색하면 어떤 결과가 나올까요? 큐브 엔터테인먼트가 나옵니다! 원하는 결과를 얻으려면 ‘postgresql cube’라고 좀 더 범위를 좁혀서 검색해야 합니다.

반대로 너무 좁히는 것도 좋지 않습니다. 윈도 함수의 사용 예시를 좀 보고 싶다면 ‘postgresql window function’, ‘mysql window function’이라고 특정 DBMS를 검색어에 넣는 것보다 ‘sql window function’이라고 검색해야 더 다양한 검색 결과를 볼 수 있습니다.

 

 

신뢰할 수 있는 사이트를 클릭하기

stackoverflow는 애용하는 좋은 기술 커뮤니티입니다.공식 문서는 가장 정확한 정보를 제공합니다.  MySQL의 경우 http://dev.mysql.com/, PostgreSQL의 경우 https://www.postgresql.org/ 입니다. 영어로 쓰여져 있지만 공식 문서는 해석의 오해가 없도록 쉽고 명확하게 쓰여져 있는 경우가 대부분입니다. 나만의 신뢰할 수 있는 사이트 목록을 만드는것 도 좋습니다.
 
 

언제 쓰였는지 확인하기

언제 쓰여진 글인지 파악하는 것도 중요합니다. SQL은 다른 프로그래밍 언어나 프레임워크에 비해 발전이 매우 빠르지는 않고 표준이 정해져있어 최신 문서만 봐야 할 필요까지는 없지만, DBMS의 특정 버전 이후에서만 사용할 수 있는 함수가 있다던지 하는 시기가 중요한 정보도 분명히 있습니다.
예를 들면, MySQL은 2018년에 릴리즈한 8.0 버전부터 윈도우 함수를 지원하기 시작했기 때문에 ‘mysql cumulative sum(MySQL로 누적합 구하기)’를 검색해 2018년 이전 자료들만 살펴본다면 윈도우 함수가 아닌 서브쿼리를 이용한 풀이만 보게 될 확률이 높습니다.
그래서 SQL에 대해서 검색을 할 때에도 정보의 최신성을 생각해야 하는 이유입니다.

 

 

질문답변방

검색을 했는데도 결국 문제 해결이 안 되는 경우도 있습니다. 그럴 때에는 슬랙의 질문답변방에 질문을 올려주세요. 같은 과정을 공부하며 시행착오를 미리 해 본 동료와 선배, 그리고 여러분들의 학습을 돕기 위해 기다리고 있는 멘토들이 있습니다.

 

 

슬랙 검색 이용

슬랙에 들어와서 가장 먼저 해야할 일은 검색입니다. 슬랙 앱 상단을 보면 ‘데이터리안 커뮤니티 검색’창이 있어요. 일단 여기에 나와 같은 질문을 한 사람은 없는지, 만약 있다면 문제를 어떻게 해결했는지를 먼저 살펴보세요.

 

 

질문 템플릿

만약 비슷한 질문을 한 사람이 없으면, 아래 항목들을 채워 질문을 올려주세요.

 

1. 질문과 관련된 강의 영상 제목과 시간대 또는 문제 링크

  • 강의 영상 제목과 시간대 O, 문제 링크 O
  • 노션 수업 자료 링크 X: 한 수업 자료에 많은 내용이 들어있기 때문에 어떤 내용에 대한 질문인지 파악하기 어려워요.
2. 작성한 코드
  • 코드 복사 붙여넣기 O
  • 스크린샷 X, 사진 X: 코드의 에러를 확인하기 위해서 답변자가 코드를 실행해봐야 하는데 스크린샷이나, 사진으로 올리면 긴 쿼리를 따라서 다시 작성해야 하는 번거로움이 있어요.

3. 문제 상황 서술

  • 기대했던 결과와 내 시도를 통해 얻은 결과의 차이를 중심으로 적어 답변자가 문제 상황을 정확하게 파악할 수 있어요.

 

4. 기타 추가 설명

  • 구글 검색어, 참고한 자료 링크 등

답변자의 편의를 위해서가 아니라, 질문자가 문제를 빠르게 해결하기 위해서 정확한 질문을 하는 것은 중요합니다. 좋은 질문과 답변을 주고받는 환경에서 가장 빠르게 성장할 수 있다고 생각합니다.

 

 

뻔하지만, 결국 스스로 해봐야 는다

처음 SQL 수업을 듣는 수강생분들은  '똑같이 막막하고 무수하게 실패하겠구나.’하고 생각합니다. 결국에 성장하는 사람은 이 막막함을 견디고 계속 시도를 해보는 사람인 것 같아요. 화면을 째려보면서 오류가 도대체 어디 있나 찾아도 보고, 답답함에 ‘아~ 도대체 이게 뭐야’ 혼잣말도 해보고, 하루 종일 찾은 오류가 오타라는 것을 알고 허망한 웃음도 지었다가, 구글에 검색도 해보고, 스터디 팀원들한테 물어도 보고, 질문답변방에 질문도 남겨보고 하는 그 과정에서 끊임없이 성장하는 거예요. 그리고 그 과정을 지나다 보면 어느 순간 ‘어? 내가 좀 능숙해졌네?’하는 마법 같은 순간도 발견하게 됩니다.

 

 


 

SQL 공부

 

조회한 데이터에 아무 값이 없다면 어떻게 해야 할까?

데이터를 사용 시 사용할 수 없는 데이터가 들어가 있거나, 값이 없는 경우가 있습니다. 그때 방법을 배워보겠습니다

 

  • 첫 번째, 없는 값을 제외해 주기
    • Mysql에서는 사용할 수 없는 값일 때 해당 값을 연산에서 제외해 줍니다. → 0으로 간주
    • MySQL에서 not given 같은 계산할 수 없는 값은 0으로 간주하여 연산합니다.
    • 데이터를 정리할 때 무조건 사용할 수 없는 값은 널(null)을 사용해 제외하는 것이 좋습니다.
    • 사용할 수 없는 값을 NULL을 통해 제거하여 정리하고 싶을 땐 IF문으로 이용한 널문 (nullcheck)을 해주면 됩니다.
    • 이런 방법으로 null을 처리를 한다면 데이터를 간결하게 정리할 수 있으며, 무결성 유지와 데이터 분석에도 유용하게 쓰일 수 있다.
    • 즉 평균 rating을 구하는 쿼리를 아래와 같이 작성했을 때 실제 연산에 사용되는 데이터는 다음과 같습니다
 
select restaurant_name,
          avg(rating) average_of_rating,
          avg(if(rating<>'Not given', rating, null)) average_of_rating2
from food_orders
group by 1

 

  • 두 번째, 다른 값을 대신 사용하기
    • 사용할 수 없는 값 대신 다른 값을 대체해서 사용하는 방법이 있습니다.
    • 데이터 분석 시에는 평균값 혹은 중앙값 등 대표값을 이용하여 대체해주기도 합니다.
    • 데이터 분석에서 null은 누락된 정보를 의미하기 때문에. 대체할 값은 신중하게 선택해야 합니다.
    • null 대체 값과 함께 데이터 품질에 관한 현실적인 문제도 함께 고려하여 대체 방법을 결정해야 합니다 
    • 컬럼 값이 null일 경우, 대체 값을 지정하여 테이블을 조회할 수 있습니다.
    • 다른 값으로 변경하고 싶을 때, 다음 두 개의 문법을 이용할 수 있습니다.
      • 다른 값이 있을 때 조건문 이용하기 : if(rating>=1, rating, 대체값)
      • null 값일 때 : coalesce(age, 대체값)
    • null을 다른 값으로 대체한 쿼리문을 실행하면 다음과 같습니다. customer 테이블에 없는 데이터 중에 age 만 20으로 채워진 것을 확인하실 수 있습니다.
    • null값을 가진 데이터만 출력하기 위해선 is null 명령어를 사용합니다.
    • WHERE절을 활용하여 빈 데이터를  제외하기 위해 WHERE절에 'b.customer_id is not null' 조건을 사용합니다.
select a.order_id,
          a.customer_id,
          a.restaurant_name,
          a.price,
          b.name,
          b.age,
          coalesce(b.age, 20) "null 제거",
          b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.age is null

 

 

조회한 데이터가 상식적이지 않은 값을 가지고 있다면 어떻게 해야 할까?

분석을 하다 보면 상식적이지 않은 데이터가 있습니다 이럴 때 어떻게 해야 할지 배워봅시다

 

  • 조건문으로 값의 범위를 지정하기
    • 데이터의 범위를 지정하고 연산(합계, 평균)을 하면 특이한 값들을 제외하고 일반적인 값으로 대체하여 사용할 수 있습니다.
    • 분석에 사용할 데이터에 대한 값의 범위를 지정하기 위해 조건문 활용합니다
    • 위의 나이의 경우 아래와 같은 범위를 지정해 줄 수 있습니다.
    • 15세 미만은 15세로, 80세 이상은 80세로 맞추고, 그 외의 경우에는 원래 나이 값을 유지하여 데이터를 정리합니다.
    • 예를 들어 32세와 같은 경우도 동일하게 32세로 값이 표시되며, 음식을 주문하는 데에는 어울리지 않는 6세와 같은 값도 15세로 통일되었습니다.
    • 또, 91세와 같은 경우에는 프로그램에서 가장 높은 값을 80으로 제한해서 re_age에 80으로 나오게 되었습니다.
select customer_id, name, email, gender, age,
           case when age<15 then 15
           when age>80 then 80
           else age end "re_age"
from customers

 

 


SQL 질문하는 방법이 결국 본인이 문제해결능력으로 이어지는 점이 신기했으며 구글사용 시 언어 설정을 영어로 바꾸고 검색할 때는 최신일자인지 확인해야 한다는 점이 흥미로웠다.

SQL 공부는 null에 대한 방법을 자세하게 알 수 있었으며 제외하거나 대체값을 주면 되고 데이터가 상식적이지 않을 때 범위를 지정하는 방법이 새롭게 배웠던 내용이다.