class="layout-aside-right paging-number">
본문 바로가기
데이터분석/스터디

[Bigquery] 초보자를 위한 BigQuery(SQL) 입문(2)

by 기록하는 치즈볼 2026. 6. 14.

강의 듣는게 몇 개 있어서 평일에는 바빠서 주말에 밖에 시간이 나지 않아서

주말이라도 들으면서 정리했다.

주말에 약속있으면 점점 미뤄지기 때문에 최대한 다음주 안으로 끝내야 겠다...

그래도 SQLD 합격 후에 듣는 강의라서 좀 맘 편하게 들으면서 공부했다.

SQLD는 이론이 많기 때문에 실무에서 자주 쓰이는 문법이나 상황은 이렇게 강의를 통해서 배워야 한다.


 

유튜브 : https://youtu.be/ohAsFH-YLoE?si=NaQE8qd1p27vQE-v

인프런 : https://inf.run/6ondu

 

[지금 무료]초보자를 위한 BigQuery(SQL) 입문| 카일스쿨 - 인프런 강의

현재 평점 5.0점 수강생 8,676명인 강의를 만나보세요. 초보자를 위한 BigQuery(SQL) 입문 강의입니다. 데이터를 가공하는 방법이 궁금하신 분에게 추천합니다. 백엔드 개발 관점보다는 데이터 분석,

www.inflearn.com

 


데이터 탐색 - 변환


데이터 타입과 데이터 변환(CAST, SAFE_CAST)

 

1. 변환을 위한 함수

- SELECT 문에서 데이터를 변환시킬 수 있음

(또는 WHERE의 조건 문에도 사용할 수도 있음

- 데이터의 타입에 따라 다양한 함수가 존재

 

2. 데이터 타입

 1. 숫자 - ex) 1, 2, 3, 4...

 2. 문자 - '나' , '메타몽'

 3. 시간, 날짜 - 2020-01-01 , 2024-01-01 23:59:10

 4. 부울 - True, False

 

3. 공부방법 추천

- 사용할 기본 타입 먼저 익히고 -> 그 이후에 확장하기 

 

※ 데이터 타입들은 아래 구글 문서 참고!

https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/data-types

 

Data types  |  BigQuery  |  Google Cloud Documentation

Send feedback Data types Stay organized with collections Save and categorize content based on your preferences. This page provides an overview of all GoogleSQL for BigQuery data types, including information about their value domains. For information on dat

docs.cloud.google.com

 

 

4. 데이터 타입이 중요한 이유

- 보이는 것과 저장된 것의 차이가 존재

- 엑셀에서는 빈값이 ""일 수도 있고 NULL일 수도 있음

- 1 이라는 값은 문자 타입일 수도 있고 숫자 타입일 수도 있음

- 2026-06-14 도 문자 타입일 수도 있고 날짜 타입일 수도 있음

- 내가 원하는 대로 사용하고 가공하기 위해서는 원하는 타입으로 변경해야함!

 

5. 자료 타입 변경하기

- 자료 타입을 변경하는 함수 : CAST

SELECT 
 CAST(1 AS STRING) # 숫자 1을 문자 1로 변경

 

다음과 같은 쿼리는 오류가 발생

SELECT
 CAST('치즈볼' AS INT64) # 오류발생

 

 

- 더 안전하게 데이터 타입 변경하기 : SAFE_CAST

- SAFE_가 붙은 함수는 변환이 실패할 경우 NULL 반환

SELECT
 SAFE_CAST('치즈볼' AS INT64) # NULL 반환

 

※ 수학함수

- 수학함수는 수학 연산(평균, 표준편차, 코사인 등) 이 존재

- 나누기를 할 경우 x/y 대신 SAFE_DIVIDE 함수 사용하기 (SAFE_DVIDE(x, y))

- x, y 중 하나라도 0인 경우 그냥 나누면 zero error 발생

##X : 1,  y : 0 인 경우

SELECT
	x/y ## 오류(zero error) 발생
    
SELECT
	SAFE_DIVIDE(x, y) ## NULL 반환

 


문자열 함수(CONCAT, SPLIT, REPLACE, TRIM, UPPER)

 

1.문자열(STRING) 함수

- 문자열 : '안녕하세요', '치즈볼'

 

- 문자열 데이터로 할 수 있는 대표적인 연산

함수 이름 연산 Input Output
CONCAT 문자열 붙이기 '안녕' + '하세요' '안녕하세요'
SPLIT 문자열 분리하기 '가, 나, 다, 라' '가', '나', '다', '라'
특정 단어 수정하기 특정 단어 수정하기 '안녕하세요' '실천하세요'
문자열 자르기 문자열 자르기 '안녕하세요' '안녕'
영어 대문자 변화 영어 대문자 변환 'ab' 'AB'

 

-- 1. CONCAT
-- CONCAT(합칠 문자열1, 합칠 문자열2)

SELECT
  CONCAT('안녕', '하세요') AS result
## 안녕하세요

-- 2. SPLIT
 -- SPLIT(문자열_원본, 나눌 기준이 되는 문자)
 
SELECT
 SPLIT('가, 나, 다, 라', ', ') AS result
 ## 가 / 나 / 다 / 라 (실제로는 배열로 나옴)
 
 -- 3. REPLACE
 -- REPLACE(문자열 원본, 찾을 단어, 바꿀 단어)
 
 SELECT
  REPLACE('안녕하세요', '안녕', '실천') AS result
 ## 실천하세요
 
-- 4. TRIM
-- TRIM(문자열_원본, 자를 단어)

SELECT
 TRIM('안녕하세요','하세요') AS result
## 안녕

-- 5. UPPER
-- UPPER(문자열_원본)

SELECT
 UPPER('abc') AS result
## ABC

 

 


날짜 및 시간 데이터 이해하기

 

1. 날짜 및 시간 데이터의 핵심 ★★★

  1) 날짜 및 시간 데이터 타입 파악하기 : DATE, DATETIME, TIMESTAMP

  2) 날짜 및 시간 데이터 관련 알면 좋은 내용 : UTC, Millisecond

  3) 날짜 및 시간 데이터 타입 변환하기

  4) 시간 함수(두 시간의 차이, 특정 부분 추출하기)

 

 

2. 시간 데이터 다루기

- 시간 데이터도 세부적으로 나눌 수 있음

- DATE, DATETIME, TIMESTAMP 등

 

- DATE : DATE만 표시하는 데이터 ex) 2026-06-14

- DATETIME :DATE와 TIME까지 표시하는 데이터, Time Zone 정보 없음 ex) 2026-06-14 14:00:00

- TIME : 날짜와 무관하게 시간만 표시하는 데이터, ex) 23:59:59.00

 

1) 타입존 ★★

 (1) GMT : Greenwich Mean Time(한국시간 : GMT+9)

    - 영국의 그리니치 천문대(경도 0도)를 기준으로 지역에 따른 시간의 차이를 조정하기 위해 생긴 시간의 구분선(1884년 채택)

    - 영국 근처에서 자주 활용

 (2) UTC : Universal Time Coordinates(한국 시간 : UTC+9)

    - 국제적인 표준 시간

    - 협정 세계시

    - 타임존이 존재한다 = 특정 지역의 표준 시간대

 (3) TIMESTAMP

    - 시간 도장

    - UTC부터 경과한 시간을 나타내는 값

    - Time Zone 정보 있음

    - 2026-06-14 14:00:00 UTC

 

 ※  GMT와 UTC의 차이는 거의 없는데 계산할 때 조금 차이가 나긴한다. 

 

2)  milliisecond, microsecond

(1) millisecond (㎳)

  - 시간의 단위, 천 분의 1초 (1,000ms = 1초)

  - 우리가 아는 초보다 더 짧은 시간 단위

  - 눈을 깜빡이는 시간이 약 100ms

  - 빠른 반응이 필요한 분야에서 사용(초보다 더 정확하게)

  - Millisecond => TIMESTAMP => DATETIME 으로 변경

ex)  1704176819711 ㎳ = 2024-01-02 15:26:59 (DATETIME)

 

(2) microsecond(㎲)

  - 1/1,000ms, 1/1,000,000초

 

(3) 예시

SELECT
  TIMESTAMP_MILLIS(1704176819711) AS milli_to_timestamp_value
  ,TIMESTAMP_MICROS(1704176819711000) AS mico_to_timestamp_value
  ,DATETIME(TIMESTAMP_MICROS(1704176819711000)) AS datetime_value
  ,DATETIME(TIMESTAMP_MICROS(1704176819711000),'Asia/Seoul') AS datetime_value_asia
milli_to_timestamp_value mico_to_timestamp_value datetime_value datetime_value_asia
1 2024-01-02 06:26:59.711000 UTC 2024-01-02 06:26:59.711000 UTC 2024-01-02T06:26:59.711000 2024-01-02T15:26:59.711000

※ 'Asia / Seoul' 이라는 타임존 정보를 넣지 않으면 데이터가 다 틀릴 수 있다

 

많은 회사들의 Table에 시간이 TIMESTAMP로 저장된 경우가 많음 (혹은 DATETIME)

(꼭 회사에 계신 백엔드 개발자에게 물어보기)

 

- TIMESTAMP <=> DATETIME 변환을 해야할 수 있음

 

3) TIMESTAMP와 DATETIME 비교

- 26년 6월 14일 20시 13분(한국 시간) 에 실행

SELECT
 CURRENT_TIMESTAMP() AS timestamp_col
 ,DATETIME(CURRENT_TIMESTAMP(),'Asia/Seoul') AS datetime_col

 

timestamp_col datetime_col
1 2026-06-14 11:13:40.236326 UTC 2026-06-14T20:13:40.236326

 

  TIMESTAMP DATETIME
타임존 UTC라고 나옴 T가 나옴(TIME을 의미)
시간 차이 한국시간 -9시간 한국 Zone 사용시 한국 시간과 동일

 

 

 

4) DATETIME 함수

(1) CURRENT_DATETIME

CURRENT_DATETIME([time_zone]) : 현재 DATETIME 출력

 

SELECT
 CURRENT_DATE() AS current_date
 ,CURRENT_DATE('Asia/Seoul') AS asia_date
 ,CURRENT_DATETIME() AS current_datetime
 ,CURRENT_DATETIME('Asia/Seoul') AS current_datetime_asia;
current_date asia_date current_datetime current_datetime_asia
1 2026-06-14 2026-06-14 2026-06-14T11:23:55.253560 2026-06-14T20:23:55.253560

 

한국 시간은로 9시-18시는 문제가 없지만 0시-8시59분의 경우 날짜가 달라지는 결과를 얻을 수 있기 때문에

타임존은 빠지지 않고 입력 해줘야 함

 

(2)  EXTRACT

DATETIME에서 특정 부분만 추출하고 싶은 경우

 

2026-06-14 14:00:00

에서 년 / 월 / 일 등 정보를 추출하고 싶은 경우

EXTRACT(part FROM datetime_expression)
SELECT
 EXTRACT(DATE FROM DATETIME "2024-01-02 14:00:00") AS date,
 EXTRACT(YEAR FROM DATETIME "2024-01-02 14:00:00") AS year,
 EXTRACT(MONTH FROM DATETIME "2024-01-02 14:00:00") AS month,
 EXTRACT(DAY FROM DATETIME "2024-01-02 14:00:00") AS day,
 EXTRACT(HOUR FROM DATETIME "2024-01-02 14:00:00") AS hour,
 EXTRACT(MINUTE FROM DATETIME "2024-01-02 14:00:00") AS minute,

 

 

 

요일을 추출하고 싶은 경우

EXTRACT(DAYIFWEEK FROM datetime_col)

- 한 주의 첫 날이 일요일인 [1,7] 범위의 값을 반환

 

SELECT
 EXTRACT(DAYOFWEEK FROM DATETIME '2026-01-11 14:00:00') AS day_of_week_sun
 ,EXTRACT(DAYOFWEEK FROM DATETIME '2026-01-12 14:00:00') AS day_of_week_mon
 ,EXTRACT(DAYOFWEEK FROM DATETIME '2026-01-13 14:00:00') AS day_of_week_tues
 ,EXTRACT(DAYOFWEEK FROM DATETIME '2026-01-17 14:00:00') AS day_of_week_satur;
day_of_week_sun day_of_week_mon day_of_week_tues day_of_week_satur
1 1 2 3 7

 

 

(3) DATETIME_TRUNC

DATE와 HOUR만 남기고 싶은 경우 => 시간 자르기

 

DATETIME_TRUNC(datetime_col, HOUR)

- '2026-06-14 20:40:13'을 HOUR로 자르면 '2026-06-14 20:00:00'

ex) 시간대별 수요를 알고 싶을 때 사용

 

 

(4) PARSE_DATETIME

문자열로 저장된 DATETIME을 DATETIME 타입으로 바꾸고 싶은 경우

 

PARSE_DATETIME('문자열의 형태', 'DATETIME 문자열') AS datetime
SELECT
 PARSE_DATETIME('%Y-%m-$d $H:$M:$S', '2026-06-14 20:43:23' AS parse_datetime;
 
 ## 답 : 2026-06-14T20:43:23

 

 

(5) FORMAT_DATETIME

DATETIME 타입 데이터를 특정 형태의 문자열 데이터로 변환고 싶은 경우

SELECT
 FORMAT_DATETIME("%c",DATETIME('2026-06-14 20:43:23') AS formatted;

 

 

문자열 => DATETIME : PARSE_DATETIME

DATETIME => 문자열 : FORMAT_DATETIME

 

(6) LAST_DAY

마지막 날을 알고 싶은 경우 : 자동으로 월의 마지막 값을 계산해서 특정 연산을 할 경우

 

LAST_DAY(DATETIME) : 월의 마지막 값을 반환

 

SELECT
 LAST_DAY(DATETIME '2026-06-14 20:45:00') AS last_day
 ,LAST_DAY(DATETIME '2026-06-14 20:45:00',MONTH) AS last_day_month
 ,LAST_DAY(DATETIME '2026-06-14 20:45:00',WEEK) AS last_day_week
 ,LAST_DAY(DATETIME '2026-06-14 20:45:00',WEEK(SUNDAY)) AS last_day_week_sun
 ,LAST_DAY(DATETIME '2026-06-14 20:45:00',WEEK(MONDAY)) AS last_day_week_mon

 

last_day last_day_month last_day_week last_day_week_sun last_day_week_mon
1 2026-06-30 2026-06-30 2026-06-20 2026-06-20 2026-06-14

 

 

(7) DATETIME_DIFF

두 DATETIME의 차이를 알고 싶은 경우

DATETIME_DIFF(첫 DATETIME, 두번째 DATETIME, 궁금한 차이)

 

SELECT
 DATETIME_DIFF (first_datetime, second_datetime, DAY) AS day_diff1
 ,DATETIME_DIFF(second_datetime, first_datetime, DAY) AS day_diff2
 ,DATETIME_DIFF(first_datetime, second_datetime, MONTH) AS month_diff
 ,DATETIME_DIFF(first_datetime, second_datetime, WEEK) AS week_diff
FROM (
 SELECT
 DATETIME "2024-04-02 10:20:00" AS first_datetime
 ,DATETIME "2021-01-01 15:30:00" AS second_datetime
)

 

day_diff1 day_diff2 month_diff week_diff
1 1187 -1187 39 170

 

 

 

정리

날짜 및 시간 데이터 타임

- DATE

- DATETIME : DATE + TIME. 타임존 정보 X

- TIMESTAMP : 특정 시점에 도장찍은 값. 타임존 정보 O

- UTC : 국제적인 표준 시간. 한국은 UTC+9

- Millisecond : 1/000초

- Microsecond : 1/1000ms

 

시간 데이터 타입 변환

- TIMESTAMP_MILLIS

- TIMESTAMP_MICROS

- DATETIME

    문자열 => DATETIME : PARSE_DATETIME

    DATETIME => 문자열 : FORMAT_DATETIME

 

현재 DATETIME : CURRENT_DATETIME

DATETIME의 특정 부분 추출 : EXTRACT

DATETIME 특정 부분 자르기 : DATETIME_TRUNC

DATETIME 차이 구하기 : DATETIME_DIFF

 

EXTRACTvsDATETIME_TRUNC
언제무엇을사용해야할까?
이후데이터분석에서어떻게활용할지에따라다름
2024-01-01T00:00:00=>00:00:00이필요한지생각해보기
DATETIME_TRUNC은시간자를때자주활용했음(1시간단위로수요집계)

 


시간 데이터 연습 문제

 

Q1.트레이너가 포켓몬을 포획한 날짜(catch_date)를 기준으로, 2023년 1월에 포획한 포켓몬의 수를 계산해주세요

 

trainer_pokemon의 catch_datetime 컬럼의 값들이 '2023-01-07 22:28:00 UTC'로 저장 되어 있음

=> catch_datetime 컬럼은 실제로는 TIMESTAMP 타입으로 되어 있구나를 알 수 있음

=> catch_date 가 KR 기준 ? UTC 기준? 인지 확인 필요

=> catch_date 컬럼과 catch_datetime 컬럼을 비교 => DATE(DATETIME(catch_datetime, 'Asia/Seoul'))

=> catch_date != DATE(DATETIME(catch_datetime, 'Asia/Seoul')) => 있다면 catch_date는 사용하기 어려울 수 있음

 

※ 회사에서도 이렇게 데이터가 잘 못 저장된 경우가 많으니 컬럼의 이름만 믿지 말고 꼭 데이터 확인 필수!

-- 데이터 검증을 위한 쿼리
SELECT
  id
  ,catch_date
  ,DATE(DATETIME(catch_datetime, 'Asia/Seoul')) AS  catch_datetime_kr_date
FROM `basic.trainer_pokemon`
## cath_date와 catch_datetime_kr_date 값이 다른 게 존재
## 컬럼의 설명을 꼭 확인하고 SQL 작성 필요!

-- 문제 풀기
SELECT 
  COUNT(DISTINCT id) AS cnt
FROM basic.trainer_pokemon
WHERE 
  EXTRACT(YEAR FROM DATETIME(catch_datetime,'Asia/Seoul')) = 2023 # catch_datetime은 TIMESTAMP로 저장되어 있으므로, DATETIME으로 변경해야 함
  AND EXTRACT(MONTH FROM DATETIME(catch_datetime,'Asia/Seoul')) = 1

 

 

 

Q2.  배틀이 일어난 시간(battle_datetime)을 기준으로, 오전 6시에서 오후 6시 사이에 일어난 배틀의 수를 계산해주세요.

 

-- 첫 번째 방법
SELECT
 COUNT(DISTINCT id)
FROM basic.battle
WHERE EXTRACT(HOUR FROM battle_datetime) >= 6
  AND EXTRACT(HOUR FROM battle_datetime) < 18

-- 두 번째 방법
SELECT
 COUNT(DISTINCT id)
FROM basic.battle
WHERE EXTRACT(HOUR FROM battle_datetime) BETWEEN 6 and 18

 

 

Q3. 각 트레이너별로 그들이 포켓몬을 포획한 첫 날(catch_date)을 찾고, 그 날짜를 'DD/MM/YYYY'형식으로 출력해주세요.
(2024-01-01=>01/01/2024)

SELECT 
  trainer_id
  ,FORMAT_DATETIME('%d/%m/%Y',MIN(DATETIME(catch_datetime,'Asia/Seoul'))) AS first_catch_date
FROM basic.trainer_pokemon
GROUP BY trainer_id
ORDER BY trainer_id

 

Q4. 배틀이 일어난 날짜(battle_date)를 기준으로, 요일별로 배틀이 얼마나 자주 일어났는지 계산해주세요.

 

SELECT 
  week_battle
  ,COUNT(week_battle) AS cnt_battle
FROM(
SELECT 
  id
  ,EXTRACT(DAYOFWEEK FROM battle_date) AS week_battle
FROM basic.battle
)
GROUP BY week_battle
ORDER BY week_battle

 

 

Q5. 트레이너가 포켓몬을 처음으로 포획한 날짜와 마지막으로 포획한 날짜의 간격이 큰 순으로 정렬하는 쿼리를 작성해주세요

SELECT 
  trainer_id
  ,DATE(first_catch_date) AS first_date
  ,DATE(last_catch_date) AS last_date
  ,DATE_DIFF(last_catch_date,first_catch_date,DAY) AS day_diff
FROM(
  SELECT
    trainer_id
    ,MIN(DATETIME(catch_datetime,'Asia/Seoul')) AS first_catch_date
    ,MAX(DATETIME(catch_datetime,'Asia/Seoul')) AS last_catch_date
  FROM basic.trainer_pokemon
  GROUP BY trainer_id
)
ORDER BY trainer_id

 

조건문(CASE WHEN, IF)

 

조건문

- 만약 특정 조건이 충족되면, 어떤 행동을 하자

- 특정 조건이 참일때 A, 아니면B

- 조건에 따른 분기 처리가 필요한 경우

- 조건에 따라 다른 값을 표시하고 싶을때 사용


조건문을 사용하는 방법

 1) CASEWHEN

 2) IF조건문 

 

조건문 함수가 사용되는 이유

- 데이터 분석을 하다 보면, 특정 카테고리를 하나로 합치는 전처리가 필요할 수 있음

- 이런 일이 발생하는 이유

 => 데이터를 저장하는 쪽과 데이터를 분석하는 쪽이 나뉘고 

 => 분석할때 필요한 부분에서 조건 설정해서 변경하는 것이 더 유용

 => 저장할 때부터 특정 카테고리를 합쳐서 저장하면, 쪼개서 보고 싶을 때 볼 수 없음

 

1. CASE WHEN

여러 조건이 있을 경우 유용

SELECT
 CASE
  WHEN 조건1 THEN 조건1이 참일 경우 결과
  WHEN 조건2 THEN 조건2가 참일 경우 결과
  ELSE 그 외 조건일 경우 결과
 END AS 새로운_컬럼_이름

 

 

ex) ROCK(바위) 타입과 GROUND(타입)이 비슷하니 'Rock&Ground' 라는 타입을 새로 만들면?

SELECT
 new_type1
 ,COUNT(DISTINCT id) AS cnt
FROM(
	SELECT
	*,
	CASE
	 WHEN(type1 IN("Rock","Ground")) OR (type2 IN("Rock","Ground"))
		THEN "Rock&Ground"
		ELSE type1
		END AS new_type1
	FROM basic.pokemon
)
GROUP BY new_type1

 

순서도 중요함

각 포켓몬의 공격력(attack)을 기준으로, 50이상이면 'Strong', 100이상이면 'Very Strong', 그 이하면 'Weak'으로 분류해주세요

SELECT
 eng_name
 ,attack
 ,CASE
   WHEN attack >=100 THEN 'VeryStrong'
   WHEN attack >=50 THEN 'Strong'
   ELSE 'Weak'
  END AS attack_level
FROM basic.pokemon

SELECT
 eng_name
 ,attack
 ,CASE
   WHEN attack >=50 THEN 'Strong'
   WHEN attack >=100 THEN 'VeryStrong'
   ELSE 'Weak'
  END AS attack_level
FROM basic.pokemon

-- 위 아래 결과값이 다름!

 

2. IF

단일 조건일 경우 유용

IF(조건문, True일 때 값, False일 때의 값) AS 새로운 컬럼_이름

 

정리

- CASE WHEN : 여러 조건이 있을 경우 사용. 조건의 순서에 주의
- IF : 단일 조건일 경우 사용

 


조건문 함수 연습 문제

 

Q1.   포켓몬의 'speed'가 70 이상이면 '빠름', 그렇지 않으면 '느림'으로 표시하는 새로운 컬럼 'Speed_Category' 를 만들어주세요

SELECT
  id
  ,kor_name
  ,speed
  ,IF(speed >=70,'빠름','느림') AS Speed_Category
FROM basic.pokemon

 

 

Q2. 포켓몬의 'type1' 에 따라 'Water', 'Fire', 'Electric' 타입은 각각 '물', '불', '전기'로, 그 외 타입은 '기타' 로 분류하는 새로운 컬럼 'type_Korean'을 만들어주세요

SELECT
  id
  ,kor_name
  ,type1
  ,CASE WHEN type1 = 'Water' THEN '물'
    WHEN type1 = 'Fire' THEN '불'
    WHEN type1 = 'Electric' THEN '전기'
    ELSE '기타'
    END AS type_Korean
FROM basic.pokemon

 

 

Q3. 각 포켓몬의 총점(total)을 기준으로, 300이하면 'Low', 301에 서500사이면  'Medium', 501이상이면 'High'로 분류해주세요

SELECT
  id
  ,kor_name
  ,total
  ,CASE WHEN total <= 300 THEN 'Low'
    WHEN total <= 500 THEN 'Medium'
    ELSE 'High'
    END AS total_score
FROM basic.pokemon

 

 

Q4. 각 트레이너의 배지 개수(badge_count)를 기준으로, 5개 이하면 'Beginner', 6개에서 8개 사이면 'Intermediate', 그 이상이면 'Advanced'로 분류해주세요.

SELECT
  id
  ,name
  ,badge_count
  ,CASE WHEN badge_count <= 5 THEN 'Beginner'
    WHEN badge_count <= 8 THEN 'Intermediate'
    ELSE 'Advanced'
    END AS trainer_score
FROM basic.trainer

 

 

Q5. 트레이너가 포켓몬을 포획한 날짜(catch_date)가 '2023-01-01' 이후이면 'Recent', 그렇지 않으면 'Old'로 분류해주세요

SELECT
  id
  ,trainer_id
  ,pokemon_id
  ,DATE(catch_datetime,'Asia/Seoul')
  ,IF(DATE(catch_datetime,'Asia/Seoul') >= '2023-01-01','Recent','Old') AS recent_old 
FROM basic.trainer_pokemon

 

 

Q6. 배틀에서 승자(winner_id)가 player1_id 와 같으면 'Player1 Wins', player2_id와 같으면 'Player2 Wins', 그렇지 않으면 'Draw'로 결과가 나오게 해주세요

SELECT
  id
  ,player1_id
  ,player2_id
  ,winner_id
  ,CASE WHEN winner_id = player1_id THEN 'Player1 Wins'
        WHEN winner_id = player2_id THEN 'Player2 Wins'
        ELSE 'Draw'
        END AS result_winner
FROM basic.battle

 

 

 


 

BigQuery 공식 문서 확인하는 방법

 

개발 공식 문서

 - 프로그래밍언어, 라이브러리 등은 해당 기술을 어떻게 사용하면 좋은 지에 대해 문서를 제공함

 - 완성도는 모두 다르지만, 많이 참고하는 참고서 느낌 (수학의정석)

 - 처음엔 어려워 보일 수 있지만, 익숙해지면 빠르게 파악할 수 있음

 - BigQuery에 해당되는 것은 아니고 대부분의 프로그래밍관련 내용에 적용할 수 있음

 

찾는 방법

“기술명 + documentation” 으로 검색

ex )BigQuery Documentation 검색

 

 

공식 문서를 꼭 봐야 하나?

- 공식 문서'도' 볼 수 있어야 함

- ChatGPT, 블로그에도 참고할 수 있는 자료가 있을 수도 있지만, 잘못된 경우나 과거 문법인 경우가 존재함

- 구글에서 관리하는 문서이므로 기준점으로 삼아보기

- 다만 공식 문서로 시작하면 방대한 양에 압도될 수 있으므로, 필요할 때 마다 공식 문서를 보는 방식으로 학습 추천

 

 

공식 문서 Slack RSS Feed 추가하기

BigQuery가 조용히(?) 새로운 기능을 출시하기ㅗ 함

이 걸 빠르게 알 수 있는 방법은? => RSS Feed 구독

 

RSS Feed(Really Simple Syndication)

- 새 기사들의 제목 또는 새 기사들 전체를 뽑아서 하나의 파일로 만들어 놓은 것

 

슬랙에서 알람 받아보기

- 개인 목적으로 사용할 슬랙 워크스페이스 생성

- 채널에 아래 명령어 입력

/feedsubscribe https://cloud.google.com/feeds/bigquery-release-notes.xml

 


 

 

원래 40강 까지는 하려고 했는데 다른 공부도 있어서 결국 30강까지밖에 못 했다..

오늘은 총 10강 정도 진행한 건데 으아... 이 것도 쉽지 않군

데이터리안에서는 Mysql을 기준으로 공부하고 해당 강의는 Bigquery를 기준으로 공부하니

두 개 모두 SQL이라는 공통 언어를 사용하지만 문법같은 몇몇 개의 기준이 다르다.

좀 헷갈리는 것 같은데 나중에 날 잡고 Mysql / Bigguery / Oracle 정도는 정리하는 게 좋을 것 같다.

 

'데이터분석 > 스터디' 카테고리의 다른 글

[Bigquery] 초보자를 위한 BigQuery(SQL) 입문(1)  (0) 2026.05.31