SELECT FROM
SELECT FROM
FROM 절은 데이터를 읽을 소스를 지정해요:
JOIN 및 ARRAY JOIN 절도 FROM 절의 기능을 확장하는 데 사용될 수 있습니다.
서브쿼리는 FROM 절 안에서 괄호로 지정될 수 있는 또 다른 SELECT 쿼리입니다.
SQL 표준 VALUES 절도 테이블 표현식으로 사용할 수 있습니다:
SELECT * FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) AS t(id, val);
자세한 내용은 Values table function을 참고하세요.
출처: 문서
본문
FROM은 쉼표로 구분된 여러 데이터 소스를 포함할 수 있으며, 이는 그들에 대한 CROSS JOIN을 수행하는 것과 같습니다.
FROM은 선택적으로 SELECT 절 앞에 올 수 있습니다. 이것은 SELECT 문을 더 읽기 쉽게 만드는 표준 SQL의 ClickHouse 특유 확장입니다. 예:
FROM table
SELECT *
FROM으로 시작하는 쿼리에서 SELECT 절은 선택 사항입니다 — 생략되면 쿼리는 SELECT *가 쓰여진 것처럼 동작합니다:
FROM table
WHERE x > 1
이 형태는 주로 pipe operators가 있는 쿼리에서 사용됩니다:
FROM table
|> WHERE x > 1
|> AGGREGATE count() AS c GROUP BY y
FINAL Modifier
FINAL이 지정되면 ClickHouse는 결과를 반환하기 전에 데이터를 완전히 병합합니다. 이는 주어진 테이블 엔진에 대해 병합 중에 발생하는 모든 데이터 변환도 수행합니다.
다음 테이블 엔진을 사용하는 테이블에서 데이터를 선택할 때 적용할 수 있습니다:
ReplacingMergeTreeSummingMergeTreeAggregatingMergeTreeCollapsingMergeTreeVersionedCollapsingMergeTree
FINAL이 있는 SELECT 쿼리는 병렬로 실행됩니다. max_final_threads 설정이 사용되는 스레드 수를 제한합니다.
Drawbacks
FINAL을 사용하는 쿼리는 FINAL을 사용하지 않는 유사한 쿼리보다 약간 느리게 실행됩니다. 그 이유는:
- 쿼리 실행 중에 데이터가 병합됩니다.
FINAL이 있는 쿼리는 쿼리에 지정된 컬럼 외에 기본 키 컬럼도 읽을 수 있습니다.
FINAL은 일반적으로 병합 시점에 발생할 처리가 쿼리 시점에 메모리에서 발생해야 하므로 추가 컴퓨팅 및 메모리 리소스가 필요합니다. 그러나 데이터가 아직 완전히 병합되지 않았을 수 있으므로 정확한 결과를 만들기 위해 FINAL을 사용하는 것이 때로는 필요합니다. 병합을 강제하기 위해 OPTIMIZE를 실행하는 것보다 덜 비쌉니다.
FINAL을 사용하는 대안으로, MergeTree 엔진의 백그라운드 프로세스가 아직 발생하지 않았다고 가정하고 집계를 적용해 처리하는 다른 쿼리를 사용할 수 있습니다(예: 중복을 버리기 위해). 필요한 결과를 얻기 위해 쿼리에서 FINAL을 사용해야 한다면 사용해도 되지만, 추가 처리가 필요하다는 점을 인지하세요.
FINAL은 세션 또는 사용자 프로필을 사용하는 쿼리의 모든 테이블에 FINAL 설정을 사용해 자동으로 적용될 수 있습니다.
Example Usage
FINAL 키워드 사용
SELECT x, y FROM mytable FINAL WHERE x > 1;
쿼리 수준 설정으로 FINAL 사용
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
세션 수준 설정으로 FINAL 사용
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;
Aliases and FINAL
테이블에 별칭이 있으면 FINAL은 별칭 뒤에 옵니다. 이는 테이블이 보통 별칭이 붙는 JOIN 쿼리에서 가장 잘 보입니다:
SELECT t1.id, t2.name
FROM table1 AS t1 FINAL
INNER JOIN table2 AS t2 FINAL ON t1.id = t2.id;
FINAL은 테이블 참조의 수정자이므로 전체 table [AS alias] 표현식을 따라야 합니다. 별칭 앞에 두는 것(FROM table1 FINAL AS t1)은 문법 오류입니다.
Implementation Details
FROM 절이 생략되면 system.one 테이블에서 데이터를 읽습니다.
system.one 테이블은 정확히 한 행을 포함합니다(이 테이블은 다른 DBMS에서 찾을 수 있는 DUAL 테이블과 같은 목적을 수행합니다).
쿼리를 실행하려면 쿼리에 나열된 모든 컬럼이 적절한 테이블에서 추출됩니다. 외부 쿼리에 필요하지 않은 컬럼은 서브쿼리에서 버려집니다.
쿼리가 어떤 컬럼도 나열하지 않으면(예: SELECT count() FROM t), 행 수를 계산하기 위해 어쨌든 일부 컬럼이 테이블에서 추출됩니다(가장 작은 것이 선호됨).