기본 SQL 질의

기본 SQL 질의 (Basic SQL queries)

SELECT 절을 FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT과 함께 사용해 데이터를 검색하고 집계해요.

이 중 SELECT와 FROM은 필수인데, 가져올 필드와 그 필드를 가져올 인덱스를 지정하기 때문이에요. 다른 모든 절은 선택 사항이라 필요에 따라 사용하면 돼요.

출처: 문서

본문

문법 (Syntax)

데이터를 검색하고 집계하는 전체 문법은 다음과 같아요.

SELECT [DISTINCT] (* | expression) [[AS] alias] [, ...]
FROM index_name
[WHERE predicates]
[GROUP BY expression [, ...]
 [HAVING predicates]]
[ORDER BY expression [IS [NOT] NULL] [ASC | DESC] [, ...]]
[LIMIT [offset, ] size]

기본 요소 (Fundamentals)

SQL의 미리 정의된 키워드 외에 가장 기본적인 요소는 리터럴과 식별자예요. 리터럴은 숫자, 문자열, 날짜, 또는 Boolean 상수예요. 식별자는 OpenSearch 인덱스나 필드 이름이에요. 산술 연산자와 SQL 함수를 사용해 리터럴과 식별자로 복잡한 표현식을 만들 수 있어요.

Rule expressionAtom:

표현식은 다시 논리 연산자로 결합해 조건(predicate)이 될 수 있어요. WHERE와 HAVING 절에서 조건을 사용해 특정 조건으로 데이터를 필터링하세요.

Rule expression:

Rule predicate:

실행 순서 (Execution order)

이 SQL 절들은 표시된 순서와는 다른 순서로 실행돼요.

FROM index
 WHERE predicates
  GROUP BY expressions
   HAVING predicates
    SELECT expressions
     ORDER BY expressions
      LIMIT size

Select

검색할 필드를 지정해요.

문법 (Syntax)

Rule selectElements:

Rule selectElement:

예시 1: *를 사용해 인덱스의 모든 필드를 검색해요.

SELECT *
FROM accounts
account_number firstname gender city balance employer state email address lastname age
1 Amber M Brogan 39225 Pyrami IL [email protected] 880 Holmes Lane Duke 32
16 Hattie M Dante 5686 Netagy TN [email protected] 671 Bristol Street Bond 36
13 Nanette F Nogal 32838 Quility VA [email protected] 789 Madison Street Bates 28
18 Dale M Orick 4180 MD [email protected] 467 Hutchinson Court Adams 33

예시 2: 필드 이름을 사용해 특정 필드만 검색해요.

SELECT firstname, lastname
FROM accounts
firstname lastname
Amber Duke
Hattie Bond
Nanette Bates
Dale Adams

예시 3: 필드 이름 대신 필드 별칭(alias)을 사용해요. 필드 별칭은 필드 이름을 더 읽기 쉽게 만들기 위해 사용돼요.

SELECT account_number AS num
FROM accounts

| num :— | 1 | 6 | 13 | 18

예시 4: DISTINCT 절을 사용해 고유한 필드 값만 반환받아요. 하나 이상의 필드 이름을 지정할 수 있어요.

SELECT DISTINCT age
FROM accounts

| age :— | 28 | 32 | 33 | 36

From

검색할 인덱스를 지정해요. FROM 절 안에 서브쿼리를 지정할 수도 있어요.

문법 (Syntax)

Rule tableName:

예시 1: 인덱스 별칭을 사용해 인덱스들을 질의해요. 인덱스 별칭에 대해 알아보려면 Index Alias를 참고하세요. 이 샘플 질의에서 acc는 accounts 인덱스의 별칭이에요.

SELECT account_number, accounts.age
FROM accounts

또는

SELECT account_number, acc.age
FROM accounts acc
account_number age
1 32
6 36
13 28
18 33

예시 2: 인덱스 패턴을 사용해 특정 패턴과 일치하는 인덱스를 질의해요.

SELECT account_number
FROM account*

| account_number :— | 1 | 6 | 13 | 18

Where

결과를 필터링할 조건을 지정해요.

Operators Behavior
= 같음.
<> 같지 않음.
> 보다 큼.
< 보다 작음.
>= 크거나 같음.
<= 작거나 같음.
IN 여러 OR 연산자를 지정해요.
BETWEEN 범위 질의와 비슷해요. 범위 질의에 대한 자세한 내용은 Range query를 참고하세요.
LIKE 전체 텍스트 검색에 사용해요. 전체 텍스트 질의에 대한 자세한 내용은 Full-text queries를 참고하세요.
IS NULL 필드 값이 NULL인지 확인해요.
IS NOT NULL 필드 값이 NOT NULL인지 확인해요.

비교 연산자(=, <>, >, >=, <, <=)를 Boolean 연산자 NOT, AND, 또는 OR과 결합해 더 복잡한 표현식을 만들 수 있어요.

예시 1: 숫자, 문자열, 또는 날짜에 비교 연산자를 사용해요.

SELECT account_number
FROM accounts
WHERE account_number = 1
account_number
1

예시 2: OpenSearch는 유연한 스키마를 허용하므로 인덱스의 문서들이 서로 다른 필드를 가질 수 있어요. IS NULL 또는 IS NOT NULL을 사용해 누락된 필드나 존재하는 필드만 검색해요. OpenSearch는 누락된 필드와 명시적으로 NULL로 설정된 필드를 구분하지 않아요.

SELECT account_number, employer
FROM accounts
WHERE employer IS NULL
account_number employer
18

예시 3: WHERE 절의 조건을 만족하는 문서를 삭제해요.

DELETE FROM accounts
WHERE age > 30

GROUP BY

같은 필드 값을 가진 문서들을 버킷으로 그룹화해요.

예시 1: 필드로 그룹화해요.

SELECT age
FROM accounts
GROUP BY age
id age
0 28
1 32
2 33
3 36

예시 2: 필드 별칭으로 그룹화해요.

SELECT account_number AS num
FROM accounts
GROUP BY num
id num
0 1
1 6
2 13
3 18

예시 4: GROUP BY 절에서 스칼라 함수를 사용해요.

SELECT ABS(age) AS a
FROM accounts
GROUP BY ABS(age)
id a
0 28.0
1 32.0
2 33.0
3 36.0

Having

HAVING 절을 사용해 집계 함수(COUNT, AVG, SUM, MIN, MAX)를 기반으로 각 버킷 안에서 집계해요. HAVING 절은 GROUP BY 절의 결과를 필터링해요.

예시 1:

SELECT age, MAX(balance)
FROM accounts
GROUP BY age HAVING MIN(balance) > 10000
id age MAX (balance)
0 28 32838
1 32 39225

ORDER BY

ORDER BY 절을 사용해 결과를 원하는 순서로 정렬해요.

예시 1: ORDER BY를 사용해 오름차순 또는 내림차순으로 정렬해요. 일반 필드 이름 외에도 ordinal, alias, 또는 scalar 함수를 사용할 수 있어요.

SELECT account_number
FROM accounts
ORDER BY account_number DESC
account_number
18
13
6
1

예시 2: 필드가 누락된 문서들을 결과의 앞이나 뒤에 놓을지 지정해요. OpenSearch의 기본 동작은 null이나 누락된 필드를 끝에 반환하는 것이에요. 이들을 null이 아닌 값보다 앞으로 보내려면 IS NOT NULL 연산자를 사용하세요.

SELECT employer
FROM accounts
ORDER BY employer IS NOT NULL
employer
Netagy
Pyrami
Quility

Limit

검색할 최대 문서 수를 지정해요. 대용량 데이터를 메모리로 가져오는 것을 방지하는 데 사용돼요.

예시 1: 단일 인자를 전달하면 OpenSearch에서 size 파라미터로 매핑되고 from 파라미터는 0으로 설정돼요.

SELECT account_number
FROM accounts
ORDER BY account_number LIMIT 1
account_number
1

예시 2: 두 인자를 전달하면 첫 번째는 OpenSearch의 from 파라미터로, 두 번째는 size 파라미터로 매핑돼요. 작은 인덱스의 간단한 페이지네이션에 사용할 수 있어요. 큰 인덱스에는 비효율적이에요. 페이지 간 동일한 순서를 보장하려면 ORDER BY를 사용하세요.

SELECT account_number
FROM accounts
ORDER BY account_number LIMIT 1, 1
account_number
6

더 알아보기 (Learn more)