DESCRIBE: 스키마 살펴보기
DESCRIBE: 스키마 살펴보기 (Describe - describe)
테이블이나 쿼리 결과의 스키마(구조)를 확인하고 싶을 때 DESCRIBE를 써요. 테이블의 컬럼 이름, 타입, 널 허용 여부, 키 정보까지 한눈에 볼 수 있답니다. 데이터를 다루기 전에 구조를 파악하는 데 아주 유용한 명령이에요.
테이블 설명하기 (Describing a Table)
테이블의 스키마를 보려면 DESCRIBE 문(또는 그 별칭인 DESC, SHOW) 뒤에 테이블 이름을 붙이면 돼요.
CREATE TABLE tbl (i INTEGER PRIMARY KEY, j VARCHAR);
DESCRIBE tbl;
SHOW tbl; -- DESCRIBE tbl; 과 동일합니다
| column_name | column_type | null | key | default | extra |
|---|---|---|---|---|---|
| i | INTEGER | NO | PRI | NULL | NULL |
| j | VARCHAR | YES | NULL | NULL | NULL |
여기서 i 컬럼은 PRIMARY KEY라서 key가 PRI, null이 NO로 표시되는 걸 볼 수 있어요.
쿼리 설명하기 (Describing a Query)
쿼리 결과의 스키마를 보려면 쿼리 앞에 DESCRIBE를 붙이면 돼요.
DESCRIBE SELECT * FROM tbl;
| column_name | column_type | null | key | default | extra |
|---|---|---|---|---|---|
| i | INTEGER | YES | NULL | NULL | NULL |
| j | VARCHAR | YES | NULL | NULL | NULL |
여기서 주의할 점이 있어요. 테이블을 설명할 때와 결과가 미묘하게 달라요. 널 허용 여부(null)와 키 정보(key)가 사라져요. 쿼리 결과는 저장된 테이블이 아니니 당연히 키나 널 정보를 알 수 없는 거죠.
서브쿼리에서 DESCRIBE 사용하기 (Using DESCRIBE in a Subquery)
DESCRIBE는 서브쿼리로도 사용할 수 있어요. 이를 이용해 설명 결과로 테이블을 만들 수도 있어요.
CREATE TABLE tbl_description AS SELECT * FROM (DESCRIBE tbl);
원격 테이블 설명하기 (Describing Remote Tables)
httpfs 확장을 사용하면 DESCRIBE TABLE 문으로 원격 테이블을 설명할 수 있어요. 예를 들어요.
DESCRIBE TABLE 'https://blobs.duckdb.org/data/Star_Trek-Season_1.csv';
| column_name | column_type | null | key | default | extra |
|---|---|---|---|---|---|
| season_num | BIGINT | YES | NULL | NULL | NULL |
| episode_num | BIGINT | YES | NULL | NULL | NULL |
| aired_date | DATE | YES | NULL | NULL | NULL |
| cnt_kirk_hookups | BIGINT | YES | NULL | NULL | NULL |
| cnt_downed_redshirts | BIGINT | YES | NULL | NULL | NULL |
| bool_aliens_almost_took_over_planet | BIGINT | YES | NULL | NULL | NULL |
| bool_aliens_almost_took_over_enterprise | BIGINT | YES | NULL | NULL | NULL |
| cnt_vulcan_nerve_pinch | BIGINT | YES | NULL | NULL | NULL |
| cnt_warp_speed_orders | BIGINT | YES | NULL | NULL | NULL |
| highest_warp_speed_issued | BIGINT | YES | NULL | NULL | NULL |
| bool_hand_phasers_fired | BIGINT | YES | NULL | NULL | NULL |
| bool_ship_phasers_fired | BIGINT | YES | NULL | NULL | NULL |
| bool_ship_photon_torpedos_fired | BIGINT | YES | NULL | NULL | NULL |
| cnt_transporter_pax | BIGINT | YES | NULL | NULL | NULL |
| cnt_damn_it_jim_quote | BIGINT | YES | NULL | NULL | NULL |
| cnt_im_givin_her_all_shes_got_quote | BIGINT | YES | NULL | NULL | NULL |
| cnt_highly_illogical_quote | BIGINT | YES | NULL | NULL | NULL |
| bool_enterprise_saved_the_day | BIGINT | YES | NULL | NULL | NULL |
URL 하나만으로 원격 CSV 파일의 스키마까지 이렇게 뽑아낼 수 있어요. 컬럼 이름들이 재미있죠? Star Trek 시즌 1 데이터라서 그렇답니다. 😄