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>, ... )
}
]
SELECT * 뒤에는 다음 키워드 조합을 지정할 수 있습니다. 키워드는 아래에 표시된 순서대로 사용해야 합니다.
SELECT * ILIKE ... REPLACE ...
SELECT * ILIKE ... RENAME ...
SELECT * ILIKE ... REPLACE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ...
SELECT * EXCLUDE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ... RENAME ...
SELECT * REPLACE ... RENAME ...
특정 열 선택하기¶
[ ... ]
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
로 지정하지 마십시오. 오류 사례: 다른 열 이름과 일치하는 별칭 지정하기 섹션을 참조하십시오.
FOR UPDATE 절 사용하기¶
선택적 FOR UPDATE 절을 사용하여 향후 업데이트 결과를 잠급니다.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
매개 변수¶
WAIT
정수는 이 문이 잠금 획득을 기다리는 최대 시간(초)을 지정합니다.
사용법 노트¶
FOR UPDATE
는SELECT
문의 마지막 절이어야 합니다.FOR UPDATE
를 하위 쿼리 에 사용할 수 없습니다.NOWAIT
는NOWAIT
또는WAIT
가 지정되지 않은 경우 기본 옵션입니다.FOR UPDATE
절은 다음 기능과 호환되지 않습니다.여러 테이블 사용.
참고
하이브리드 테이블은 READ COMMITTED
격리 수준을 지원하므로 FOR UPDATE
절은 읽기 안정성을 보장할 수 없습니다.
열
ID
만 있는 테이블T
는 두 개의 튜플 5 및 10으로 시작합니다.트랜잭션
T1
의SELECT * FROM T WHERE ID < 20 FOR UPDATE
는 두 개의 튜플 5와 10을 반환하고 잠급니다.다른 트랜잭션
T2
의DELETE FROM T WHERE ID = 5
는T1
이 완료될 때까지 기다려야 합니다(커밋 또는 롤백).
그러나 다른 트랜잭션
T3
의INSERT 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 );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');
모든 열을 선택하는 예제(SELECT *)¶
테이블의 모든 열 선택하기¶
이 예제에서는 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 |
+-------------+------------+------------+---------------+
패턴과 일치하는 이름을 가진 모든 열 선택하기¶
이 예제에서는 id
가 포함된 이름을 가진 employee_table
에서 모든 열을 선택하는 방법을 보여줍니다.
SELECT * ILIKE '%id%' FROM employee_table;
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
| 101 | 1 |
| 102 | 2 |
| 103 | 2 |
+-------------+---------------+
한 열을 제외한 모든 열 선택하기¶
이 예제에서는 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 |
+-------------+------------+------------+
두 개 이상의 열을 제외한 모든 열 선택하기¶
이 예제에서는 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 |
+------------+------------+
모든 열 선택 및 한 열의 이름 바꾸기¶
이 예제에서는 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 |
+-------------+------------+------------+------------+
모든 열 선택 및 여러 열 이름 바꾸기¶
이 예제에서는 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 |
+-----+------------+------------+------------+
모든 열 선택, 열 제외 및 여러 열 이름 바꾸기¶
이 예제에서는 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 |
+-----+------------+------------+
패턴과 일치하는 이름을 가진 모든 열 선택 및 열 이름 바꾸기¶
이 예제에서는 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 |
+-------------+------------+
모든 열 선택 및 열의 값 바꾸기¶
이 예제에서는 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 |
+-------------+------------+------------+---------------+
모든 열 선택, 열의 값 바꾸기, 열 이름 바꾸기¶
이 예제에서는 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 |
+-------------+------------+------------+------------+
패턴과 일치하는 이름을 가진 모든 열 선택 및 열의 값 바꾸기¶
이 예제에서는 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 |
+-------------+---------------+
여러 테이블에서 모든 열 선택, 열 제외, 열 이름 바꾸기¶
이 예에서는 두 테이블을 조인하고 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 |
+-------------+------------+------------+---------------+------------------+
특정 열을 선택하는 예제(SELECT colname)¶
이름으로 단일 열 선택하기¶
다음은 직원의 ID를 알고 있는 경우 직원의 성을 조회하는 방법을 보여주는 예입니다.
SELECT last_name FROM employee_table WHERE employee_ID = 101; +------------+ | LAST_NAME | |------------| | Montgomery | +------------+
조인된 테이블에서 이름으로 여러 열 선택하기¶
다음은 각 직원과 각 직원이 근무하는 부서의 이름을 나열하는 예입니다. 부서명 순으로 출력되며, 각 부서 내에서 직원은 이름순으로 정렬됩니다. 이 쿼리는 조인을 사용해 한 테이블의 정보를 다른 테이블의 정보와 관련시킵니다.
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 | +------------------+------------+------------+
위치로 열 선택하기¶
다음은 $
를 사용해 열 이름이 아닌 열 번호로 열을 지정하는 방법을 보여주는 예입니다.
SELECT $2 FROM employee_table ORDER BY $2; +------------+ | $2 | |------------| | Comstock | | Levine | | Montgomery | +------------+
출력에서 열의 별칭 지정하기¶
다음은 FROM
절의 테이블에서 직접 출력 열을 가져올 필요가 없음을 보여주는 예로, 출력 열은 일반 식이 될 수 있습니다. 이 예에서는 반지름이 2.0인 원의 면적을 계산합니다. 또한, 출력에 의미 있는 열 이름이 포함되도록 열 별칭을 사용하는 방법도 보여줍니다.
SELECT pi() * 2.0 * 2.0 AS area_of_circle; +----------------+ | AREA_OF_CIRCLE | |----------------| | 12.566370614 | +----------------+
오류 사례: 다른 열 이름과 일치하는 별칭 지정하기¶
이 예에서는 쿼리에 사용되는 다른 열의 이름과 일치하는 열 별칭을 사용하지 않는 것이 좋은 이유를 보여줍니다. 이 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.