1. 程式人生 > >clickhouse SQL查詢語句 【譯自Github 英文文件】

clickhouse SQL查詢語句 【譯自Github 英文文件】

建立資料庫

CREATE DATABASE [IF NOT EXISTS] db_name

建立表

CREATE TABLE可以有幾種形式。

建立一張表,最好指定引擎結構

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = engine

建立一張像另一張表結構的表

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name AS [db2.]name2 [ENGINE = engine]

建立一張自定義引擎,資料及結構來源於另一張表的表

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name ENGINE = engine AS SELECT ...

預設值

列描述可以指定一個預設值的表示式,其中有以下幾個方法:預設的expr、物化expr、別名expr。示例:URLDomain字串預設域(URL)。
如果沒有定義預設值的表示式,那麼預設值將被設定為0,用於數字、字串的空字串、陣列的空陣列,以及用於日期的00-00 00 00 00 00 0000-0000。不支援null。

臨時表

在所有情況下,如果指定臨時表,就會建立臨時表。臨時表有以下特點:

  • 臨時表在會話結束時消失,包括連線丟失。
  • 一個臨時表是用記憶體引擎建立的。其他表引擎不受支援。
  • DB不能為臨時表指定。它是在資料庫之外建立的。
  • 如果臨時表與另一個表的名稱相同,並且查詢指定表名而不指定DB,則使用臨時表。
  • 對於分散式查詢處理,查詢中使用的臨時表被傳遞給遠端伺服器。

在大多數情況下,臨時表不是手動建立的,而是在使用外部資料進行查詢時,或者在分散式(全域性)中使用。

建立檢視

CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...

有兩種型別的檢視:正常的和物化的。

在建立物化檢視時,必須指定引擎—用於儲存資料的表引擎。

物化檢視的工作原理如下:當將資料插入SELECT中指定的表時,插入資料的一部分被這個SELECT查詢轉換,結果被插入到檢視中。

普通檢視不儲存任何資料,只是執行從另一個表讀取的資料。換句話說,正常的檢視只不過是一個儲存的查詢。從檢視讀取時,這個儲存的查詢被用作FROM子句中的子查詢。

舉例,假設你已經建立了一個檢視

CREATE VIEW view AS SELECT ...

而且寫了一個查詢

SELECT a, b, c FROM view 

這個查詢等價於這個子查詢

SELECT a, b, c FROM (SELECT ...)

物化檢視是這樣安排的:在將資料插入到SELECT中指定的表時,插入資料的一部分被這個SELECT查詢轉換,結果被插入到檢視中。如果您指定填充,則在建立時將現有的表資料插入檢視中,就像建立一個CREATE TABLE。作為選擇……否則,查詢只包含建立檢視後插入到表中的資料。我們不建議使用填充,因為在檢視建立期間插入到表中的資料不會被插入到其中。

ATTACH

這個查詢與CREATE完全相同,但是不是“建立”這個詞,它使用“附加”這個詞。

該查詢不會在磁碟上建立資料,但是假設資料已經在適當的位置,並且只向伺服器新增關於表的資訊。執行附加查詢後,伺服器將知道表的存在。如果表以前是分離的,也就是說它的結構是已知的,那麼您可以使用速記而不用定義結構。

ATTACH TABLE [IF NOT EXISTS] [db.]name
在啟動伺服器時使用該查詢。伺服器將表元資料儲存為帶有附加查詢的檔案,它只是在啟動時執行(除了在伺服器上顯式建立的系統表之外)

DETACH

從伺服器刪除關於“name”表的資訊。伺服器停止知道表的存在。

DETACH TABLE [IF EXISTS] [db.]name
這不會刪除表的資料或元資料。在下一次伺服器啟動時,伺服器將讀取元資料並再次查詢表。類似地,可以使用附加查詢重新連線一個“分離”表(除了系統表之外,沒有為它們儲存的元資料)。

DROP

DROP資料庫

DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] 

DROP TABLE

DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]

RENAME

重新命名一個或多個表。

RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster]

所有表都在全域性鎖定下重新命名。重命名錶是一項輕操作。如果您在之後指定了另一個數據庫,那麼該表將被移動到這個資料庫。但是,帶有資料庫的目錄必須位於相同的檔案系統中(否則,將返回錯誤)

ALTER

ALTER查詢只支援MergeTree表,以及mergeand分散式。該查詢有幾個變體。

ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

增加列(排在某個列之後)

ADD COLUMN name [type] [default_expr] [AFTER name_after]

刪除列

DROP COLUMN name

改變列型別

MODIFY COLUMN name [type] [default_expr]

不支援在主鍵或採樣鍵中刪除列(在引擎表示式中是列)。更改主鍵中包含的列的型別只有在此更改不會導致資料被修改時才可能(例如,允許將值新增到列舉中,或者將DateTime的型別更改為UInt32)。

有幾個處理階段:

  • 用修改過的資料準備臨時的(新的)檔案
  • 重新命名舊檔案
  • 將臨時(新)檔案重新命名為舊的名稱
  • 刪除舊的檔案
只有第一階段需要時間。如果在此階段出現故障,則資料不會更改。如果在一個連續的階段出現故障,則可以手動恢復資料。唯一的例外是,如果舊檔案從檔案系統中刪除,但是新檔案的資料沒有寫到磁碟上,並且丟失了。

分割槽操作

它只適用於MergeTree的表:
  • DETACH PARTITION —— 將一個分割槽移動到“分離”目錄並忘記它
  • DROP PARTITION —— 刪除一個分割槽
  • ATTACH PART|PARTITION ——  將一個新的部分或分割槽從分離的目錄新增到表
  • FREEZE PARTITION —— 建立一個分割槽的備份
  • FETCH PARTITION  —— 從另一個伺服器下載一個分割槽

每一種型別的查詢都被單獨地覆蓋。

表中的一個分割槽是單個日曆月的資料。這是由表引擎引數中指定的日期鍵的值決定的。每個月的資料都是單獨儲存的,以簡化對這些資料的操作。

表中的“部分”是來自單個分割槽的資料的一部分,按主鍵排序你可以使用這個系統。用於查看錶部分和分割槽的部件表

例如:只算活躍的部分,不活躍的部分是在合併到更大的部分後剩餘的部分——這些部分在合併後大約10分鐘被刪除。

SELECT * FROM system.parts WHERE active

另一種檢視一組部件和分割槽的方法是使用表資料進入目錄。資料目錄:/var/lib/clickhouse/data/database/table/,/var/lib/clickhouse/ ClickHouse的路徑資料,資料庫的資料庫名稱,表的表名。

$ ls -l /var/lib/clickhouse/data/test/visits/
total 48
drwxrwxrwx 2 clickhouse clickhouse 20480 may   13 02:58 20140317_20140323_2_2_0
drwxrwxrwx 2 clickhouse clickhouse 20480 may   13 02:58 20140317_20140323_4_4_0
drwxrwxrwx 2 clickhouse clickhouse  4096 may   13 02:55 detached
-rw-rw-rw- 1 clickhouse clickhouse     2 may   13 02:58 increment.txt

在這裡,2014031720140323220和20140320140323440是資料部分的目錄。讓我們來分解第一部分的名

  • 20140317是資料塊中資料的最小日期
  • 20140323是資料塊中資料的最大日期
  • 2是資料塊的最小值
  • 2是資料塊的最大值
  • 0是塊級別(合併樹的深度是由它形成的)

每個部分都與一個單獨的分割槽有關,並且只包含一個月的資料。201403是分割槽的名稱。一個分割槽是一個月的一組部件。

在操作伺服器上,您不能手動更改檔案系統上的部分或它們的資料,因為伺服器不知道它。對於非複製表,當伺服器停止時,您可以這樣做,但我們不建議這樣做。對於複製的表,在任何情況下都不能更改部分。

分離的目錄包含伺服器不使用的部分——使用ALTER從表中分離

將名為“name”的分割槽的所有資料移動到“分離”目錄,然後忘記它們。分割槽名稱以YYYYMM格式指定。它可以用單引號或沒有引號表示

ALTER TABLE [db.]table DETACH PARTITION 'name'

與分離操作相同。從表中刪除資料。資料部分將被標記為不活動,在大約10分鐘內將被完全刪除。該查詢將被複制——資料將在所有副本上被刪除。

ALTER TABLE [db.]table ATTACH PARTITION|PART 'name'

從“分離”目錄中新增資料到表中。

ALTER TABLE [db.]table ATTACH PARTITION|PART 'name'

建立一個或多個分割槽的本地備份。名稱可以是分割槽的全名(例如,201403),或者它的字首(例如,2014):然後將為所有相應的分割槽建立備份。

ALTER TABLE [db.]table FREEZE PARTITION 'name'

備份和複製

這個查詢只適用於可複製的表

ALTER TABLE [db.]table FETCH PARTITION 'name' FROM 'path-in-zookeeper'

儘管查詢被稱為ALTER TABLE,但它不會改變表結構,也不會立即更改表中可用的資料。它從碎片中下載指定的分割槽,它在FROM子句中指定了路徑,然後將其放入指定表的分離目錄中。

SHOW DATABASES

展示所有資料庫

SHOW DATABASES [INTO OUTFILE filename] [FORMAT format]

SHOW TABLES

展示資料庫裡所有表格

SHOW [TEMPORARY] TABLES [FROM db] [LIKE 'pattern'] [INTO OUTFILE filename] [FORMAT format]

SHOW PROCESSLIST

輸出正在處理的查詢列表

SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format]

SHOW CREATE TABLE

顯示建立表的SQL

DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]

DESCRIBE TABLE

每個欄位的名稱及型別

DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]

EXISTS

存在一個utf-8的列,返回1,否則0

EXISTS [TEMPORARY] TABLE [db.]name [INTO OUTFILE filename] [FORMAT format]

USE

使用某一個數據庫

USE db

SET

SET param = value

允許您設定param值,如果指定了全域性,則為會話或伺服器(全域性)設定設定。在建立全域性設定時,設定並不適用於已經執行的會話,包括當前會話。它只會用於新會話。當伺服器重新啟動時,使用SET的全域性設定就會丟失。要在伺服器重新啟動後進行設定

OPTIMIZE

OPTIMIZE TABLE [db.]name [PARTITION partition] [FINAL]

僅支援MergeTree引擎, 用於回收閒置的資料庫空間,當表上的資料行被刪除時,所佔據的磁碟空間並沒有立即被回收,使用了OPTIMIZE TABLE命令後這些空間將被回收,並且對磁碟上的資料行進行重排

INSERT 

不嚴格插入資料,沒有出現的列自動填充為預設值

INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

嚴格插入資料,每一列都必須出現在上面

INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...

插入select 得到的資料

INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...

Performance considerations

按主鍵對輸入資料進行排序,並按月將它們劃分為分割槽。如果您在混合月份插入資料,那麼它會顯著降低INSERT查詢的效能。為了避免這種情況:

  • 在相當大的批量中新增資料,比如一次100,000行。
  • 在將資料上傳至ClickHouse之前,先將資料分組。

效能不會降低:

  • 資料是實時新增的
  • 相關推薦

    clickhouse SQL查詢語句 Github 英文

    建立資料庫CREATE DATABASE [IF NOT EXISTS] db_name建立表CREATE TABLE可以有幾種形式。建立一張表,最好指定引擎結構CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name [ON CL

    Interface RowMapper 簡介(spring 官方

    Interface RowMapper<.T.> 位於: org.springframework.jdbc.core 所有已知的實現類: BeanPropertyRowMapper, ColumnMapRowMapper,

    java中的反射 1—— 簡介@Oracle官方

    反射API的使用 反射通常被用在需要檢查或修改其他執行在JVM中的程式的執行時行為的程式中。這是一種高階特性所以只建議對Java語言基礎有深刻理解的開發人員使用。請牢記這個忠告,反射是一種強大的技術,它使得程式可以完成用其他手段不可能完成的任務。 可擴充套件性程式可以通過使用類的完全限定名稱(fully-

    面試複習一週內銷售額前三的SQL查詢語句

    前言      最近面試複習,越發的覺得自己的基礎太弱了,趁著這個機會,也當是鞏固基礎知識吧。 SQL語句  一、表中欄位:部門ID,銷售額,銷售日期,銷售數量,銷售總價        要求:先按部

    搞定MySQL資料庫第3篇:基礎架構:一條SQL查詢語句是如何執行的?

    本文為本人學習極客時間《MySQL實戰45講》的學習筆記。 原文連結:https://time.geekbang.org/column/article/68319 輸入下面一條SQL語句,我們來分析下這條語句在MySQL內部的執行過程。 mysql> select * from T

    Hibernate3.1.3使用定義實體類實現對SQL查詢語句的對映

    Hibernate3.1.3使用自定義實體類實現對映 前言: 在使用Hibernate操作資料庫時, 特別是進行查詢時,往往要使用儲存過程或一些不方便使用實體類對映的SQL語句。這時就要用到hibernate的自定義SQL語句對映類。下面來介紹一下該過程的實現。 1.下載Hibernate3.1.3(比較

    常用SQL查詢語句

    edate 查詢更新 如果 子查詢 升序 運行 查詢 結構 薪酬 一、簡單查詢語句 1. 查看表結構 SQL>DESC emp; 2. 查詢所有列 SQL>SELECT * FROM emp; 3. 查詢指定列 SQL>SELECT empmo,

    Java 獲取SQL查詢語句結果

    關閉 ddr lis dst 傳值 gets 記錄 sel cti step1:構造連接Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:my

    SQL查詢語句學習心得

    搜索 列表 列名 tin 需要 tab set per 查詢語句 數據查詢 一·(1)SELECT語句進行數據查詢,其一般格式為: SELECT [ALL DISTINCT] <目標列表達式> [,目標列表達式>]..... FROM<表名或視圖名

    關於sql查詢語句中的別名

    sql查詢 img col exceptio pan 語句 sel select ava sql語句中給子查詢或其他查詢類型加別名的時候可能會報錯 java.sql.SQLException: 無法轉換為內部表示 原因是select返回類型的實體類中沒有寫該別名 原來

    T-SQL查詢語句

    select t-sql 多表查詢 表達式 楊書凡 SQL語言中最主要、最核心的部分是它的查詢功能。查詢語句用來對已經存在於數據庫的數據按照特定的組合、條件表達式或次序進行檢索,使用SELECT語句來完成。使用SELECT查詢數據1. SELECT語法結構 T-SQL中查詢基

    MySQL學習——SQL查詢語句(連接查詢&子查詢)(三)

    例如 必須 創建 clas 在一起 另一個 記錄 any 操作 一:連接查詢:   連接查詢是將倆個或者倆個以上的表按照某個條件連接起來,從中選擇需要的數據,連接查詢同時查詢倆個或者倆個以上的表時使用,當不同的表中存在表示相同意義的字段時,可以通過該字段來連接這幾個表,例如

    sql查詢語句for xml path語法

    sql查詢 多行 一行 logs for cnblogs AR 圖片 www 【原地址】 for xml path作用:將多行的查詢結果,根據某一些條件合並到一行。 例:現有一張表 執行下面語句 select Department, (SELECT

    sql查詢語句

    alt nbsp TP 技術 bsp bubuko png http 分享圖片 sql查詢語句

    最近學習的sql查詢語句連接查詢,標記一下

    class lec HERE aid dba 頭刪 spa nec div 1 select wordbase.name,wb.name,wordconnection.wordid,wordconnection.aid,wordbase.goodsid,goods.hsc

    一個表裏有多個字段需要同時使用字典表進行關聯顯示,如何寫sql查詢語句

    TE bbs 創建者 一個 需要 rom signed assigned user 參考:https://bbs.csdn.net/topics/330032307 數據庫裏面有一個字典表,這張表裏面有id段和對應的名字字段。在另外一個記錄的表裏面有對應的上述字典表的id

    sql查詢語句中on和where的區別

    運算 www span 多表 速度 分享 執行 最終 .com   數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。 在使用left jion時,on和where條件的區別如下: on條件是在生成臨時表時使用的條件,它不管

    MySQL 常用30種SQL查詢語句優化方法

    行存儲 資源 created 超過 高速度 地方 sel 大型 有意 1、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的

    MySQL常用30種SQL查詢語句優化方法請慢用!

    很多 調整 trunc 觸發 例程 表變量 結果集 顯式 提高效率 1、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列

    SQL查詢語句優化的實用方法

    能夠 實用 sel 使用 null 判斷 我們 優化 sql 查詢語句的優化是SQL效率優化的一個方式,可以通過優化sql語句來盡量使用已有的索引,避免全表掃描,從而提高查詢效率; 1、在表中建立索引,優先考慮where、group by使用到的字段。 2、盡量避免使用se