Amazon Simple Storage Service
개발자 안내서 (API 버전 2006-03-01)

SELECT 명령

Amazon S3 Select와 Glacier Select는 SELECT SQL 명령만 지원합니다. SELECT에서 지원되는 ANSI 표준 절은 다음과 같습니다.

  • SELECT 계정의

  • FROM

  • WHERE

  • LIMIT 절(Amazon S3 Select만 해당)

참고

Amazon S3 Select와 Glacier Select 쿼리는 현재 하위 쿼리 또는 조인을 지원하지 않습니다.

목록 SELECT

SELECT 목록은 쿼리에서 반환하려는 열, 함수 및 표현식의 이름을 지정합니다. 목록은 쿼리의 출력을 나타냅니다.

SELECT * SELECT projection [ AS column_alias | column_alias ] [, ...]

*(별표)가 있는 첫 번째 형식은 WHERE 절을 통과한 모든 행을 그대로 반환합니다. 두 번째 형식은 각 열마다 사용자 정의 출력 스칼라 표현식 투영이 포함된 행을 생성합니다.

FROM 절

Amazon S3 Select와 Glacier Select는 다음 형식의 FROM 절을 지원합니다.

FROM table_name FROM table_name alias FROM table_name AS alias

여기서 table_name은 쿼리되는 아카이브를 참조하는 S3Object(Amazon S3 Select의 경우) 또는 ARCHIVE 또는 OBJECT(Glacier Select의 경우) 중 하나입니다. 기존의 관계형 데이터베이스를 사용해오던 사용자의 경우, 이것을 단일 테이블에 대해 다수의 보기를 포함하는 데이터베이스 스키마로 생각할 수 있습니다.

표준 SQL에 따라 FROM 절은 WHERE 절에서 필터링되고 SELECT 목록에서 예상되는 행을 생성합니다.

Amazon S3 Select에 저장된 JSON 객체에 대해 다음과 같은 FROM 절 양식도 사용할 수 있습니다.

FROM S3Object[*].path FROM S3Object[*].path alias FROM S3Object[*].path AS alias

이 양식의 FROM 절을 사용하면 JSON 객체 내에서 배열 또는 객체를 선택할 수 있습니다. 다음 양식 중 하나를 사용하여 path를 지정할 수 있습니다.

  • 이름별(객체 내): .name 또는 ['name']

  • 인덱스로(배열 내): [index]

  • 와일드카드(객체 내): .*

  • 와일드카드(배열 내): [*]

참고

  • 이 양식의 FROM 절은 JSON 객체에만 사용할 수 있습니다.

  • 와일드카드는 항상 하나 이상의 레코드를 출력합니다. 일치하는 레코드가 없을 경우 Amazon S3 Select가 MISSING 값을 출력합니다. 출력 직렬화 도중(쿼리 완료 후), Amazon S3 Select가 MISSING 값을 빈 레코드로 대체합니다.

  • 집계 함수(AVG, COUNT, MAX, MINSUM)는 MISSING 값을 건너뜁니다.

  • 와일드카드를 사용할 때 별칭을 제공하지 않는 경우 경로의 마지막 요소를 사용하여 행을 참조할 수 있습니다. 예를 들어 SELECT price FROM S3Object[*].books[*].price 쿼리를 사용하여 서적 목록에서 모든 가격을 선택할 수 있습니다. 경로가 이름이 아니라 와일드카드로 끝날 경우 값 _1을 사용하여 행을 참조할 수 있습니다. 예를 들면 SELECT price FROM S3Object[*].books[*].price 대신 SELECT _1.price FROM S3Object[*].books[*]를 사용할 수 있습니다.

  • Amazon S3 Select는 항상 JSON 문서를 루트 레벨 값의 배열로 취급합니다. 따라서 쿼리하는 JSON 객체가 하나의 루트 요소만 가지더라도 FROM 절이 S3Object[*]로 시작해야 합니다. 하지만 호환성 때문에 Amazon S3 Select는 사용자가 경로를 포함하지 않을 경우 와일드카드를 생략하도록 허용합니다. 따라서 전체 절 FROM S3ObjectFROM S3Object[*] as S3Object와 같습니다. 경로를 포함하는 경우에는 와일드카드도 사용해야 합니다. 그러므로 FROM S3ObjectFROM S3Object[*].path는 모두 유효한 절이지만, FROM S3Object.path는 유효하지 않습니다.

예제:

예제 #1

이 예제에서는 다음 데이터 세트 및 쿼리를 사용한 결과를 보여 줍니다.

{ "Rules": [ {"id": "id-1", "condition": "x < 20"}, {"condition": "y > x"}, {"id": "id-2", "condition": "z = DEBUG"} ] }, { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"id-1"}, {}, {"id":"id-2"}, {}

Amazon S3 Select가 각 결과를 반환한 이유는 다음과 같습니다.

  • {"id":"id-1"} – S3Object0.Rules0.id는 일치하는 레코드가 1개 있습니다.

  • {} – S3Object0.Rules1.id는 일치하는 레코드가 없으므로 Amazon S3 Select가 MISSING을 출력했습니다. 이 값은 출력 직렬화 과정에서 빈 레코드로 변환 후 반환되었습니다.

  • {"id":"id-2"} – S3Object0.Rules2.id는 일치하는 레코드가 1개 있습니다.

  • {} – S3Object1는 Rules에서 일치하는 레코드가 없으므로 Amazon S3 Select가 MISSING을 출력했습니다. 이 값은 출력 직렬화 과정에서 빈 레코드로 변환 후 반환되었습니다.

Amazon S3 Select가 일치 레코드를 찾지 못할 경우 빈 레코드를 반환하지 않게 하려면 값 MISSING에 대해 테스트할 수 있습니다. 다음 쿼리는 이전 쿼리와 동일한 결과를 반환하지만 빈 값이 생략되었습니다.

SELECT id FROM S3Object[*].Rules[*].id WHERE id IS NOT MISSING
{"id":"id-1"}, {"id":"id-2"}

예제 #2

이 예제에서는 다음 데이터 세트 및 쿼리를 사용한 결과를 보여 줍니다.

{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "AWS S3" }, { "created": "936864000", "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ], "owner": "User" }
SELECT d.dir_name, d.files FROM S3Object[*] d
{ "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ] }, { "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ] }
SELECT _1.dir_name, _1.owner FROM S3Object[*]
{ "dir_name": "important_docs", "owner": "AWS S3" }, { "dir_name": "other_docs", "owner": "User" }

WHERE 절

WHERE 절은 다음 구문에 따릅니다.

WHERE condition

WHERE 절은 조건에 기반하여 행을 필터링합니다. 조건은 부울 결과가 있는 표현식입니다. 조건이 TRUE로 평가되는 행만이 결과에서 반환됩니다.

LIMIT 절(Amazon S3 Select만 해당)

LIMIT 절은 다음 구문에 따릅니다.

LIMIT number

LIMIT 절은 쿼리가 반환하게 할 레코드의 수를 숫자에 기초하여 제한합니다.

참고

Glacier Select는 LIMIT 절을 지원하지 않습니다.

속성 액세스

SELECTWHERE 절은 쿼리되는 파일이 CSV 형식인지 JSON 형식인지에 따라 다음 단원에서 소개하는 메서드 중 하나를 사용하여 레코드 데이터를 참조할 수 있습니다.

CSV

  • 열 번호 – 열 이름 _N으로 특정 행의 N번째 열을 참조할 수 있습니다(여기서 N은 열의 위치입니다). 위치 카운트는 1에서 시작합니다. 예를 들어, 첫 번째 열의 이름은 _1이고, 두 번째 열의 이름은 _2입니다.

    열을 _N 또는 alias._N이라고 부를 수 있습니다. 예를 들어, _2myAlias._2는 모두 SELECT 목록과 WHERE 절에 있는 열을 참조하는 유효한 방법입니다.

  • 열 머리글 – 머리글이 있는 CSV 형식의 객체들은 그 머리글이 SELECT 목록과 WHERE 절에 제공됩니다. 특히 기존의 SQL과 같이, SELECTWHERE 절 표현식에서 alias.column_name 또는 column_name으로 열을 참조할 수 있습니다.

JSON(Amazon S3 Select만 해당)

  • 문서alias.name으로 JSON 문서 필드에 액세스할 수 있습니다. 중첩 필드에도 액세스할 수 있습니다(예: alias.name1.name2.name3).

  • 목록[] 연산자가 있는 0 기반 인덱스를 사용하여 JSON 목록의 요소들에 액세스할 수 있습니다. 예를 들어, 목록의 두 번째 요소에 alias[1]로 액세스할 수 있습니다. 목록 요소에 대한 액세스를 alias.name1.name2[1].name3의 필드와 결합할 수 있습니다.

  • 예제: 이 JSON 객체를 샘플 데이터 세트로 간주합니다.

    {"name": "Susan Smith", "org": "engineering", "projects": [ {"project_name":"project1", "completed":false}, {"project_name":"project2", "completed":true} ] }

    예제 #1

    다음 쿼리는 다음과 같은 결과를 반환합니다.

    Select s.name from S3Object s
    {"name":"Susan Smith"}

    예제 #2

    다음 쿼리는 다음과 같은 결과를 반환합니다.

    Select s.projects[0].project_name from S3Object s
    {"project_name":"project1"}

머리글/속성 이름의 대/소문자 구분

Amazon S3 Select와 Glacier Select에서 큰 따옴표를 사용하여 열 머리글(CSV 객체)과 속성(JSON 객체)이 대/소문자를 구분한다는 것을 표시할 수 있습니다. 큰 따옴표가 없으면 객체 머리글/속성이 대/소문자를 구분하지 않는 것입니다. 모호한 경우에는 오류가 발생합니다.

다음 예제는 1) 열 머리글이 지정되어 있고 쿼리 요청에 대해 FileHeaderInfo가 "Use(사용)"로 설정되어 있는 CSV 형식의 하나의 Amazon S3 또는 Glacier 객체, 또는 2) 속성이 지정된 JSON 형식의 하나의 Amazon S3 객체입니다.

예제 #1: 쿼리되는 객체가 머리글/속성 "NAME"을 갖습니다.

  • 다음 표현식은 객체에서 값을 성공적으로 반환합니다(따옴표 없음: 대/소문자를 구분하지 않음).

    SELECT s.name from S3Object s
  • 다음 표현식의 결과는 400 오류 MissingHeaderName입니다(따옴표: 대/소문자를 구분함).

    SELECT s."name" from S3Object s

예제 #2: 쿼리되는 Amazon S3 객체가 "NAME"이라는 한 머리글/속성과 "name"이라는 또 다른 머리글/속성을 갖습니다.

  • 다음 표현식의 결과는 400 오류 AmbiguousFieldName입니다(따옴표 없음: 대/소문자를 구분하지 않으나 일치하는 것이 2개가 있음).

    SELECT s.name from S3Object s
  • 다음 표현식은 객체에서 값을 성공적으로 반환합니다(따옴표: 대/소문자를 구분하므로 모호함이 해결됨).

    SELECT s."NAME" from S3Object s

예약어를 사용자 정의 용어로 사용

Amazon S3 Select와 Glacier Select에는 객체 콘텐츠를 쿼리하는 데 사용되는 SQL 표현식을 실행하기 위해 필요한 일련의 예약어가 있습니다. 예약어에는 함수 이름, 데이터 유형, 연산자 등이 포함됩니다. 어떤 경우에는 열 머리글(CSV 파일의 경우)이나 속성(JSON 객체의 경우) 같은 사용자 정의 용어가 예약어와 충돌할 수가 있습니다. 이 경우에는 예약어와 충돌하는 사용자 정의 용어를 일부러 사용하고 있다는 것을 큰 따옴표를 사용하여 표시해야 합니다. 이렇게 하지 않으면 400 구문 분석 오류가 발생할 것입니다.

예약어의 전체 목록은 예약어 단원을 참조하십시오.

다음의 예제는 1) 열 머리글이 지정되어 있고 쿼리 요청에 대해 FileHeaderInfo가 "Use(사용)"로 설정되어 있는 CSV 형식의 하나의 Amazon S3 또는 Glacier 객체, 또는 2) 속성이 지정된 JSON 형식의 하나의 Amazon S3 객체입니다.

예제: 쿼리되는 객체가 "CAST"(예약어임)라는 머리글/속성을 갖습니다.

  • 다음 표현식은 객체에서 값을 성공적으로 반환합니다(따옴표: 사용자 정의 머리글/속성을 사용함).

    SELECT s."CAST" from S3Object s
  • 다음 표현식의 결과는 400 구문 분석 오류입니다(따옴표 없음: 예약어와 충돌함).

    SELECT s.CAST from S3Object s

스칼라 표현식

WHERE 절과 SELECT 목록 내에서 스칼라 값을 반환하는 표현식인 SQL 스칼라 표현식을 사용할 수 있습니다. 스칼라 표현식의 형식은 다음과 같습니다.

  • literal

    SQL 리터럴.

  • column_reference

    column_name 또는 alias.column_name 형식의 열에 대한 참조.

  • unary_op 표현식

    여기서 unary_op 단항은 SQL 단항 연산자입니다.

  • 표현식 binary_op 표현식

    여기서 binary_op는 SQL 이항 연산자입니다.

  • func_name

    여기서 func_name은 호출할 스칼라 함수의 이름입니다.

  • 표현식 [ NOT ] BETWEEN 표현식 AND 표현식

  • 표현식 LIKE 표현식 [ ESCAPE 표현식 ]