표준 SQL 데이터 유형

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

데이터 유형 속성

데이터를 저장하고 쿼리할 때 다음 데이터 유형 속성에 유의하는 것이 좋습니다.

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


다음을 제외한 모든 데이터 유형:
  • ARRAY
  • STRUCT
  • GEOGRAPHY
Comparable 동일한 유형의 값을 서로 비교할 수 있습니다. 다음을 제외한 모든 데이터 유형: ARRAY 비교는 지원되지 않습니다.

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

GEOGRAPHY 비교는 지원되지 않습니다. GEOGRAPHY 값을 비교하려면 ST_Equals를 사용합니다.

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

숫자 유형

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

정수 유형

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

이름 스토리지 크기 범위
INT64 8바이트 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

NUMERIC 유형

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 값을 대상으로 하는 모든 함수와 연산자는 바이트가 아닌 유니코드 문자를 대상으로 작동합니다. 예를 들어 SUBSTR, LENGTH 등의 함수를 STRING 입력에 적용하면 바이트가 아닌 유니코드 문자가 계수됩니다. 비교는 유니코드 문자 기준으로 정의됩니다. 보다 작음 및 ORDER BY 비교는 문자별로 수행되고, 유니코드 코드 포인트가 낮을수록 작은 문자로 간주됩니다.

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

바이트 유형

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

STRING과 BYTES는 서로 바꿔서 사용할 수 없는 별도의 유형입니다. 대부분의 STRING 관련 함수는 BYTES로도 정의됩니다. BYTES 버전은 유니코드 문자가 아닌 원시 바이트를 대상으로 작동합니다. 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에는 다음이 포함됩니다.

  • 연도
  • month
  • day
  • hour
  • minute
  • 초 미만

타임스탬프와 달리 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자리 소수(즉, 마이크로초 정밀도까지)

지리 유형

이름 설명
GEOGRAPHY 점의 집합으로 표시되는 점, 선 및 다각형의 모음 또는 지구 표면의 하위 집합입니다.

GEOGRAPHY 유형은 OGC SFS(Simple Features specification)을 기반으로 하며 WGS84 기준 타원체에 '간단한' 배열을 형성하는 점, 선 또는 다각형의 모음입니다. 간단한 배열이란 모음의 여러 요소에 WGS84 표면의 어떤 점도 포함되어 있지 않은 배열입니다.

GEOGRAPHY지리 함수의 결과이거나 인수입니다.

시간 유형

이름 설명 범위
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) 기준 오프셋 또는 UTC를 나타내는 문자인 Z
  • tz 데이터베이스에 등록된 시간대 이름

협정 세계시(UTC) 기준 오프셋

오프셋 형식
(+|-)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

1년 중 특정 시기에 우연히 시간이 같더라도 시간대 이름을 엄밀히 구분해야 할 수 있습니다. 예를 들어 America/Los_Angeles는 일광 절약 시간이 적용될 때 UTC-7:00과 시간이 같지만 일광 절약 시간이 적용되지 않을 때는 UTC-8:00과 시간이 같습니다.

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

윤초

타임스탬프는 1분이 정확히 60초라는 가정 하에 1970-01-01 00:00:00 UTC부터 경과된 오프셋입니다. 윤초는 저장된 타임스탬프의 일부로 표현되지 않습니다.

입력 값의 초 필드에 윤초를 나타내는 ':60'이 포함되어 있으면 타임스탬프 값으로 변환할 때 윤초가 보존되지 않습니다. 대신 해당 값은 1분 후의 초 필드에 ':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에는 64비트 정수인 yz라는 두 개의 필드가 있습니다.
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에서 이름이 같은 필드를 비교하려는 경우에는 개별 필드를 직접 비교할 수 있습니다.

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

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

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