표준 SQL 데이터 유형

BigQuery는 정수와 같은 간단한 데이터 유형뿐만 아니라 ARRAY 및 STRUCT와 같은 보다 복잡한 유형도 지원합니다. 이 페이지는 허용 값을 포함하여 각 데이터 유형의 개요를 설명합니다. 데이터 유형 리터럴 및 구조체에 대한 자세한 내용은 어휘 구조 및 구문을 참조하세요.

데이터 유형 속성

데이터 저장 및 쿼리 시 다음 데이터 유형 속성에 유의하는 것이 좋습니다.

속성 설명 적용 대상
Null 사용 가능 NULL이 유효한 값입니다. 다음을 제외한 모든 데이터 유형:
  • ARRAY는 NULL이 될 수 없습니다.
  • NULL ARRAY 요소는 테이블로 지속될 수 없습니다.
Orderable ORDER BY 절에서 사용할 수 있습니다. 다음을 제외한 모든 데이터 유형:
  • ARRAY
  • STRUCT
Groupable 일반적으로
GROUP BY, DISTINCT, PARTITION BY 다음에 오는 표현식에 나타날 수 있습니다.
그러나 PARTITION BY 표현식에는
부동 소수점 유형 FLOATDOUBLE이 포함될 수 없습니다.
다음을 제외한 모든 데이터 유형:
  • ARRAY
  • STRUCT
Comparable 동일한 유형의 값을 서로 비교할 수 있습니다. 다음을 제외한 모든 데이터 유형: ARRAY 비교는 지원되지 않습니다.

STRUCT에 대한 같음 비교는 필드 순서로 필드별로 지원됩니다. 필드 이름은 무시됩니다. 보다 작음 및 보다 큼 비교는 지원되지 않습니다.

비교를 지원하는 모든 유형을 JOIN 조건에서 사용할 수 있습니다. 조인 조건에 대한 설명은 JOIN 유형을 참조하세요.

숫자 유형

숫자 유형에는 정수 유형, 부동 소수점 유형, NUMERIC 데이터 유형이 있습니다.

정수 유형

정수는 소수 구성요소가 없는 숫자 값입니다.

이름 저장소 크기 범위
INT64 8바이트 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

숫자 유형

NUMERIC 데이터 유형은 38자리의 정밀도와, 소수점 9자리의 비율을 사용하는 정확한 숫자 값입니다. 정밀도는 숫자에 포함된 수의 개수입니다. 비율은 소수점 다음에 나오는 수의 개수입니다.

이 유형은 소수를 정확히 나타낼 수 있으며 금융 계산에 적합합니다.

이름 저장소 크기 설명 범위
NUMERIC 16바이트 38자리의 정밀도와 소수점 9자리의 비율을 사용하는 십진수 값. -99999999999999999999999999999.999999999 ~ 99999999999999999999999999999.999999999

부동 소수점 유형

부동 소수점 값은 소수 구성요소가 있는 숫자 근사 값입니다.

이름 저장소 크기 설명
FLOAT64 8바이트 배정밀도(근사) 십진수 값.

부동 소수점 의미 체계

부동 소수점 숫자로 작업 시 고려해야 할 특수한 비 숫자 값(NaN+/-inf)이 있습니다.

산술 연산자는 유한 출력을 생성하는 모든 유한 입력 값과 최소한 한 개 이상의 입력이 무한인 모든 연산에 대해 표준 IEEE-754 동작을 제공합니다.

입력은 유한이지만 출력이 무한인 경우, 함수 호출 및 연산자는 오버플로 오류를 반환합니다. 입력에 무한 값이 포함되어 있으면 출력이 무한일 수 있습니다. 일반적으로 함수는 NaN 또는 +/-inf를 채택하지 않습니다. 그러나 IEEE_DIVIDE와 같은 특정 함수는 유한 입력에서 무한 값을 반환할 수 있습니다. 이러한 모든 경우는 수학 함수에서 명시적으로 언급됩니다.

수학 함수 예
좌항 연산자 우항 반환
모든 값 + NaN NaN
1.0 + +inf +inf
1.0 + -inf -inf
-inf + +inf NaN
최대 FLOAT64 + 최대 FLOAT64 오버플로 오류
최소 FLOAT64 / 2.0 0.0
1.0 / 0.0 '0으로 나누기' 오류

비교 연산자는 부동 소수점 입력에 표준 IEEE-754 동작을 제공합니다.

비교 연산자 예
좌항 연산자 우항 반환
NaN = 모든 값 FALSE
NaN < 모든 값 FALSE
모든 값 < NaN FALSE
-0.0 = 0.0 TRUE
-0.0 < 0.0 FALSE

부동 소수점 값은 가장 작은 값부터 가장 큰 값까지 다음 순서로 정렬됩니다.

  1. NULL
  2. NaN — 정렬 시 모든 NaN 값은 같은 값으로 간주됩니다.
  3. -inf
  4. 음수
  5. 0 또는 -0 — 정렬 시 모든 0 값은 같은 값으로 간주됩니다.
  6. 양수
  7. +inf

특수 부동 소수점 값은 GROUP BY 절에 의한 그룹화와 DISTINCT 키워드에 의한 그룹화를 포함하여 다음과 같이 그룹화됩니다.

  • NULL
  • NaN — 그룹화 시 모든 NaN 값은 같은 값으로 간주됩니다.
  • -inf
  • 0 또는 -0 — 그룹화 시 모든 0 값은 같은 값으로 간주됩니다.
  • +inf

부울 유형

이름 설명
BOOL 부울 값은 TRUEFALSE 키워드로 표시됩니다(대소문자를 구분하지 않음).

문자열 유형

이름 설명
STRING 가변 길이 문자(Unicode) 데이터

입력 STRING 값은 UTF-8로 인코딩되어야 하고, 출력 STRING 값은 UTF-8로 인코딩됩니다. CESU-8, Modified UTF-8과 같은 다른 인코딩은 유효한 UTF-8으로 처리되지 않습니다.

STRING 값에 수행되는 모든 함수와 연산자는 바이트가 아닌 Unicode 문자에 작동합니다. 예를 들어 STRING 입력에 적용되는 SUBSTRLENGTH와 같은 함수는 바이트가 아닌 Unicode 문자 수를 셉니다. 비교는 Unicode 문자로 정의됩니다. 보다 작음 및 ORDER BY 비교는 문자별로 비교하고, 하위 Unicode 코드 포인트는 하위 문자로 간주됩니다.

대부분의 STRING 함수는 BYTES로도 정의됩니다. BYTES 버전은 Unicode 문자가 아닌 원시 바이트에 작동합니다. STRING과 BYTES는 서로 바꿔서 사용할 수 없는 별도의 유형입니다. 어느 방향으로도 암시적 변환이 없습니다. STRING과 BYTES 간의 명시적 변환은 UTF-8 인코딩과 디코딩을 수행합니다. 바이트가 유효한 UTF-8이 아닌 경우 BYTES를 STRING으로 변환하면 오류가 반환됩니다.

바이트 유형

이름 설명
BYTES 가변 길이 바이너리 데이터

STRING과 BYTES는 서로 바꿔서 사용할 수 없는 별도의 유형입니다. 대부분의 STRING 함수는 BYTES로도 정의됩니다. BYTES 버전은 Unicode 문자가 아닌 원시 바이트에 작동합니다. STRING 또는 BYTES로 변환하면 바이트는 UTF-8으로 인코딩됩니다.

날짜 유형

이름 설명 범위
DATE 논리적 달력 날짜를 나타냅니다. 0001-01-01 ~ 9999-12-31.

DATE 유형은 시간대와 관계없이 논리적 달력 날짜를 나타냅니다. DATE 값은 특정 24시간 기간을 나타내지 않습니다. 그 대신 주어진 DATE 값은 다른 시간대에서 해석될 때 다른 24시간 기간을 나타내며, 일광 절약 시간 전환 중에는 더 짧거나 긴 하루를 나타낼 수 있습니다. 절대 시간을 표시하려면 타임스탬프를 사용합니다.

정규 형식

'YYYY-[M]M-[D]D'
  • YYYY: 4자리 연도
  • [M]M: 한 자리 또는 두 자리 월
  • [D]D: 한 자리 또는 두 자리 일

날짜/시간 유형

이름 설명 범위
DATETIME 연도, 월, 일, 시간, 분, 초, 초 미만을 나타냅니다. 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59.999999.

DATETIME은 시점을 나타냅니다. 각 DATETIME에는 다음이 포함됩니다.

  • 연도
  • 초 미만

타임스탬프와 달리 DATETIME 객체는 절대적 시간 인스턴스를 나타내지 않습니다. 그 대신 상용시 또는 사용자가 시계 또는 달력에는 보는 시간입니다.

정규 형식

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]
  • YYYY: 4자리 연도
  • [M]M: 한 자리 또는 두 자리 월
  • [D]D: 한 자리 또는 두 자리 일
  • ( |T): 공백 또는 T 구분선
  • [H]H: 한 자리 또는 두 자리 시간(유효 값: 00~23)
  • [M]M: 한 자리 또는 두 자리 분(유효 값: 00~59)
  • [S]S: 한 자리 또는 두 자리 초(유효 값: 00~59)
  • [.DDDDDD]: 최대 6자리 소수(즉, 최고 마이크로초 정밀도까지)

시간 유형

이름 설명 범위
TIME 특정 날짜와 무관한 시간을 나타냅니다. 00:00:00 ~ 23:59:59.999999.

TIME 데이터 유형은 특정 날짜와 무관한 시간을 나타냅니다.

정규 형식

[H]H:[M]M:[S]S[.DDDDDD]
  • [H]H: 한 자리 또는 두 자리 시간(유효 값: 00~23)
  • [M]M: 한 자리 또는 두 자리 분(유효 값: 00~59)
  • [S]S: 한 자리 또는 두 자리 초(유효 값: 00~59)
  • [.DDDDDD]: 최대 6자리 소수(즉, 최고 마이크로초 정밀도까지)

타임스탬프 유형

이름 설명 범위
TIMESTAMP 마이크로초 단위의 정밀도를 갖는 절대 시점을 나타냅니다. 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59.999999 UTC.

타임스탬프는 일광 절약 시간과 같은 시간대 또는 규칙과는 별도로 절대 시점을 나타냅니다.

TIMESTAMP는 마이크로초 단위 정밀도를 제공합니다.

정규 형식

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]][time zone]
  • YYYY: 4자리 연도
  • [M]M: 한 자리 또는 두 자리 월
  • [D]D: 한 자리 또는 두 자리 일
  • ( |T): 공백 또는 T 구분선
  • [H]H: 한 자리 또는 두 자리 시간(유효 값: 00~23)
  • [M]M: 한 자리 또는 두 자리 분(유효 값: 00~59)
  • [S]S: 한 자리 또는 두 자리 초(유효 값: 00~59)
  • [.DDDDDD]: 최대 6자리 소수(즉, 최고 마이크로초 정밀도까지)
  • [time zone] : 시간대를 나타내는 문자열. 자세한 내용은 시간대 섹션을 참조하세요.

시간대는 타임스탬프를 파싱하거나 표시할 타임스탬프 형식을 지정하는 데 사용됩니다. 타임스탬프 값 자체는 특정 시간대를 저장하지 않습니다. 문자열 형식의 타임스탬프에는 시간대가 포함될 수 있습니다. 시간대가 명시적으로 지정되어 있지 않은 경우 기본 시간대인 UTC가 사용됩니다.

시간대

시간대는 다음 두 정규 형식 중 하나의 문자열로 표시됩니다.

  • UTC(Coordinated Universal Time)에서 오프셋 또는 UTC에 대한 문자 Z
  • tz 데이터베이스의 시간대 이름

UTC(Coordinated Universal Time)에서 오프셋

오프셋 형식
(+|-)H[H][:M[M]]
Z
예시
-08:00
-8:15
+3:00
+07:30
-7
Z

이 형식 사용 시 시간대와 나머지 타임스탬프 사이에 공백이 없어야 합니다.

2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z

시간대 이름

시간대 이름은 tz 데이터베이스에서 가져옵니다. 덜 포괄적이지만 간단한 참조를 원할 경우 Wikipedia의 tz 데이터베이스 시간대 목록을 참조하세요.

형식
continent/[region/]city
예시
America/Los_Angeles
America/Argentina/Buenos_Aires

시간대 이름 사용 시 이름과 나머지 타임스탬프 사이에 공백이 있어야 합니다.

2014-09-27 12:30:00.45 America/Los_Angeles

특정 시기 중에 동일한 시간을 보고하더라도 시간대 이름을 서로 바꿀 수 없는 경우도 있습니다. 예를 들어, America/Los_Angeles는 일광 절약 시간 동안 UTC-7:00과 같은 시간을 보고하지만, 일광 절약 시간이 아닐 때는 UTC-8:00과 같은 시간을 보고합니다.

시간대를 지정하지 않으면 기본 시간대 값이 사용됩니다.

윤초

타임스탬프는 1970-01-01 00:00:00 UTC의 오프셋이며, 1분을 정확히 60초라고 가정합니다. 윤초는 저장된 타임스탬프의 일부로 표시되지 않습니다.

입력의 초 필드에 윤초를 나타내기 위해 ':60'을 사용한 값이 포함되어 있으면 타임스탬프 값으로 변환 시 해당 윤초가 보존되지 않습니다. 대신 해당 값은 다음 분의 초 필드에 ':00'이 있는 타임스탬프로 해석됩니다.

윤초는 타임스탬프 계산에 영향을 미치지 않습니다. 모든 타임스탬프는 윤초를 반영하지 않는 Unix 형식의 타임스탬프를 사용하여 계산됩니다. 실제 시간을 측정하는 함수를 통해서만 윤초를 확인할 수 있습니다. 윤초가 있는 경우 이러한 함수에서 타임스탬프 초를 건너뛰거나 반복할 수 있습니다.

배열 유형

이름 설명
ARRAY ARRAY가 아닌 유형의 요소가 0개 이상이 있는 순서가 지정된 목록

ARRAY는 비 ARRAY 값의 요소가 0개 이상 있는 순서가 지정된 목록입니다. ARRAY의 ARRAY는 허용되지 않습니다. ARRAY의 ARRAY를 생성하는 쿼리는 오류를 반환합니다. 대신 SELECT AS STRUCT 구문을 사용하여 STRUCT를 ARRAY 사이에 삽입해야 합니다.

현재 BigQuery에는 NULL 및 ARRAY와 관련하여 다음과 같은 두 가지 제한이 있습니다.

  • 쿼리 결과에 NULL 요소가 포함된 ARRAY가 있는 경우 그러한 ARRAY를 쿼리 내에 사용할 수 있더라도 BigQuery에서는 오류가 발생합니다.
  • 쿼리 내에서 NULL과 빈 ARRAY가 두 개의 서로 다른 값이더라도 BigQuery는 쿼리 결과에서 NULL ARRAY를 빈 ARRAY로 변환합니다.

ARRAY 유형 선언

ARRAY 유형은 꺾쇠괄호(<>)를 사용하여 선언됩니다. ARRAY의 요소 유형은 ARRAY가 다른 ARRAY를 직접 포함할 수 없다는 점을 제외하고 임의로 복합적일 수 있습니다.

형식

ARRAY<T>

예시

유형 선언 의미
ARRAY<INT64> 64비트 정수의 단순 ARRAY입니다.
ARRAY<STRUCT<INT64, INT64>> 각각 두 개의 64비트 정수를 포함하는 STRUCT의 ARRAY입니다.
ARRAY<ARRAY<INT64>>
(지원되지 않음)
다차원 ARRAY를 만들려는 경우를 대비하여 여기에 포함된 잘못된 유형 선언입니다. ARRAY는 ARRAY를 직접 포함할 수 없습니다. 대신 다음 예를 참조하세요.
ARRAY<STRUCT<ARRAY<INT64>>> 64비트 정수로 된 ARRAY의 ARRAY입니다. ARRAY는 다른 ARRAY를 직접 포함할 수 없으므로 두 ARRAY 사이에 STRUCT가 있습니다.

구조체 유형

이름 설명
STRUCT 각각 유형(필수)과 필드 이름(선택사항)이 있는 정렬된 필드의 컨테이너

STRUCT 유형 선언

STRUCT 유형은 꺾쇠괄호(<>)를 사용하여 선언됩니다. STRUCT의 요소 유형은 임의로 복합적일 수 있습니다.

형식

STRUCT<T>

예시

유형 선언 의미
STRUCT<INT64> 명명되지 않은 64비트 정수 필드가 하나 있는 단순 STRUCT입니다.
STRUCT<x STRUCT<y INT64, z INT64>> 안에 x라는 이름의 중첩된 STRUCT가 있는 STRUCT입니다. STRUCT x에는 yz, 두 개의 필드가 있고, 두 필드 모두 64비트 정수입니다.
STRUCT<inner_array ARRAY<INT64>> 64비트 정수 요소를 갖는 inner_array라는 ARRAY가 포함된 STRUCT입니다.

STRUCT 생성

튜플 구문

형식
(expr1, expr2 [, ... ])

출력 유형은 입력 표현식 유형과 일치하는 익명 필드가 있는 익명 STRUCT 유형입니다. 표현식을 최소한 두 개 이상 지정해야 합니다. 그렇지 않으면 이 구문을 괄호로 묶인 표현식과 구분할 수 없습니다.

예시
구문 출력 유형 참고
(x, x+y) STRUCT<?,?> 열 이름을 사용하는 경우(따옴표로 묶이지 않은 문자열), STRUCT 필드 데이터 유형은 열 데이터 유형에서 파생됩니다. xy는 열이므로, STRUCT 필드의 데이터 유형은 더하기 연산자의 출력 유형과 열 유형에서 파생됩니다.

WHERE 절 등에서 복합 키를 사용하는 비교 표현식을 위해 이 구문을 STRUCT 비교와 함께 사용할 수도 있습니다.

WHERE (Key1,Key2) IN ( (12,34), (56,78) )

유형이 없는 struct 구문

형식
STRUCT( expr1 [AS field_name] [, ... ])

필드 이름 중복이 허용됩니다. 이름이 없는 필드는 익명 필드로 간주되고 이름으로 참조될 수 없습니다. STRUCT 값은 NULL이거나 NULL 필드 값일 수 있습니다.

예시
구문 출력 유형
STRUCT(1,2,3) STRUCT<int64,int64,int64>
STRUCT() STRUCT<>
STRUCT('abc') STRUCT<string>
STRUCT(1, t.str_col) STRUCT<int64, str_col string>
STRUCT(1 AS a, 'abc' AS b) STRUCT<a int64, b string>
STRUCT(str_col AS abc) STRUCT<abc string>

유형 struct 구문

형식
STRUCT<[field_name] field_type, ...>( expr1 [, ... ])

유형 구문을 사용하면 명시적인 STRUCT 데이터 유형으로 STRUCT를 생성할 수 있습니다. 출력 유형은 정확히 제공된 field_type입니다. 두 유형이 다르면 입력 표현식은 field_type으로 강제 변환되며, 유형이 호환되지 않으면 오류가 발생합니다. 입력 표현식에서 AS alias는 허용되지 않습니다. 표현식 수가 유형의 필드 수와 일치해야 하며, 표현식 유형은 필드 유형으로 강제 변환 또는 리터럴 강제 변환되어야 합니다.

예시
구문 출력 유형
STRUCT<int64>(5) STRUCT<int64>
STRUCT<date>("2011-05-05") STRUCT<date>
STRUCT<x int64, y string>(1, t.str_col) STRUCT<x int64, y string>
STRUCT<int64>(int_col) STRUCT<int64>
STRUCT<x int64>(5 AS x) 오류 - 유형 구문은 AS를 허용하지 않습니다.

STRUCT에 대한 제한적 비교

같음 연산자를 사용하여 STRUCT를 직접 비교할 수 있습니다.

  • 같음(=)
  • 같지 않음(!= 또는 <>)
  • [NOT] IN

그러나 이러한 직접 같음 비교는 필드 이름을 무시하고 순서대로 STRUCT 필드를 쌍으로 비교합니다. STRUCT의 동일한 이름의 필드를 비교하려는 경우에는 개별 필드를 직접 비교할 수 있습니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

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

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