SELECT

SELECT를 문으로 사용하거나 다른 문 내의 절로 사용할 수 있습니다.

  • 문으로서의 SELECT 문은 가장 일반적으로 실행되는 SQL 문으로, 데이터베이스를 쿼리하고 행 세트를 검색합니다.

  • 절로서의 SELECT는 쿼리에서 반환되는 열 세트를 정의합니다.

참고 항목:

쿼리 구문

구문

다음 섹션에서는 이 명령의 구문을 설명합니다.

모든 열 선택하기

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       [{<object_name>|<alias>}.]*

       [ ILIKE '<pattern>' ]

       [ EXCLUDE
         {
           <col_name> | ( <col_name>, <col_name>, ... )
         }
       ]

       [ REPLACE
         {
           ( <expr> AS <col_name> [ , <expr> AS <col_name>, ... ] )
         }
       ]

       [ RENAME
         {
           <col_name> AS <col_alias>
           | ( <col_name> AS <col_alias>, <col_name> AS <col_alias>, ... )
         }
       ]
Copy

SELECT * 뒤에는 다음 키워드 조합을 지정할 수 있습니다. 키워드는 아래에 표시된 순서대로 사용해야 합니다.

SELECT * ILIKE ... REPLACE ...
Copy
SELECT * ILIKE ... RENAME ...
Copy
SELECT * ILIKE ... REPLACE ... RENAME ...
Copy
SELECT * EXCLUDE ... REPLACE ...
Copy
SELECT * EXCLUDE ... RENAME ...
Copy
SELECT * EXCLUDE ... REPLACE ... RENAME ...
Copy
SELECT * REPLACE ... RENAME ...
Copy

특정 열 선택하기

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       {
         [{<object_name>|<alias>}.]<col_name>
         | [{<object_name>|<alias>}.]$<col_position>
         | <expr>
       }
       [ [ AS ] <col_alias> ]
       [ , ... ]
[ ... ]
Copy

문과 문 내에 있는 다른 절로서의 SELECT에 대한 자세한 내용은 쿼리 구문 섹션을 참조하십시오.

매개 변수

ALL | DISTINCT

결과 세트에서 중복 제거를 수행할지 여부를 지정합니다.

  • ALL 은 결과 세트의 모든 값을 포함합니다.

  • DISTINCT 는 결과 세트에서 중복 값을 제거합니다.

기본값: ALL

TOP n

반환할 최대 결과 수를 지정합니다. TOP <n> 섹션을 참조하십시오.

object_name 또는 . alias

FROM 절에 정의된 대로 오브젝트 식별자 또는 오브젝트 별칭을 지정합니다.

*

별표는 지정된 오브젝트의 모든 열을 출력에 포함하거나 * 가 오브젝트 이름이나 별칭으로 정규화되지 않은 경우 모든 오브젝트의 모든 열을 출력에 포함해야 한다는 점을 나타내기 위한 약칭입니다.

* 를 지정할 때 ILIKE, EXCLUDE, REPLACE, RENAME 을 지정할 수도 있습니다.

ILIKE 'pattern'

pattern 과 일치하는 열만 결과에 포함해야 하는 것으로 지정합니다.

pattern 에서 다음 SQL 와일드카드를 사용할 수 있습니다.

  • 단일 문자 일치는 밑줄(_)을 사용합니다.

  • 0개 이상의 문자 시퀀스 일치는 퍼센트 기호(%)를 사용합니다.

열 이름 내의 어느 곳이든 시퀀스를 일치시키려면 패턴을 % 로 시작하고 끝냅니다.

일치 검색에서는 대/소문자를 구분하지 않습니다.

지정된 패턴과 일치하는 열이 없으면 컴파일 오류가 발생합니다(001080 (42601): ... SELECT with no columns).

EXCLUDE col_name . EXCLUDE (col_name, col_name, ...)

결과에서 제외해야 하는 열을 지정합니다.

여러 테이블에서 선택하는 경우 SELECT table_name.* 을 사용하여 특정 테이블에서 모든 열을 선택하도록 지정하고 EXCLUDE 에 정규화되지 않은 열 이름을 지정합니다. 예:

SELECT table_a.* EXCLUDE column_in_table_a ,
  table_b.* EXCLUDE column_in_table_b
  ...
Copy
REPLACE (expr AS col_name [ , expr AS col_name, ...] )

col_name 의 값을 평가된 식 expr 의 값으로 바꿉니다.

예를 들어, department_id 열의 값 앞에 문자열 'DEPT-' 를 추가하려면 다음을 사용하십시오.

SELECT REPLACE ('DEPT-' || department_id AS department_id) ...
Copy

col_name 의 경우:

  • 이 열이 존재해야 하며 ILIKE 또는 EXCEPT 로 필터링할 수 없습니다.

  • 대체 목록에서 동일한 열을 두 번 이상 지정할 수 없습니다.

  • 열이 여러 테이블에 있는 경우(예: 조인의 두 테이블 모두) “ambiguous column” 오류로 인해 문이 실패합니다.

expr 은 단일 값으로 평가되어야 합니다.

RENAME col_name AS col_alias . RENAME (col_name AS col_alias, col_name AS col_alias, ...)

결과에 사용해야 하는 열 별칭을 지정합니다.

여러 테이블에서 선택하는 경우 SELECT table_name.* 을 사용하여 특정 테이블에서 모든 열을 선택하도록 지정하고 RENAME 에 정규화되지 않은 열 이름을 지정합니다. 예:

SELECT table_a.* RENAME column_in_table_a AS col_alias_a,
  table_b.* RENAME column_in_table_b AS col_alias_b
  ...
Copy

참고

SELECT * 뒤에 키워드 조합을 지정하는 경우:

  • ILIKEEXCLUDE 를 모두 지정할 수는 없습니다.

  • RENAME 또는 REPLACE 와 함께 EXCLUDE 를 지정하는 경우:

    • RENAME 또는 REPLACE 앞에 EXCLUDE 를 지정해야 합니다.

      SELECT * EXCLUDE col_a RENAME col_b AS alias_b ...
      
      Copy
      SELECT * EXCLUDE employee_id REPLACE ('DEPT-' || department_id AS department_id) ...
      
      Copy
    • EXCLUDERENAME 에 같은 열을 지정할 수 없습니다.

  • RENAME 또는 REPLACE 와 함께 ILIKE 를 지정하는 경우 먼저 ILIKE 를 지정해야 합니다.

    SELECT * ILIKE '%id%' RENAME department_id AS department ...
    
    Copy
    SELECT * ILIKE '%id%' REPLACE ('DEPT-' || department_id AS department_id) ...
    
    Copy
  • REPLACERENAME 을 지정하는 경우:

    • REPLACE 를 먼저 지정해야 합니다.

      SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME employee_id as employee ...
      
      Copy
    • REPLACERENAME 에 동일한 열 이름을 지정할 수 있습니다.

      SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id as department ...
      
      Copy
col_name

FROM 절에 정의된 대로 열 식별자를 지정합니다.

$col_position

FROM 절에 정의된 대로 열의 위치(1부터 시작)를 지정합니다. 테이블에서 열을 참조하는 경우 이 숫자는 테이블의 최대 열 수를 초과할 수 없습니다.

expr

수학 식과 같이, 주어진 행에 대한 특정 값으로 계산되는 식을 지정합니다.

[ AS ] col_alias

결과 식에 할당된 열 별칭을 지정합니다. 이것은 최상위 SELECT 목록에서 표시 이름으로 사용되고 인라인 뷰에서는 열 이름으로 사용됩니다.

쿼리에서 참조하는 다른 열의 이름과 동일한 열 별칭을 할당하지 마십시오. 예를 들어, prod_idproduct_id 라는 열을 선택하는 경우 prod_id 의 별칭을 product_id 로 지정하지 마십시오. 오류 사례: 다른 열 이름과 일치하는 별칭 지정하기 섹션을 참조하십시오.

FOR UPDATE 절 사용하기

선택적 FOR UPDATE 절을 사용하여 향후 업데이트 결과를 잠급니다.

SELECT ...
  FROM ...
  [ ... ]
  FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Copy

매개 변수

WAIT

정수는 이 문이 잠금 획득을 기다리는 최대 시간(초)을 지정합니다.

사용법 노트

참고

하이브리드 테이블은 READ COMMITTED 격리 수준을 지원하므로 FOR UPDATE 절은 읽기 안정성을 보장할 수 없습니다.

  • ID 만 있는 테이블 T 는 두 개의 튜플 5 및 10으로 시작합니다.

  • 트랜잭션 T1SELECT * FROM T WHERE ID < 20 FOR UPDATE 는 두 개의 튜플 5와 10을 반환하고 잠급니다.

    • 다른 트랜잭션 T2DELETE FROM T WHERE ID = 5T1 이 완료될 때까지 기다려야 합니다(커밋 또는 롤백).

  • 그러나 다른 트랜잭션 T3INSERT INTO T VALUES 12 가 완료될 수 있으며 T1 의 후속 SELECT * FROM T WHERE ID < 20 에는 5, 10, 12의 세 가지 튜플이 표시됩니다.

사용법 노트

  • 별칭과 식별자는 기본적으로 대/소문자를 구분하지 않습니다. 대/소문자를 유지하려면 큰따옴표(")로 묶으십시오. 자세한 내용은 오브젝트 식별자 섹션을 참조하십시오.

  • ORDER BY 절이 없으면 SELECT에서 반환하는 결과는 순서가 지정되지 않은 세트입니다. 같은 테이블에 대해 같은 쿼리를 반복적으로 실행하면 출력 순서가 매번 달라질 수 있습니다. 순서가 중요하다면 ORDER BY 절을 사용하십시오.

  • SELECT는 독립된 문으로 사용할 수 있을 뿐 아니라, 다른 문 내의 절로 사용할 수도 있습니다(예: INSERT INTO ... SELECT ...;). SELECT는 문 내의 하위 쿼리 에 사용할 수도 있습니다.

  • 많은 경우, 같은 쿼리의 다른 부분(JOIN, FROM, WHERE, GROUP BY, 기타 열 식 등)에서 식의 열 별칭(즉, expr AS col_alias)을 사용하면 식이 한 번만 계산됩니다.

    하지만 어떤 경우에는 식을 여러 번 계산할 수 있으므로 같은 쿼리의 다른 부분에서 별칭에 다른 값이 사용될 수 있습니다.

아래에 몇 가지 간단한 예가 나와 있습니다.

쿼리 구문 에 대한 자세한 설명을 비롯해, 설명서의 다른 부분에 많은 예가 추가로 포함되어 있습니다.

이벤트 테이블(이 테이블의 스키마는 Snowflake에 의해 사전 정의됨) 쿼리와 관련된 예제는 로깅된 메시지 데이터에 액세스하기추적 데이터에 액세스하기 섹션을 참조하십시오.

예제를 위한 데이터 설정하기

아래의 일부 쿼리에서는 다음 테이블과 데이터를 사용합니다.

CREATE TABLE employee_table (
    employee_ID INTEGER,
    last_name VARCHAR,
    first_name VARCHAR,
    department_ID INTEGER
    );

CREATE TABLE department_table (
    department_ID INTEGER,
    department_name VARCHAR
    );
Copy
INSERT INTO employee_table (employee_ID, last_name, first_name, department_ID) VALUES
    (101, 'Montgomery', 'Pat', 1),
    (102, 'Levine', 'Terry', 2),
    (103, 'Comstock', 'Dana', 2);

INSERT INTO department_table (department_ID, department_name) VALUES
    (1, 'Engineering'),
    (2, 'Customer Support'),
    (3, 'Finance');
Copy

모든 열을 선택하는 예제(SELECT *)

테이블의 모든 열 선택하기

이 예제에서는 employee_table 에서 모든 열을 선택하는 방법을 보여줍니다.

SELECT * FROM employee_table;
Copy
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
|         101 | Montgomery | Pat        |             1 |
|         102 | Levine     | Terry      |             2 |
|         103 | Comstock   | Dana       |             2 |
+-------------+------------+------------+---------------+

패턴과 일치하는 이름을 가진 모든 열 선택하기

이 예제에서는 id 가 포함된 이름을 가진 employee_table 에서 모든 열을 선택하는 방법을 보여줍니다.

SELECT * ILIKE '%id%' FROM employee_table;
Copy
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
|         101 |             1 |
|         102 |             2 |
|         103 |             2 |
+-------------+---------------+

한 열을 제외한 모든 열 선택하기

이 예제에서는 department_id 열을 제외한 employee_table 에서 모든 열을 선택하는 방법을 보여줍니다.

SELECT * EXCLUDE department_id FROM employee_table;
Copy
+-------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME |
|-------------+------------+------------|
|         101 | Montgomery | Pat        |
|         102 | Levine     | Terry      |
|         103 | Comstock   | Dana       |
+-------------+------------+------------+

두 개 이상의 열을 제외한 모든 열 선택하기

이 예제에서는 department_idemployee_id 열을 제외하고 employee_table 의 모든 열을 선택하는 방법을 보여줍니다.

SELECT * EXCLUDE (department_id, employee_id) FROM employee_table;
Copy
+------------+------------+
| LAST_NAME  | FIRST_NAME |
|------------+------------|
| Montgomery | Pat        |
| Levine     | Terry      |
| Comstock   | Dana       |
+------------+------------+

모든 열 선택 및 한 열의 이름 바꾸기

이 예제에서는 employee_table 에서 모든 열을 선택하고 department_id 열의 이름을 바꾸는 방법을 보여줍니다.

SELECT * RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
|         101 | Montgomery | Pat        |          1 |
|         102 | Levine     | Terry      |          2 |
|         103 | Comstock   | Dana       |          2 |
+-------------+------------+------------+------------+

모든 열 선택 및 여러 열 이름 바꾸기

이 예제에서는 employee_table 에서 모든 열을 선택하고 department_idemployee_id 열의 이름을 바꾸는 방법을 보여줍니다.

SELECT * RENAME (department_id AS department, employee_id AS id) FROM employee_table;
Copy
+-----+------------+------------+------------+
|  ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-----+------------+------------+------------|
| 101 | Montgomery | Pat        |          1 |
| 102 | Levine     | Terry      |          2 |
| 103 | Comstock   | Dana       |          2 |
+-----+------------+------------+------------+

모든 열 선택, 열 제외 및 여러 열 이름 바꾸기

이 예제에서는 employee_table 에서 모든 열을 선택하고 first_name 열을 제외하고 department_idemployee_id 열의 이름을 바꾸는 방법을 보여줍니다.

SELECT * EXCLUDE first_name RENAME (department_id AS department, employee_id AS id) FROM employee_table;
Copy
+-----+------------+------------+
|  ID | LAST_NAME  | DEPARTMENT |
|-----+------------+------------|
| 101 | Montgomery |          1 |
| 102 | Levine     |          2 |
| 103 | Comstock   |          2 |
+-----+------------+------------+

패턴과 일치하는 이름을 가진 모든 열 선택 및 열 이름 바꾸기

이 예제에서는 id 가 포함된 이름을 가진 employee_table 에서 모든 열을 선택하고 department_id 열의 이름을 바꾸는 방법을 보여줍니다.

SELECT * ILIKE '%id%' RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+
| EMPLOYEE_ID | DEPARTMENT |
|-------------+------------|
|         101 |          1 |
|         102 |          2 |
|         103 |          2 |
+-------------+------------+

모든 열 선택 및 열의 값 바꾸기

이 예제에서는 employee_table 의 모든 열을 선택하고 department_id 열의 값을 앞에 DEPT- 가 붙은 ID로 바꾸는 방법을 보여줍니다.

SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM employee_table;
Copy
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
|         101 | Montgomery | Pat        | DEPT-1        |
|         102 | Levine     | Terry      | DEPT-2        |
|         103 | Comstock   | Dana       | DEPT-2        |
+-------------+------------+------------+---------------+

모든 열 선택, 열의 값 바꾸기, 열 이름 바꾸기

이 예제에서는 employee_table 의 모든 열을 선택하고 department_id 열의 값을 앞에 DEPT- 가 붙은 ID로 바꾸고 열의 이름을 바꾸는 방법을 보여줍니다.

SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
|         101 | Montgomery | Pat        | DEPT-1     |
|         102 | Levine     | Terry      | DEPT-2     |
|         103 | Comstock   | Dana       | DEPT-2     |
+-------------+------------+------------+------------+

패턴과 일치하는 이름을 가진 모든 열 선택 및 열의 값 바꾸기

이 예제에서는 id 가 포함된 이름을 가진 employee_table 에서 모든 열을 선택하고 department_id 열의 값 앞에 DEPT- 를 추가하는 방법을 보여줍니다.

SELECT * ILIKE '%id%' REPLACE('DEPT-' || department_id AS department_id) FROM employee_table;
Copy
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
|         101 | DEPT-1        |
|         102 | DEPT-2        |
|         103 | DEPT-2        |
+-------------+---------------+

여러 테이블에서 모든 열 선택, 열 제외, 열 이름 바꾸기

이 예에서는 두 테이블을 조인하고 employee_table 에서 한 열을 제외하고 두 테이블에서 모든 열을 선택합니다. 또한 이 예에서는 department_table 에서 선택한 열 중 하나의 이름을 바꿉니다.

SELECT
  employee_table.* EXCLUDE department_id,
  department_table.* RENAME department_name AS department
FROM employee_table INNER JOIN department_table
  ON employee_table.department_id = department_table.department_id
ORDER BY department, last_name, first_name;
Copy
+-------------+------------+------------+---------------+------------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID | DEPARTMENT       |
|-------------+------------+------------+---------------+------------------|
|         103 | Comstock   | Dana       |             2 | Customer Support |
|         102 | Levine     | Terry      |             2 | Customer Support |
|         101 | Montgomery | Pat        |             1 | Engineering      |
+-------------+------------+------------+---------------+------------------+

특정 열을 선택하는 예제(SELECT colname)

이름으로 단일 열 선택하기

다음은 직원의 ID를 알고 있는 경우 직원의 성을 조회하는 방법을 보여주는 예입니다.

SELECT last_name FROM employee_table WHERE employee_ID = 101;
+------------+
| LAST_NAME  |
|------------|
| Montgomery |
+------------+
Copy

조인된 테이블에서 이름으로 여러 열 선택하기

다음은 각 직원과 각 직원이 근무하는 부서의 이름을 나열하는 예입니다. 부서명 순으로 출력되며, 각 부서 내에서 직원은 이름순으로 정렬됩니다. 이 쿼리는 조인을 사용해 한 테이블의 정보를 다른 테이블의 정보와 관련시킵니다.

SELECT department_name, last_name, first_name
    FROM employee_table INNER JOIN department_table
        ON employee_table.department_ID = department_table.department_ID
    ORDER BY department_name, last_name, first_name;
+------------------+------------+------------+
| DEPARTMENT_NAME  | LAST_NAME  | FIRST_NAME |
|------------------+------------+------------|
| Customer Support | Comstock   | Dana       |
| Customer Support | Levine     | Terry      |
| Engineering      | Montgomery | Pat        |
+------------------+------------+------------+
Copy

위치로 열 선택하기

다음은 $ 를 사용해 열 이름이 아닌 열 번호로 열을 지정하는 방법을 보여주는 예입니다.

SELECT $2 FROM employee_table ORDER BY $2;
+------------+
| $2         |
|------------|
| Comstock   |
| Levine     |
| Montgomery |
+------------+
Copy

출력에서 열의 별칭 지정하기

다음은 FROM 절의 테이블에서 직접 출력 열을 가져올 필요가 없음을 보여주는 예로, 출력 열은 일반 식이 될 수 있습니다. 이 예에서는 반지름이 2.0인 원의 면적을 계산합니다. 또한, 출력에 의미 있는 열 이름이 포함되도록 열 별칭을 사용하는 방법도 보여줍니다.

SELECT pi() * 2.0 * 2.0 AS area_of_circle;
+----------------+
| AREA_OF_CIRCLE |
|----------------|
|   12.566370614 |
+----------------+
Copy

오류 사례: 다른 열 이름과 일치하는 별칭 지정하기

이 예에서는 쿼리에 사용되는 다른 열의 이름과 일치하는 열 별칭을 사용하지 않는 것이 좋은 이유를 보여줍니다. 이 GROUP BY 쿼리는 모호한 열 오류가 아닌 SQL 컴파일러 오류를 발생시킵니다. table1product_id 에 할당된 별칭 prod_idtable2prod_id 열 이름과 일치합니다. 이 오류에 대한 가장 간단한 해결책은 열에 다른 별칭을 지정하는 것입니다.

CREATE OR REPLACE TABLE table1 (product_id NUMBER);

CREATE OR REPLACE TABLE table2 (prod_id NUMBER);

SELECT t1.product_id AS prod_id, t2.prod_id
  FROM table1 AS t1 JOIN table2 AS t2
    ON t1.product_id=t2.prod_id
  GROUP BY prod_id, t2.prod_id;
Copy
001104 (42601): SQL compilation error: error line 1 at position 7
'T1.PRODUCT_ID' in select clause is neither an aggregate nor in the group by clause.