표준 SQL 어휘 구조

BigQuery 문은 일련의 토큰으로 구성됩니다. 토큰에는 식별자, 따옴표 붙은 식별자, 리터럴, 키워드, 연산자, 특수문자 등이 포함됩니다. 공백(공백, 백스페이스, 탭, 줄바꿈) 또는 주석으로 토큰을 구분할 수 있습니다.

식별자

식별자는 열, 테이블, 기타 데이터베이스 객체와 연결된 이름입니다.

식별자는 문자 또는 밑줄로 시작되어야 합니다. 첫 글자 이후에는 문자, 숫자, 밑줄이 올 수 있습니다. 따옴표 붙은 식별자는 역따옴표(`)로 묶인 식별자이며 공백이나 기호와 같은 문자를 포함할 수 있습니다. 하지만 따옴표 붙은 식별자를 비워둘 수는 없습니다. 예약된 키워드는 역따옴표로 묶인 경우에만 식별자로 사용될 수 있습니다.

구문(여기서는 정규 표현식으로 정의됨):

[A-Za-z_][A-Za-z_0-9]*

예를 들면 다음과 같습니다.

Customers5
_dataField1
ADGROUP

잘못된 예:

5Customers
_dataField!
GROUP

5Customers는 문자 또는 밑줄이 아닌 숫자로 시작되었습니다. _dataField!에는 문자나 숫자 또는 밑줄이 아닌 특수 문자 '!'가 포함되어 있습니다. GROUP은 예약된 키워드이므로 역따옴표 문자로 묶지 않으면 식별자로 사용될 수 없습니다.

식별자와 따옴표 붙은 식별자는 모두 대소문자를 구분하지 않지만 약간의 차이가 있습니다. 자세한 내용은 대소문자 구분을 참조하세요.

따옴표 붙은 식별자는 아래에 정의된 문자열 리터럴과 동일한 이스케이프 시퀀스를 갖습니다.

리터럴

리터럴은 내장 데이터 유형의 상수 값을 나타냅니다. 전부는 아니지만 일부 데이터 유형을 리터럴로 표현할 수 있습니다.

문자열 및 바이트 리터럴

문자열과 바이트 리터럴을 모두 작은따옴표(') 또는 큰따옴표(")로 묶거나, 세 개의 작은따옴표(''') 또는 세 개의 큰따옴표(""")로 이루어진 그룹으로 삼중따옴표 처리해야 합니다.

따옴표 붙은 리터럴:

리터럴 설명
따옴표 붙은 문자열
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
작은따옴표(')로 묶인 문자열은 이스케이프 처리되지 않은 큰따옴표(")를 포함할 수 있고, 그 반대도 가능합니다.
백슬래시(\)는 이스케이프 시퀀스를 시작합니다. 아래의 이스케이프 시퀀스 테이블을 참조하세요.
백슬래시(\)가 앞에 있는 경우에도 따옴표 붙은 문자열은 줄바꿈을 포함할 수 없습니다.
삼중따옴표 붙은 문자열
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
삽입된 줄바꿈과 따옴표는 이스케이프 처리 없이 허용됩니다(네 번째 예 참조).
백슬래시(\)는 이스케이프 시퀀스를 시작합니다. 아래의 이스케이프 시퀀스 표를 참조하세요.
줄 끝의 이스케이프되지 않은 후행 백슬래시(\)는 허용되지 않습니다.
행에서 시작 따옴표와 일치하는 세 개의 이스케이프 처리되지 않은 따옴표로 문자열을 끝냅니다.
원시 문자열
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
원시 문자열 리터럴 접두사(r 또는 R)가 있는 따옴표 또는 삼중따옴표 붙은 리터럴은 원시/정규식 문자열로 해석됩니다.
백슬래시 문자(\)가 이스케이프 문자로 작동하지 않습니다. 문자열 리터럴 내에서 백슬래시 뒤에 다른 문자가 있는 경우, 두 문자 모두 유지됩니다.
원시 문자열은 홀수 개의 백슬래시로 끝날 수 없습니다.
원시 문자열은 정규 표현식을 만드는 데 유용합니다.

접두사 문자(r, R, b, B)는 따옴표 또는 삼중따옴표 붙은 문자열에서 선택적으로 사용할 수 있으며, 문자열이 각각 원시/정규식 문자열 또는 바이트 시퀀스임을 나타냅니다. 예를 들어 b'abc'b'''abc'''는 모두 유형 바이트로 해석됩니다. 접두사 문자는 대소문자를 구분하지 않습니다.

접두사가 있는 따옴표 붙은 리터럴:

리터럴 설명
바이트
  • B"abc"
  • B'''abc'''
  • b"""abc"""
바이트 리터럴 접두사(b 또는 B)가 있는 따옴표 또는 삼중따옴표 붙은 리터럴은 바이트로 해석됩니다.
원시 바이트
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
rb 접두사는 임의의 순서로 조합될 수 있습니다. 예를 들어 rb'abc*'br'abc*'와 같습니다.

아래 표에는 문자열 리터럴과 바이트 리터럴에서 영숫자 문자가 아닌 문자를 나타내는 모든 유효한 이스케이프 시퀀스가 ​​나열되어 있습니다. 이 표에 없는 시퀀스는 모두 오류를 생성합니다.

이스케이프 시퀀스 설명
\a
\b 백스페이스
\f 폼피드
\n 줄바꿈
\r 캐리지 리턴
\t
\v 세로 탭
\\ 백슬래시(\)
\? 물음표(?)
\" 큰따옴표(")
\' 작은따옴표(')
\` 백틱(`)
\ooo 정확히 세 자리의 8진수 이스케이프(0~7 범위). 단일 유니코드 문자(문자열 리터럴) 또는 바이트(바이트 리터럴)로 디코딩됩니다.
\xhh 또는 \Xhh 정확히 두 자리의 16진수 이스케이프(0~9 또는 A~F 또는 a~f). 단일 유니코드 문자(문자열 리터럴) 또는 바이트(바이트 리터럴)로 디코딩됩니다. 예를 들면 다음과 같습니다.
  • '\x41' == 'A'
  • '\x41B''AB'
  • '\x4'는 오류
\uhhhh 유니코드 이스케이프, 소문자 'u'와 정확히 4자리의 16진수. 문자열 리터럴 또는 식별자에서만 유효합니다.
D800~DFFF 범위는 서로게이트 유니코드 값이므로 허용되지 않습니다.
\Uhhhhhhhh 유니코드 이스케이프, 대문자 'U'와 정확히 8자리의 16진수. 문자열 리터럴 또는 식별자에서만 유효합니다.
D800-DFFF 범위는 서로게이트 유니코드 값이므로 허용되지 않습니다. 또한 10FFFF보다 큰 값은 허용되지 않습니다.

정수 리터럴

정수 리터럴은 10진수 시퀀스(0~9)이거나, "0x" 또는 "0X" 프리픽스로 시작하는 16진수 값입니다. 정수 앞에는 각각 양수 값과 음수 값을 나타내는 프리픽스 '+' 또는 '-'를 붙일 수 있습니다. 예를 들면 다음과 같습니다.

123
0xABC
-123

정수 리터럴은 INT64로 해석됩니다.

NUMERIC 리터럴

NUMERIC 키워드 뒤에 따옴표로 묶은 부동 소수점 값을 사용하여 NUMERIC 리터럴을 구성할 수 있습니다.

예를 들면 다음과 같습니다.

SELECT NUMERIC '0';
SELECT NUMERIC '123456';
SELECT NUMERIC '-3.14';
SELECT NUMERIC '-0.54321';
SELECT NUMERIC '1.23456e05';
SELECT NUMERIC '-9.876e-3';

부동 소수점 리터럴

구문 옵션:

[+-]DIGITS.[DIGITS][e[+-]DIGITS]
[DIGITS].DIGITS[e[+-]DIGITS]
DIGITSe[+-]DIGITS

DIGITS는 한 개 이상의 10진수(0~9)를 나타내고, e는 지수 마커(e 또는 E)를 나타냅니다.

예를 들면 다음과 같습니다.

123.456e-67
.1E4
58.
4e2

소수점 또는 지수 마커를 포함하는 숫자 리터럴은 double 유형으로 추정됩니다.

값이 유효한 float 범위 내에 있으면 암시적으로 부동 소수점 리터럴을 float 유형으로 강제 변환할 수 있습니다.

NaN 또는 무한대의 리터럴 표시는 없지만 명시적으로 대소문자를 구분하지 않는 다음 문자열을 float 유형으로 변환할 수 있습니다.

  • 'NaN'
  • 'inf' 또는 '+inf'
  • '-inf'

배열 리터럴

배열 리터럴은 대괄호로 묶이고 쉼표로 구분된 요소 목록입니다. ARRAY 키워드는 선택사항이며, 명시적 요소 유형 T도 선택사항입니다.

예를 들면 다음과 같습니다.

[1, 2, 3]
['x', 'y', 'xy']
ARRAY[1, 2, 3]
ARRAY<string>['x', 'y', 'xy']
ARRAY<int64>[]

구조체 리터럴

구문:

(elem[, elem...])

여기서, elem은 구조체의 요소입니다. elem은 표현식이나 열 이름이 아닌 리터럴 데이터 유형이어야 합니다.

출력 유형은 입력 표현식과 유형이 일치하는 익명 필드가 있는 익명 구조체 유형(구조체는 명명된 유형이 아님)입니다.

출력 유형
(1, 2, 3) STRUCT<int64,int64,int64>
(1, 'abc') STRUCT<int64,string>

날짜 리터럴

구문:

DATE 'YYYY-M[M]-D[D]'

날짜 리터럴은 DATE 키워드와 그 뒤에 정규 날짜 형식을 따르고 작은따옴표로 묶인 문자열 리터럴을 포함합니다. 날짜 리터럴은 1부터 9999까지의 범위를 지원합니다. 이 범위를 벗어나는 날짜는 유효하지 않습니다.

예를 들어, 다음 날짜 리터럴은 2014년 9월 27일을 나타냅니다.

DATE '2014-09-27'

또한 정규 날짜 형식의 문자열 리터럴이 DATE 유형 표현식이 필요한 곳에서 사용되면 암시적으로 이러한 문자열 리터럴은 DATE 유형으로 강제 변환됩니다. 예를 들면 다음 쿼리와 같습니다.

SELECT * FROM foo WHERE date_col = "2014-09-27"

문자열 리터럴 "2014-09-27"은 날짜 리터럴로 강제 변환됩니다.

시간 리터럴

구문:

TIME '[H]H:[M]M:[S]S[.DDDDDD]]'

시간 리터럴은 정규 시간 형식을 따르고 작은따옴표로 묶인 TIME 키워드와 문자열 리터럴을 포함합니다.

예를 들어, 다음 시간은 오후 12시 30분을 나타냅니다.

TIME '12:30:00.45'

DATETIME 리터럴

구문:

DATETIME 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]]'

DATETIME 리터럴은 정규 DATETIME 형식을 따르고 작은따옴표로 묶인 DATETIME 키워드와 문자열 리터럴을 포함합니다.

예를 들어, 다음 DATETIME은 2014년 9월 27일 오후 12시 30분을 나타냅니다.

DATETIME '2014-09-27 12:30:00.45'

DATETIME 리터럴은 1부터 9999까지의 범위를 지원합니다. 이 범위를 벗어나는 DATETIME은 유효하지 않습니다.

정규 DATETIME 형식을 포함한 문자열 리터럴이 DATETIME 표현식이 예상되는 곳에서 사용되면 DATETIME 리터럴로 암시적으로 강제 변환됩니다.

예:

SELECT * FROM foo
WHERE datetime_col = "2014-09-27 12:30:00.45"

이 쿼리에서 문자열 리터럴 "2014-09-27 12:30:00.45"는 DATETIME 리터럴로 강제 변환됩니다.

타임스탬프 리터럴

구문:

TIMESTAMP 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] [timezone]'

타임스탬프 리터럴은 정규 타임스탬프 형식을 따르고 작은따옴표로 묶인 TIMESTAMP 키워드와 문자열 리터럴을 포함합니다.

타임스탬프 리터럴은 1~9999년까지의 범위를 지원합니다. 이 범위를 벗어나는 타임스탬프는 유효하지 않습니다.

타임스탬프 리터럴은 시간대를 나타내는 숫자 서픽스를 포함할 수 있습니다.

TIMESTAMP '2014-09-27 12:30:00.45-08'

이 서픽스가 없으면 기본 시간대인 UTC가 사용됩니다.

예를 들어 다음 타임스탬프는 UTC 시간대를 사용하여 2014년 9월 27일 오후 12시 30분을 나타냅니다.

TIMESTAMP '2014-09-27 12:30:00.45'

시간대에 대한 자세한 내용은 시간대를 참조하세요.

정규 타임스탬프 형식의 문자열 리터럴(시간대 이름이 있는 경우 포함)이 타임스탬프 표현식이 필요한 곳에 사용되면 암시적으로 이 문자열 리터럴은 타임스탬프 리터럴로 강제 변환됩니다. 예를 들어 다음 쿼리에서 문자열 리터럴 "2014-09-27 12:30:00.45 America/Los_Angeles"는 타임스탬프 리터럴로 강제 변환됩니다.

SELECT * FROM foo
WHERE timestamp_col = "2014-09-27 12:30:00.45 America/Los_Angeles"

시간대

타임스탬프 리터럴은 특정 시점과 매핑되어야 하므로, 리터럴을 올바르게 해석하려면 시간대가 필요합니다. 시간대가 리터럴 자체의 일부로 지정되지 않으면, BigQuery 구현으로 설정되는 기본 시간대 값이 BigQuery에 사용됩니다.

BigQuery는 협정 세계시(UTC) 기준의 오프셋을 나타내는 다음과 같은 정규 형식의 문자열을 사용하여 시간대를 나타냅니다.

형식:

(+|-)H[H][:M[M]]

예를 들면 다음과 같습니다.

'-08:00'
'-8:15'
'+3:00'
'+07:30'
'-7'

또한 tz 데이터베이스의 문자열 시간대 이름을 사용하여 시간대를 표시할 수도 있습니다. 이보다 덜 포괄적이지만 간단한 참고자료를 원한다면 Wikipedia의 tz 데이터베이스 시간대 목록을 참조하세요. 정규 시간대 이름의 형식은 <continent/[region/]city>입니다(예: America/Los_Angeles).

참고: 1년 중 특정 시기에 우연히 시간이 같더라도 시간대 이름을 엄밀히 구분해야 할 수 있습니다. 예를 들어 America/Los_Angeles는 일광 절약 시간 동안 UTC-7:00과 같은 시간을 보고하지만, 일광 절약 시간이 아닐 때는 UTC-8:00과 같은 시간을 보고합니다.

예:

TIMESTAMP '2014-09-27 12:30:00 America/Los_Angeles'
TIMESTAMP '2014-09-27 12:30:00 America/Argentina/Buenos_Aires'

대소문자 구분

BigQuery는 다음 대소문자 구분 규칙을 따릅니다.

카테고리 대소문자 구분 참고
키워드 아니요  
함수 이름 아니요  
테이블 이름  
열 이름 아니요  
문자열 값
문자열 비교  
쿼리 내의 별칭 아니요  
정규 표현식 일치 참고 참조 정규 표현식 일치는 대소문자를 구분하지 않도록 표현식 자체에 지정된 경우 외에는 기본적으로 대소문자를 구분합니다.
LIKE 일치  

예약된 키워드

키워드는 BigQuery 언어에서 특별한 의미를 갖는 토큰 그룹이며, 다음과 같은 특징을 갖습니다.

  • 역따옴표(`) 문자로 묶인 키워드만 식별자로 사용할 수 있습니다.
  • 키워드는 대소문자를 구분하지 않습니다.

BigQuery에 예약된 키워드는 다음과 같습니다.

ALL
AND
ANY
ARRAY
AS
ASC
ASSERT_ROWS_MODIFIED
AT
BETWEEN
BY
CASE
CAST
COLLATE
CONTAINS
CREATE
CROSS
CUBE
CURRENT
DEFAULT
DEFINE
DESC
DISTINCT
ELSE
END







ENUM
ESCAPE
EXCEPT
EXCLUDE
EXISTS
EXTRACT
FALSE
FETCH
FOLLOWING
FOR
FROM
FULL
GROUP
GROUPING
GROUPS
HASH
HAVING
IF
IGNORE
IN
INNER
INTERSECT
INTERVAL
INTO
IS
JOIN
LATERAL
LEFT
LIKE
LIMIT
LOOKUP
MERGE
NATURAL
NEW
NO
NOT
NULL
NULLS
OF
ON
OR
ORDER
OUTER
OVER
PARTITION
PRECEDING
PROTO
RANGE
RECURSIVE
RESPECT
RIGHT
ROLLUP
ROWS
SELECT
SET
SOME
STRUCT
TABLESAMPLE
THEN
TO
TREAT
TRUE
UNBOUNDED
UNION
UNNEST
USING
WHEN
WHERE
WINDOW
WITH
WITHIN

종결 세미콜론

API(애플리케이션 프로그래밍 인터페이스)를 통해 쿼리 문자열 문을 제출할 때 선택적으로 종료 세미콜론(;)을 사용할 수 있습니다.

여러 문이 포함된 요청에서는 문을 세미콜론으로 구분해야 합니다. 하지만 최종 문 다음에는 세미콜론이 일반적으로 선택사항입니다. 일부 대화식 도구의 경우 문에 종결 세미콜론이 있어야 합니다.

주석

주석은 파서가 무시하는 문자 시퀀스입니다. BigQuery는 다음과 같은 주석 유형을 지원합니다.

한 줄 주석

주석 자체를 한 줄로 표시하려면 한 줄 주석을 사용합니다.

예시

# this is a single-line comment
SELECT book FROM library;
-- this is a single-line comment
SELECT book FROM library;
/* this is a single-line comment */
SELECT book FROM library;
SELECT book FROM library
/* this is a single-line comment */
WHERE book = "Ulysses";

인라인 주석

주석이 명령문과 같은 줄에 나타나도록 하려면 인라인 주석을 사용하세요. 앞에 # 또는 --가 추가된 주석은 문의 오른쪽에 나타나야 합니다.

예시

SELECT book FROM library; # this is an inline comment
SELECT book FROM library; -- this is an inline comment
SELECT book FROM library; /* this is an inline comment */
SELECT book FROM library /* this is an inline comment */ WHERE book = "Ulysses";

여러 줄 주석

주석이 여러 줄에 나타나게 하려면 여러 줄 주석을 사용합니다. 중첩된 여러 줄 주석은 지원되지 않습니다.

예시

SELECT book FROM library
/*
  This is a multiline comment
  on multiple lines
*/
WHERE book = "Ulysses";
SELECT book FROM library
/* this is a multiline comment
on two lines */
WHERE book = "Ulysses";
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.