SELECT 문
SELECT 문
데이터를 조회할 때 가장 기본이 되는 명령이 바로 SELECT예요. Snowflake에서 어떤 컬럼을 선택할지, 특정 컬럼을 제외하거나 이름을 바꿔 가져올지 등을 SELECT 문 하나로 세밀하게 다룰 수 있어요. 특히 SELECT * 뒤에 붙이는 확장 키워드들이 유용한데, 이번엔 그 핵심을 살펴볼게요.
기본 문법
전체 컬럼을 선택하는 SELECT * 형태와, 특정 컬럼만 고르는 SELECT <col> 형태로 나눌 수 있어요.
SELECT [ { ALL | DISTINCT } ]
[ TOP <n> ]
[{<object_name>|<alias>}.]*
[ ILIKE '<pattern>' ]
[ EXCLUDE { <col_name> | ( <col_name>, <col_name>, ... ) } ]
[ REPLACE { ( <expr> AS <col_name> [ , ... ] ) } ]
[ RENAME { <col_name> AS <col_alias> | ( <col_name> AS <col_alias>, ... ) } ]
특정 컬럼만 고를 때는 컬럼 이름, 위치, 또는 표현식 중 하나를 쓰고 선택적으로 별칭을 붙일 수 있어요.
SELECT [ { ALL | DISTINCT } ]
[ TOP <n> ]
{ [{<object_name>|<alias>}.]<col_name>
| [{<object_name>|<alias>}.]$<col_position>
| <expr> }
[ [ AS ] <col_alias> ]
[ , ... ]
컬럼 목록에 트레일링 콤마를 허용한다는 점이 눈에 띄는데, 다음처럼 마지막 컬럼 뒤에 콤마가 와도 괜찮아요.
SELECT emp_id,
name,
dept,
FROM employees;
SELECT * 뒤에 붙이는 키워드
*(애스터리스크)는 객체의 모든 컬럼을 출력하라는 축약 표현이에요. 여러 객체를 조인한 경우 table_name.*처럼 한정해 특정 테이블의 전체 컬럼을 골라낼 수도 있어요. 이때 * 뒤에 조합해 쓸 수 있는 키워드가 몇 가지 있어요.
EXCLUDE: 특정 컬럼을 결과에서 제외해요. 여러 컬럼은 괄호로 묶어요.REPLACE: 해당 컬럼의 값을 계산된 표현식으로 대체해요.RENAME: 결과에 쓰일 컬럼 별칭을 지정해요.ILIKE '<pattern>': 이름이 패턴과 일치하는 컬럼만 선택해요.
이 키워드들은 정해진 순서로만 조합할 수 있어요. 예를 들어 ILIKE는 RENAME·REPLACE보다 항상 먼저 와야 하고, REPLACE는 RENAME보다 먼저 와야 해요. 같은 컬럼을 EXCLUDE와 RENAME에 동시에 지정할 수는 없어요.
키워드 사용 예시
employee_table에서 id가 들어간 이름의 컬럼만 골라내려면 다음처럼 써요.
SELECT * ILIKE '%id%' FROM employee_table;
department_id 컬럼만 빼고 전체를 가져오려면 EXCLUDE를 써요.
SELECT * EXCLUDE department_id FROM employee_table;
department_id의 값 앞에 DEPT- 문자열을 붙여 보여주고 싶다면 REPLACE로 표현식을 지정해요.
SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM employee_table;
결과의 컬럼 이름을 바꾸고 싶다면 RENAME을 써요.
SELECT * RENAME department_id AS department FROM employee_table;
특정 컬럼 선택 예시
컬럼 이름으로 하나를 고르는 가장 흔한 형태예요.
SELECT last_name FROM employee_table WHERE employee_ID = 101;
컬럼을 이름 대신 위치로 지정할 수도 있어요. $2는 두 번째 컬럼을 뜻해요.
SELECT $2 FROM employee_table ORDER BY $2;
표현식에 별칭을 붙여 계산 결과를 컬럼으로 돌려받을 수 있어요.
SELECT pi() * 2.0 * 2.0 AS area_of_circle;
사용 시 주의할 점
쿼리마다 결과가 반복 실행될 때마다 달라질 수 있으니, 순서가 중요하다면 반드시 ORDER BY 절을 써 주세요. SELECT는 독립 문장으로 쓰일 뿐 아니라 INSERT INTO ... SELECT ...처럼 다른 문장의 일부로도 쓸 수 있어요.
별칭을 지을 때 주의할 점이 하나 있어요. 다른 컬럼과 같은 이름으로 별칭을 달면 안 돼요. 예를 들어 prod_id 컬럼과 product_id 컬럼이 함께 있는 쿼리에서 product_id를 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;
이 쿼리는 'T1.PRODUCT_ID' ... is neither an aggregate nor in the group by clause 같은 컴파일 오류를 냅니다. 해결책은 간단해요. 별칭을 다른 이름으로 바꾸면 돼요.