패캠 데이터 분석 14기/SQL 11

[패캠 SQL 복습] 서브쿼리 실습 문제와 코드 모음

서브쿼리를 사용하는 이유:복잡한 조건으로 인한 여러 쿼리를 하나의 쿼리로 만드는 방법   MISSION 1weight이 가장 큰 포켓몬의 number 가져오기 * weight이 가장 많이 나가는 몸무게와 '같아야' 함SELECT numberFROM abilityWHERE weight = (SELECT MAX(weight) FROM ability);  MISSION 2speed가 모든 electric 포켓몬의 attack보다 하나라도 작은 포켓몬의 number 가져오기 1. number 출력2. ability에서3. 속도가 ~보다 작다4. '모든 전기 포켓몬의 공격력' 보다SELECT numberFROM abilityWHERE speed   MISSION 3attack이 defense보다 큰 포켓몬이 존재..

[패캠 SQL 복습] 서브쿼리: 조건에 조건을 더하는 쿼리

서브쿼리란? 하나의 쿼리 안에 포함된 또 하나의 쿼리 서브쿼리를 감싸고 있는 바깥 쿼리는 '메인쿼리' 서브쿼리 뒤에는 세미콜론(;)을 붙이지 않는다─ 세미콜론은 전체 쿼리(메인쿼리)가 끝났을 때    GROUP BY를 제외한 모든 절에서 서브쿼리 가능(SELECT, FROM, WHERE, HAVING, ORDER BY)  서브쿼리 내부에서는 GROUP BY를 포함한 모든 키워드 가능(SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY)  SELECT절 서브쿼리 = 스칼라 서브쿼리 ─ 메인쿼리에서 출력할 컬럼 중 하나를 서브쿼리의 결과값으로 대체=> 결과값이 반드시 하나의 '값'이어야 함 (범위를 줄여주기 위해 WHERE 사용)  문제pikachu의 number, name..

[SQL 프로젝트] GPT 활용 + 코드 작업 과정 공개

이번 일주일 간의 프로젝트 때 개발에서 사용했던 vscode와 GPT를 활용하여 엄청나게 빠르게 결과물을 낼 수 있었다. (DBeaver로 하면 10~20분 걸릴 것을 vscode를 쓰니 1~3분 만에 해결)   아래는 프로젝트 기간 동안 팀의 최종 의사결정에 기여하기 위해 GPT에게 던진 질문과 코드 커스텀을 시각화한 과정이다.   원하는 결과를 내기 위해 여러 단계에 거쳐 GPT에게 요청했고 시각화 외에 구글 창을 여러 번 켜서 얻어야 하는 지식들에 대해 한번에 습득했다.   총 구매 횟수 관련  (데이터 제공 후) 5개월 간 브랜드 내 소비자의 총 구매 횟수야.이 소수점 price를 적절한 달러 가격으로 표시해줘. 그리고 y축 라벨에 달러 단위라고 표시해줘이거 색 범위를 top 5랑 다른 값들이랑 ..

[SQL 프로젝트] 2~3일차: 1차 발표, 심층 EDA + 건물 드로잉

2일차는 발표 준비 날이었다.  이번 주 일요일부터 고정적 일정이 생기는데무릎이 아직 다 낫지 않아서 2일차 오프라인 미팅에는 참석하지 못했다.  줌 화면 너머로나마 열심히 듣고 하고 있었는데오프라인 팀원들이 있는 강의실 건너편에 다른 조가 오자팀원들 목소리가 파묻혀버려 들리지 않았다.중요 내용만 전달 받고 + 간간이 의견 제시   3일차인 다음 날 1차 발표가 진행되었다.전체 조에서 발표하는 동안 프로젝트 개선을 위해 뭐라도 건지려고 강사님 피드백을 듣고 있었는데다 끝나자 심장이 망치로 맞은 것처럼 얼얼했다.  대등한 관계에서 의의를 제기할 수 없는 상태에서 이어지는부정적 피드백은 사람을 지치게 하는구나, 많이 느꼈다.대부분 반박 없이 조용히 듣거나 강사님 질문에 대답하는 정도였다.     내일은 질문..

[SQL 프로젝트] 1일차: 데이터 EDA

오늘은 SQL 프로젝트 첫 날이었다.  Slack에 올라온 대로 jupyter notebook과 MySQL을 셋팅하고, 2천 만개 정도 되는 행을 가진 월별 데이터 5개를 모두 불러왔다.    데이터가 너무 커서 파일 하나를 불러오는 데 20분 정도가 걸렸고, 마지막에는 계속 Loading...이 떠 있어서 제대로 안 불러와진 줄 알았는데 나중에 확인해보니  코드를 여러 번 실행한 탓에 중복 데이터가 쌓여 있었다.   중복을 지우느니 데이터를 다시 불러오는 게 나을 것 같아서 테이블 데이터를 모두 지웠다. SQLD에서 공부했던 TRUNCATE를 처음으로 써 볼 수 있었다. 쌓는 데 3-40분 걸렸는데 지우는 데는 0.3초 걸렸다.    DBeaver라는 SQL 작성 툴을 처음 써 보았다. 오전에 추천 받..

[패캠] SQL: 실무 문제 풀이 (유저 세그먼트별 + 매출 분석)

Q. 전체 유저의 Demographic을 알고 싶어요. 성/연령별로 유저 수를 알려주세요. 어느 세그먼트가 가장 숫자가 많나요? -- 참고로 기타 성별은 하나로, 연령은 5세 단위로 적당히 묶어주시고, 유저 수가 높은 순서대로 보여주세요. -- gender가 비어있는(null) 경우 Others에 하나로 묶어주기SELECT CASE WHEN gender IS NULL THEN 'Others' ELSE gender END AS gender, COUNT(*)FROM fastcampus.tbl_customerGROUP BY 1;-- IS NULL로 확인하는 위 방법은 잘 안 먹힘 (공공데이터 등 데이터가 더티할 때 종종 있는 일)-- 해결: LENGTH 함수 활용-- 'gender ..

[패캠] SQL: 실무 문제 풀이 (날짜 함수)

Q. 2020년 7월의 평균 DAU를 구해주세요. Active User가 증가하는 추세인가요?-- 2020-07-01 00:00:12+00:00를 2020-07-01 형태로 바꿔주려면?SELECT DATE_FORMAT(visited_at, '%Y-%m-%d')FROM fastcampus.tbl_visit; -- 2020년 7월의 DAU 구하기SELECT DATE_FORMAT(visited_at, '%Y-%m-%d'), COUNT(DISTINCT customer_id)FROM fastcampus.tbl_visitWHERE visited_at >= '2020-07-01'AND visited_at  -- 이상한 점: 2020-08-01까지 나오고, 첫째 날인 2020-07-01의 고객 수가 지나치게 적음-- ..

[패캠] SQL: 실무 문제 풀이

Q. 2020년 7월의 활성(Active) 유저의 구매율은?구매율 = 구매유저 수 / 활성유저 수(= 방문 이력이 있는 유저 수) 1. 쿼리로 구매유저 수와 활성유저 수를 구한다. * 활성유저 수 = 방문유저 수아래 두 코드는 테이블만 다름-- 구매유저 수SELECT COUNT(DISTINCT customer_id)FROM fastcampus.tbl_purchase WHERE purchased_at >= '2020-07-01'AND purchased_at = '2020-07-01'AND visited_at  2. 위 쿼리에서 구한 두 값(구매유저 수: 11174 / 활성유저 수: 16414)을 나눠주기SELECT 11174 / 16414; -- 0.6808 SQL에서 SELECT는 '출력' 키워드 (co..

[패캠] SQL: 조건문, JOIN, 집합연산자

IF문SELECT 절에 작성형태: IF(조건식, 참일 때 값, 거짓일 때 값)SELECT name, IF(attack >= 60, 'strong', 'weak') AS attack_classFROM pokemon.mypokemon;  IFNULL문SELECT 절에 작성NULL 값을 다른 값으로 대체할 때 사용형태: IFNULL(컬럼명, NULL일 때 값)SELECT name, IFNULL(name, 'unknown') AS full_nameFROM pokemon.mypokemon;  CASE문* 자바스크립트 등의 다른 언어(왼쪽)와 동일 개념을 대조해본 모습조건이 여러 개일 때 (1개일 때는 IF문)항상 END로 닫아줘야결과값을 새로운 컬럼으로 반환 (= 뒤에 AS 별칭 붙이기 가능)ELSE는 위의 WH..

[패캠] SQL: 조건에 맞는 데이터 가져오기

회사에서의 대부분의 데이터 요청 "10번 이상 구매한 VIP 고객 리스트를 뽑아주세요.""매출 5천만원 이상의 상품 리스트를 뽑아주세요." 와 같은 조건이 붙는다. WHERE 가져올 데이터의 조건을 지정하는 키워드WHERE 뒤의 조건이 참인 row(행)만 선택 SELECT 컬럼명FROM 테이블명WHERE 조건식  원하는 데이터의 조건이 True(참)이 되도록 조건식을 만든다. MySQL에서는 True(참) 값을 1로 표현하고,False(거짓) 값은 0으로 표현한다.  연산자 종류비교 연산자=, >,  예제요청: '피카츄'의 number를 찾아주세요. SELECT numberFROM mypokemonWHERE name = 'pikachu';  요청: 속도가 50보다 큰 포켓몬의 name을 찾아주세요. SE..