SELECT 문

SELECT 문

데이터를 조회할 때 가장 기본이 되는 명령이 바로 SELECT예요. Snowflake에서 어떤 컬럼을 선택할지, 특정 컬럼을 제외하거나 이름을 바꿔 가져올지 등을 SELECT 문 하나로 세밀하게 다룰 수 있어요. 특히 SELECT * 뒤에 붙이는 확장 키워드들이 유용한데, 이번엔 그 핵심을 살펴볼게요.

출처: SELECT - Snowflake Documentation

기본 문법

전체 컬럼을 선택하는 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>': 이름이 패턴과 일치하는 컬럼만 선택해요.

이 키워드들은 정해진 순서로만 조합할 수 있어요. 예를 들어 ILIKERENAME·REPLACE보다 항상 먼저 와야 하고, REPLACERENAME보다 먼저 와야 해요. 같은 컬럼을 EXCLUDERENAME에 동시에 지정할 수는 없어요.

키워드 사용 예시

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_idprod_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 같은 컴파일 오류를 냅니다. 해결책은 간단해요. 별칭을 다른 이름으로 바꾸면 돼요.

더 알아보기 (Learn more)