02. Query syntax ( legacy, standard )

  • 본 문서에서는 BigQuery의 기본 문법에 대해 작성되어 있습니다
  • 본 문서는 2가지 모드의 문법에 대해 설명하고, 다음 문서에서 직접 쿼리를 날려보겠습니다
  • 참고로 BigQuery는 Column base로 비용을 부과하고 있습니다! SELECT id1, id2 from table 이렇게 쿼리를 날리면 id1, id2를 풀스캔해서 비용을 부과합니다 ( 한 컬럼의 value 값들이 용량이 크다면 이 부분에서 비용이 늘어날 수 있습니다 )

BigQuery의 2가지 Mode


  • BigQuery는 2가지 Mode를 가지고 있습니다. Legacy SQL와 Standard SQL

1) Legacy SQL

- Legacy SQL은 BigQuery가 처음 개발될 때부터 사용되던 문법입니다. 2.0 이전에는 BigQuery SQL이라고 불리다가 BigQuery 2.0 이후 Standard SQL이 지원되면서 Legacy SQL로 이름이 바뀌었습니다
- Legacy라고 되어 있지만, console에 default로 설정되어 있습니다
- TABLE_DATE_RANGE 함수로 쉽게 테이블의 범위 설정을 할 수 있습니다
- FROM 절에 테이블을 작성할 경우, [Table] 같이 []을 사용합니다

2) Standard SQL

- BigQuery 2.0 이후 지원된 문법으로 SQL 2011 standard와 호환되며 중첩/반복 데이터 쿼리를 지원합니다
- Standard SQL로 사용하고 싶다면 
    (1) Query창에 #standardSQL 라고 명시
    (2) Show Options에서 use legacy SQL 체크 해제
    (3) Chrome 확장 프로그램 'BigMate' 사용
- With clauses를 사용해 Temp Table을 생성해 활용할 수 있습니다
- ARRAY / STRUCT data types을 가지고 있습니다
- DML ( Inserts, updates, deletes ) 기능 사용 가능
- FROM 절에 테이블을 작성할 경우, `Table` 같이 ` `을 사용합니다

어떤 것을 더 많이 사용하나요?

  • 해외 유저들을 보면 standardSQL을 사용하는 사람들이 더 많았습니다! ( 문법의 다양성 때문이라고 답변하더라구요 )
  • 저는 legacy SQL부터 익히고 standardSQL을 익힌 케이스인데, legacySQL의 문법의 장점도 있고, standardSQL의 장점도 있습니다! 처음 접하신다면 standardSQL을 추천드리고 싶습니다 :)

Legacy SQL Syntax


1) Data Type

Data type Note
String UTF-8 데이터
BYTES binary 데이터, base64-encoded된 Table만 읽을 수 있음
INTEGER 64비트의 정수
FLOAT 부동소수점
BOOLEAN True or False
RECORD 하나 이상의 서브 필드를 가지는 데이터 형태(python의 dict)
REPEATED 하나의 필드에 여러개의 데이터를 저장하는 형태(python의 list)
DATE date
TIME time
DATETIME datetime
TIMESTAMP Unix Timestamp

2) Legacy SQL의 COUNT(distinct column)는 일정 값 이상일 경우 추정값을 return합니다. 정확한 값을 얻고 싶다면 EXACT_COUNT_DISTINCT(column)을 사용해주세요! (standardSQL은 count(distinct column)이 정확한 값을 return)

3) Window Function을 지원합니다!! 잘 사용하면 정말 유용합니다

4) 기본 문법은 공식 문서를 참고해주세요

5) 몇가지 문법은 아래에 스크린샷으로 첨부합니다

Standard SQL Syntax


1) Data Type

Data type Note
String Unicode 데이터
BYTES binary 데이터
INT64 64비트의 정수
FLOAT64 부동소수점
BOOL True or False
DATE date
TIME time
DATETIME datetime
TIMESTAMP 마이크로초로 절대 시간을 표시
ARRAY ordered list. type 정의할 때 angle bracket(<,>) 사용
STRUCT struct, type 정의할 때 angle bracket(<,>) 사용

2) standardSQL은 with 구문을 사용해 with문에서 정의한 쿼리 결과를 반복적으로 사용할 수 있습니다

3) SELECT문 안에, WHERE 절에 바로 서브쿼리를 사용할 수 있습니다 (Legacy SQL은 불가능)

4) DML(insert, update, delete)이 가능합니다

5) 기본 문법은 공식 문서를 참고해주세요

Legacy / Standard 비교


Data 형태 비교

문법 비교