표현식 서브 쿼리

표현식 서브 쿼리, 즉 표현식으로 사용되는 서브 쿼리에는 4가지 유형이 있습니다. 표현식 서브 쿼리는 열이나 테이블이 아닌 NULL 또는 단일 값을 반환하며 괄호로 묶여야 합니다. 서브 쿼리에 대한 자세한 내용은 서브 쿼리를 참조하세요.

서브 쿼리 유형 결과 데이터 유형 설명
Scalar 모든 T 유형 표현식 안에 괄호로 묶인 서브 쿼리(예: SELECT 목록 또는 WHERE 절 내)는 스칼라 서브 쿼리로 해석됩니다. 스칼라 서브 쿼리의 SELECT 목록에는 필드가 정확하게 한 개 있어야 합니다. 서브 쿼리가 행을 정확하게 한 개만 반환할 경우 이 단일 값이 스칼라 서브 쿼리 결과가 됩니다. 서브 쿼리가 행을 0개 반환할 경우 스칼라 서브 쿼리 값은 NULL입니다. 서브 쿼리가 행을 두 개 이상 반환할 경우 쿼리가 런타임 오류와 함께 실패합니다. 서브 쿼리가 SELECT AS STRUCT와 함께 작성된 경우에는 열을 여러 개 포함할 수 있고 반환되는 값은 생성된 STRUCT입니다. SELECT AS를 사용하지 않고 열을 여러 개 선택하면 오류가 발생합니다.
ARRAY ARRAY SELECT AS STRUCT를 사용하여 구조체의 배열을 빌드할 수 있고 SELECT AS를 사용하지 않고 열을 여러 개 선택하면 오류가 발생합니다. 서브 쿼리가 행을 0개 반환할 경우 빈 ARRAY를 반환합니다. 절대 NULL ARRAY를 반환하지 않습니다.
IN BOOL IN 연산자 다음에 오는 표현식에서 발생합니다. 이 서브 쿼리는 IN 연산자의 왼쪽에 있는 표현식과 동등성이 호환되는 유형의 단일 열을 생성해야 합니다. 서브 쿼리가 행을 0개 반환할 경우 FALSE를 반환합니다. x IN ()x IN (value, value, ...)와 동일합니다. 전체 시맨틱스는 비교 연산자IN 연산자를 참조하세요.
EXISTS BOOL 서브 쿼리가 행을 한 개 이상 생성한 경우 TRUE를 반환합니다. 서브 쿼리가 행을 0개 생성하면 FALSE를 반환합니다. 절대 NULL을 반환하지 않습니다. 다른 모든 표현식 서브 쿼리와 달리 열 목록에 대한 규칙이 없습니다. 열을 원하는 수만큼 선택할 수 있으며 쿼리 결과는 이에 영향을 받지 않습니다.

예시

표현식 서브 쿼리에 대한 다음 예시에서는 t.int_arrayARRAY<INT64> 유형이라고 가정합니다.

유형 서브 쿼리 결과 데이터 유형 참고
Scalar (SELECT COUNT(*) FROM t.int_array) INT64  
(SELECT DISTINCT i FROM t.int_array i) INT64, 런타임 오류 발생 가능  
(SELECT i FROM t.int_array i WHERE i=5) INT64, 런타임 오류 발생 가능  
(SELECT ARRAY_AGG(i) FROM t.int_array i) ARRAY ARRAY_AGG 집계 함수를 사용하여 ARRAY를 반환합니다.
(SELECT 'xxx' a) STRING  
(SELECT 'xxx' a, 123 b) 오류 둘 이상의 열이 있기 때문에 오류를 반환합니다.
(SELECT AS STRUCT 'xxx' a, 123 b) STRUCT  
(SELECT AS STRUCT 'xxx' a) STRUCT  
ARRAY ARRAY(SELECT COUNT(*) FROM t.int_array) 크기가 1인 ARRAY  
ARRAY(SELECT x FROM t) ARRAY  
ARRAY(SELECT 5 a, COUNT(*) b FROM t.int_array) 오류 둘 이상의 열이 있기 때문에 오류를 반환합니다.
ARRAY(SELECT AS STRUCT 5 a, COUNT(*) b FROM t.int_array) ARRAY  
ARRAY(SELECT AS STRUCT i FROM t.int_array i) ARRAY 필드가 1개인 여러 개의 STRUCT로 구성된 ARRAY를 만듭니다.
ARRAY(SELECT AS STRUCT 1 x, 2, 3 x) ARRAY 익명 또는 중복된 필드를 가진 여러 개의 STRUCT로 구성된 ARRAY를 반환합니다.
ARRAY(SELECT AS TypeName SUM(x) a, SUM(y) b, SUM(z) c from t) array<TypeName> 명명된 유형을 선택합니다. TypeName이 a, b, c 필드가 있는 STRUCT 유형이라고 가정합니다.
STRUCT (SELECT AS STRUCT 1 x, 2, 3 x) STRUCT 익명 또는 중복된 필드가 있는 STRUCT를 생성합니다.
EXISTS EXISTS(SELECT x,y,z FROM table WHERE y=z) BOOL  
NOT EXISTS(SELECT x,y,z FROM table WHERE y=z) BOOL  
IN x IN (SELECT y FROM table WHERE z) BOOL  
x NOT IN (SELECT y FROM table WHERE z) BOOL