SELECT¶
SELECT를 문으로 사용하거나 다른 문 내의 절로 사용할 수 있습니다.
문으로서의 SELECT 문은 가장 일반적으로 실행되는 SQL 문으로, 데이터베이스를 쿼리하고 행 세트를 검색합니다.
절로서의 SELECT는 쿼리에서 반환되는 열 세트를 정의합니다.
- 참고 항목:
구문¶
다음 섹션에서는 이 명령의 구문을 설명합니다.
Selecting All Columns¶
[ ... ]
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>, ... )
}
]
SELECT * 뒤에는 다음 키워드 조합을 지정할 수 있습니다. 키워드는 아래에 표시된 순서대로 사용해야 합니다.
SELECT * ILIKE ... REPLACE ...
SELECT * ILIKE ... RENAME ...
SELECT * ILIKE ... REPLACE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ...
SELECT * EXCLUDE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ... RENAME ...
SELECT * REPLACE ... RENAME ...
Selecting Specific Columns¶
[ ... ]
SELECT [ { ALL | DISTINCT } ]
[ TOP <n> ]
{
[{<object_name>|<alias>}.]<col_name>
| [{<object_name>|<alias>}.]$<col_position>
| <expr>
}
[ [ AS ] <col_alias> ]
[ , ... ]
[ ... ]
문과 문 내에 있는 다른 절로서의 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 ...
REPLACE (expr AS col_name [ , expr AS col_name, ...] )
col_name
의 값을 평가된 식expr
의 값으로 바꿉니다.예를 들어,
department_id
열의 값 앞에 문자열'DEPT-'
를 추가하려면 다음을 사용하십시오.SELECT REPLACE ('DEPT-' || department_id AS department_id) ...
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 ...
참고
SELECT *
뒤에 키워드 조합을 지정하는 경우:ILIKE
와EXCLUDE
를 모두 지정할 수는 없습니다.RENAME
또는REPLACE
와 함께EXCLUDE
를 지정하는 경우:RENAME
또는REPLACE
앞에EXCLUDE
를 지정해야 합니다.SELECT * EXCLUDE col_a RENAME col_b AS alias_b ...
SELECT * EXCLUDE employee_id REPLACE ('DEPT-' || department_id AS department_id) ...
EXCLUDE
와RENAME
에 같은 열을 지정할 수 없습니다.
RENAME
또는REPLACE
와 함께ILIKE
를 지정하는 경우 먼저ILIKE
를 지정해야 합니다.SELECT * ILIKE '%id%' RENAME department_id AS department ...
SELECT * ILIKE '%id%' REPLACE ('DEPT-' || department_id AS department_id) ...
REPLACE
및RENAME
을 지정하는 경우:REPLACE
를 먼저 지정해야 합니다.SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME employee_id as employee ...
REPLACE
및RENAME
에 동일한 열 이름을 지정할 수 있습니다.SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id as department ...
col_name
FROM 절에 정의된 대로 열 식별자를 지정합니다.
$col_position
FROM 절에 정의된 대로 열의 위치(1부터 시작)를 지정합니다. 테이블에서 열을 참조하는 경우 이 숫자는 테이블의 최대 열 수를 초과할 수 없습니다.
expr
수학 식과 같이, 주어진 행에 대한 특정 값으로 계산되는 식을 지정합니다.
[ AS ] col_alias
결과 식에 할당된 열 별칭을 지정합니다. 이것은 최상위 SELECT 목록에서 표시 이름으로 사용되고 인라인 뷰에서는 열 이름으로 사용됩니다.
쿼리에서 참조하는 다른 열의 이름과 동일한 열 별칭을 할당하지 마십시오. 예를 들어,
prod_id
및product_id
라는 열을 선택하는 경우prod_id
의 별칭을product_id
로 지정하지 마십시오. Error Case: Specifying an Alias That Matches Another Column Name 섹션을 참조하십시오.
Using the FOR UPDATE clause¶
Lock the results for future updates using the optional FOR UPDATE clause.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
매개 변수¶
WAIT
An integer specifies the maximum time (in seconds) this statement waits on acquiring locks.
Usage Notes¶
FOR UPDATE
should be the last clause in theSELECT
statement.FOR UPDATE
cannot be used in a subquery.NOWAIT
is the default option ifNOWAIT
orWAIT
is not specified.FOR UPDATE
clause is not compatible with following features:Use of multiple tables.
참고
Since hybrid tables support READ COMMITTED
isolation level, FOR UPDATE
clauses cannot guarantee read stability.
A table
T
with only columnID
starts with two tuples: 5 and 10.SELECT * FROM T WHERE ID < 20 FOR UPDATE
in transactionT1
would return two tuples 5 and 10 and lock them.DELETE FROM T WHERE ID = 5
from another transactionT2
has to wait untilT1
completes (commit or rollback).
However,
INSERT INTO T VALUES 12
in another transactionT3
can complete, and a subsequentSELECT * FROM T WHERE ID < 20
inT1
will see three tuples: 5, 10, and 12.
Usage Notes¶
별칭과 식별자는 기본적으로 대/소문자를 구분하지 않습니다. 대/소문자를 유지하려면 큰따옴표(
"
)로 묶으십시오. 자세한 내용은 오브젝트 식별자 섹션을 참조하십시오.ORDER BY 절이 없으면 SELECT에서 반환하는 결과는 순서가 지정되지 않은 세트입니다. 같은 테이블에 대해 같은 쿼리를 반복적으로 실행하면 출력 순서가 매번 달라질 수 있습니다. 순서가 중요하다면
ORDER BY
절을 사용하십시오.SELECT는 독립된 문으로 사용할 수 있을 뿐 아니라, 다른 문 내의 절로 사용할 수도 있습니다(예:
INSERT INTO ... SELECT ...;
). SELECT는 문 내의 하위 쿼리 에 사용할 수도 있습니다.많은 경우, 같은 쿼리의 다른 부분(JOIN, FROM, WHERE, GROUP BY, 기타 열 식 등)에서 식의 열 별칭(즉,
expr AS col_alias
)을 사용하면 식이 한 번만 계산됩니다.하지만 어떤 경우에는 식을 여러 번 계산할 수 있으므로 같은 쿼리의 다른 부분에서 별칭에 다른 값이 사용될 수 있습니다.
예¶
아래에 몇 가지 간단한 예가 나와 있습니다.
쿼리 구문 에 대한 자세한 설명을 비롯해, 설명서의 다른 부분에 많은 예가 추가로 포함되어 있습니다.
이벤트 테이블(이 테이블의 스키마는 Snowflake에 의해 사전 정의됨) 쿼리와 관련된 예제는 로깅된 메시지 데이터에 액세스하기 및 추적 데이터에 액세스하기 섹션을 참조하십시오.
Setting Up the Data for the Examples¶
아래의 일부 쿼리에서는 다음 테이블과 데이터를 사용합니다.
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 );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');
Examples of Selecting All Columns (SELECT *)¶
Selecting All Columns With Names That Match a Pattern and Renaming a Column
Selecting All Columns, Excluding a Column, and Renaming Multiple Columns
Selecting All Columns, Replacing the Value of a Column, and Renaming the Column
Selecting All Columns With Names That Match a Pattern and Replacing the Value in a Column
Selecting All Columns From Multiple Tables, Excluding a Column, and Renaming a Column
Selecting All Columns in the Table¶
이 예제에서는 employee_table
에서 모든 열을 선택하는 방법을 보여줍니다.
SELECT * FROM employee_table;
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-------------+------------+------------+---------------+
Selecting All Columns With Names That Match a Pattern¶
이 예제에서는 id
가 포함된 이름을 가진 employee_table
에서 모든 열을 선택하는 방법을 보여줍니다.
SELECT * ILIKE '%id%' FROM employee_table;
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
| 101 | 1 |
| 102 | 2 |
| 103 | 2 |
+-------------+---------------+
Selecting All Columns Except One Column¶
이 예제에서는 department_id
열을 제외한 employee_table
에서 모든 열을 선택하는 방법을 보여줍니다.
SELECT * EXCLUDE department_id FROM employee_table;
+-------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME |
|-------------+------------+------------|
| 101 | Montgomery | Pat |
| 102 | Levine | Terry |
| 103 | Comstock | Dana |
+-------------+------------+------------+
Selecting All Columns Except Two or More Columns¶
이 예제에서는 department_id
및 employee_id
열을 제외하고 employee_table
의 모든 열을 선택하는 방법을 보여줍니다.
SELECT * EXCLUDE (department_id, employee_id) FROM employee_table;
+------------+------------+
| LAST_NAME | FIRST_NAME |
|------------+------------|
| Montgomery | Pat |
| Levine | Terry |
| Comstock | Dana |
+------------+------------+
Selecting All Columns and Renaming One Column¶
이 예제에서는 employee_table
에서 모든 열을 선택하고 department_id
열의 이름을 바꾸는 방법을 보여줍니다.
SELECT * RENAME department_id AS department FROM employee_table;
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-------------+------------+------------+------------+
Selecting All Columns and Renaming Multiple Columns¶
이 예제에서는 employee_table
에서 모든 열을 선택하고 department_id
및 employee_id
열의 이름을 바꾸는 방법을 보여줍니다.
SELECT * RENAME (department_id AS department, employee_id AS id) FROM employee_table;
+-----+------------+------------+------------+
| ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-----+------------+------------+------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-----+------------+------------+------------+
Selecting All Columns, Excluding a Column, and Renaming Multiple Columns¶
이 예제에서는 employee_table
에서 모든 열을 선택하고 first_name
열을 제외하고 department_id
및 employee_id
열의 이름을 바꾸는 방법을 보여줍니다.
SELECT * EXCLUDE first_name RENAME (department_id AS department, employee_id AS id) FROM employee_table;
+-----+------------+------------+
| ID | LAST_NAME | DEPARTMENT |
|-----+------------+------------|
| 101 | Montgomery | 1 |
| 102 | Levine | 2 |
| 103 | Comstock | 2 |
+-----+------------+------------+
Selecting All Columns With Names That Match a Pattern and Renaming a Column¶
이 예제에서는 id
가 포함된 이름을 가진 employee_table
에서 모든 열을 선택하고 department_id
열의 이름을 바꾸는 방법을 보여줍니다.
SELECT * ILIKE '%id%' RENAME department_id AS department FROM employee_table;
+-------------+------------+
| EMPLOYEE_ID | DEPARTMENT |
|-------------+------------|
| 101 | 1 |
| 102 | 2 |
| 103 | 2 |
+-------------+------------+
Selecting All Columns and Replacing the Value of a Column¶
이 예제에서는 employee_table
의 모든 열을 선택하고 department_id
열의 값을 앞에 DEPT-
가 붙은 ID로 바꾸는 방법을 보여줍니다.
SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM employee_table;
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
| 101 | Montgomery | Pat | DEPT-1 |
| 102 | Levine | Terry | DEPT-2 |
| 103 | Comstock | Dana | DEPT-2 |
+-------------+------------+------------+---------------+
Selecting All Columns, Replacing the Value of a Column, and Renaming the Column¶
이 예제에서는 employee_table
의 모든 열을 선택하고 department_id
열의 값을 앞에 DEPT-
가 붙은 ID로 바꾸고 열의 이름을 바꾸는 방법을 보여줍니다.
SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id AS department FROM employee_table;
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
| 101 | Montgomery | Pat | DEPT-1 |
| 102 | Levine | Terry | DEPT-2 |
| 103 | Comstock | Dana | DEPT-2 |
+-------------+------------+------------+------------+
Selecting All Columns With Names That Match a Pattern and Replacing the Value in a Column¶
이 예제에서는 id
가 포함된 이름을 가진 employee_table
에서 모든 열을 선택하고 department_id
열의 값 앞에 DEPT-
를 추가하는 방법을 보여줍니다.
SELECT * ILIKE '%id%' REPLACE('DEPT-' || department_id AS department_id) FROM employee_table;
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
| 101 | DEPT-1 |
| 102 | DEPT-2 |
| 103 | DEPT-2 |
+-------------+---------------+
Selecting All Columns From Multiple Tables, Excluding a Column, and Renaming a Column¶
이 예에서는 두 테이블을 조인하고 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;
+-------------+------------+------------+---------------+------------------+
| 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 |
+-------------+------------+------------+---------------+------------------+
Examples of Selecting Specific Columns (SELECT colname)¶
Selecting a Single Column by Name¶
다음은 직원의 ID를 알고 있는 경우 직원의 성을 조회하는 방법을 보여주는 예입니다.
SELECT last_name FROM employee_table WHERE employee_ID = 101; +------------+ | LAST_NAME | |------------| | Montgomery | +------------+
Selecting Multiple Columns by Name From Joined Tables¶
다음은 각 직원과 각 직원이 근무하는 부서의 이름을 나열하는 예입니다. 부서명 순으로 출력되며, 각 부서 내에서 직원은 이름순으로 정렬됩니다. 이 쿼리는 조인을 사용해 한 테이블의 정보를 다른 테이블의 정보와 관련시킵니다.
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 | +------------------+------------+------------+
Selecting a Column by Position¶
다음은 $
를 사용해 열 이름이 아닌 열 번호로 열을 지정하는 방법을 보여주는 예입니다.
SELECT $2 FROM employee_table ORDER BY $2; +------------+ | $2 | |------------| | Comstock | | Levine | | Montgomery | +------------+
Specifying an Alias for a Column in the Output¶
다음은 FROM
절의 테이블에서 직접 출력 열을 가져올 필요가 없음을 보여주는 예로, 출력 열은 일반 식이 될 수 있습니다. 이 예에서는 반지름이 2.0인 원의 면적을 계산합니다. 또한, 출력에 의미 있는 열 이름이 포함되도록 열 별칭을 사용하는 방법도 보여줍니다.
SELECT pi() * 2.0 * 2.0 AS area_of_circle; +----------------+ | AREA_OF_CIRCLE | |----------------| | 12.566370614 | +----------------+
Error Case: Specifying an Alias That Matches Another Column Name¶
이 예에서는 쿼리에 사용되는 다른 열의 이름과 일치하는 열 별칭을 사용하지 않는 것이 좋은 이유를 보여줍니다. 이 GROUP BY 쿼리는 모호한 열 오류가 아닌 SQL 컴파일러 오류를 발생시킵니다. table1
의 product_id
에 할당된 별칭 prod_id
는 table2
의 prod_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;
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.