* split up select.md * array-join.md basic refactoring * distinct.md basic refactoring * format.md basic refactoring * from.md basic refactoring * group-by.md basic refactoring * having.md basic refactoring * additional index.md refactoring * into-outfile.md basic refactoring * join.md basic refactoring * limit.md basic refactoring * limit-by.md basic refactoring * order-by.md basic refactoring * prewhere.md basic refactoring * adjust operators/index.md links * adjust sample.md links * adjust more links * adjust operatots links * fix some links * adjust aggregate function article titles * basic refactor of remaining select clauses * absolute paths in make_links.sh * run make_links.sh * remove old select.md locations * translate docs/es * translate docs/fr * translate docs/fa * remove old operators.md location * change operators.md links * adjust links in docs/es * adjust links in docs/es * minor texts adjustments * wip * update machine translations to use new links * fix changelog * es build fixes * get rid of some select.md links * temporary adjust ru links * temporary adjust more ru links * improve curly brace handling * adjust ru as well * fa build fix * ru link fixes * zh link fixes * temporary disable part of anchor checks
11 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | 72537a2d52 |
31 | Sözdizimi |
Sözdizimi
Sistemde iki tür ayrıştırıcı vardır: tam SQL ayrıştırıcısı (özyinelemeli bir iniş ayrıştırıcısı) ve veri biçimi ayrıştırıcısı (hızlı akış ayrıştırıcısı).
Dışında her durumda INSERT
sorgu, sadece tam SQL ayrıştırıcı kullanılır.
Bu INSERT
sorgu her iki ayrıştırıcıyı da kullanır:
INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def')
Bu INSERT INTO t VALUES
parça tam ayrıştırıcı tarafından ayrıştırılır ve veriler (1, 'Hello, world'), (2, 'abc'), (3, 'def')
hızlı akış ayrıştırıcısı tarafından ayrıştırılır. Ayrıca kullanarak veriler için tam ayrıştırıcı açabilirsiniz ınput_format_values_interpret_expressions ayar. Ne zaman input_format_values_interpret_expressions = 1
, ClickHouse önce hızlı akış ayrıştırıcısı ile değerleri ayrıştırmaya çalışır. Başarısız olursa, ClickHouse veriler için tam ayrıştırıcıyı kullanmaya çalışır ve bir SQL gibi davranır ifade.
Veri herhangi bir biçime sahip olabilir. Bir sorgu alındığında, sunucu daha fazla hesaplar max_query_size istek bayt RAM (varsayılan olarak, 1 MB) ve geri kalanı akış ayrıştırılır.
Bu büyük sorunları önlemek için izin verir INSERT
sorgular.
Kullanırken Values
biçim içinde bir INSERT
sorgu, verilerin bir ifadedeki ifadelerle aynı şekilde ayrıştırıldığı görünebilir SELECT
sorgu, ancak bu doğru değil. Bu Values
biçim çok daha sınırlıdır.
Bu makalenin geri kalanı tam çözümleyici kapsar. Biçim ayrıştırıcıları hakkında daha fazla bilgi için bkz: Biçimliler bölme.
Alanlar
Sözdizimsel yapılar arasında (bir sorgunun başlangıcı ve sonu dahil) herhangi bir sayıda boşluk simgesi olabilir. Boşluk sembolleri boşluk, sekme, satır beslemesi, CR ve form beslemesini içerir.
Yorumlar
ClickHouse, SQL stili ve C stili yorumlarını destekler.
SQL tarzı yorumlar ile başlar --
ve hattın sonuna kadar devam, bir boşluk sonra --
atlanmış olabilir.
C-style dan /*
-e doğru */
ve çok satırlı olabilir, boşluklar da gerekli değildir.
Kelimeler
Anahtar kelimeler karşılık geldiğinde büyük / küçük harf duyarsızdır:
- SQL standardı. Mesela,
SELECT
,select
veSeLeCt
hepsi geçerlidir. - Bazı popüler DBMS'DE (MySQL veya Postgres) uygulama. Mesela,
DateTime
ile aynıdırdatetime
.
Veri türü adı büyük / küçük harf duyarlı olup olmadığını denetlenebilir system.data_type_families
Tablo.
Standart SQL'İN aksine, diğer tüm anahtar kelimeler (işlev adları dahil) şunlardır büyük küçük harf duyarlı.
Anahtar kelimeler ayrılmış değildir; sadece karşılık gelen bağlamda bu şekilde ele alınır. Kullanıyorsanız tanıtıcılar anahtar kelimelerle aynı ada sahip olarak, bunları çift tırnak veya backticks içine alın. Örneğin, sorgu SELECT "FROM" FROM table_name
tablo geçerli ise table_name
adı ile sütun vardır "FROM"
.
Tanıtıcılar
Tanımlay areıcılar:
- Küme, veritabanı, tablo, bölüm ve sütun adları.
- İşlevler.
- Veri türleri.
- İfade takma adları.
Tanımlayıcılar alıntılanabilir veya alıntılanamaz. İkincisi tercih edilir.
Alıntılanmamış tanımlayıcılar regex ile eşleşmelidir ^[a-zA-Z_][0-9a-zA-Z_]*$
ve eşit olamaz kelimeler. Örnekler: x, _1, X_y__Z123_.
Tanımlayıcıları anahtar kelimelerle aynı şekilde kullanmak istiyorsanız veya tanımlayıcılarda başka semboller kullanmak istiyorsanız, örneğin çift tırnak işaretleri veya backticks kullanarak alıntı yapın, "id"
, `id`
.
Harfler
Sayısal, dize, bileşik ve NULL
harfler.
Sayısal
Sayısal literal ayrıştırılmaya çalışılıyor:
- İlk olarak, 64-bit imzalı bir sayı olarak, strtoull İşlev.
- Başarısız olursa, 64-bit imzasız bir sayı olarak, strtoll İşlev.
- Başarısız olursa, kayan noktalı sayı olarak strtod İşlev.
- Aksi takdirde, bir hata döndürür.
Hazır bilgi değeri, değerin sığdığı en küçük türe sahiptir.
Örneğin, 1 olarak ayrıştırılır UInt8
, ancak 256 olarak ayrıştırılır UInt16
. Daha fazla bilgi için, bkz. Veri türleri.
Örnekler: 1
, 18446744073709551615
, 0xDEADBEEF
, 01
, 0.1
, 1e100
, -1e-100
, inf
, nan
.
Dize
Tek tırnak yalnızca dize değişmezleri desteklenir. Kapalı karakterler ters eğik çizgi kaçabilir. Aşağıdaki kaçış dizileri karşılık gelen özel bir değere sahiptir: \b
, \f
, \r
, \n
, \t
, \0
, \a
, \v
, \xHH
. Diğer tüm durumlarda, çıkış dizileri biçiminde \c
, nere c
herhangi bir karakter, dönüştürülür c
. Bu dizileri kullanabileceğiniz anlamına gelir \'
ve\\
. Değeri olacak Dize tür.
Dize değişmezlerinde, en azından kaçmanız gerekir '
ve \
. Tek tırnak tek Alıntı ile kaçabilir, değişmez 'It\'s'
ve 'It''s'
eşittir.
Bileşik
Diziler köşeli parantez ile inşa edilmiştir [1, 2, 3]
. Nuples yuvarlak parantez ile inşa edilmiştir (1, 'Hello, world!', 2)
.
Teknik olarak bunlar değişmezler değil, sırasıyla dizi oluşturma işleci ve tuple oluşturma işleci ile ifadeler.
Bir dizi en az bir öğeden oluşmalı ve bir tuple en az iki öğeye sahip olmalıdır.
İçinde tuples göründüğünde ayrı bir durum var IN
CLA ause of a SELECT
sorgu. Sorgu sonuçları tuples içerebilir, ancak tuples bir veritabanına kaydedilemez (tablolar hariç Hafıza motor).
NULL
Değerin eksik olduğunu gösterir.
Saklamak için NULL
bir tablo alanında, bu olmalıdır Nullable tür.
Veri formatına bağlı olarak (giriş veya çıkış), NULL
farklı bir temsili olabilir. Daha fazla bilgi için belgelere bakın veri formatları.
İşleme için birçok nüans var NULL
. Örneğin, bir karşılaştırma işleminin argümanlarından en az biri ise NULL
, bu işlemin sonucu da NULL
. Aynı şey çarpma, toplama ve diğer işlemler için de geçerlidir. Daha fazla bilgi için her işlem için belgeleri okuyun.
Sorgularda, kontrol edebilirsiniz NULL
kullanarak IS NULL ve IS NOT NULL operatörler ve ilgili fonksiyonlar isNull
ve isNotNull
.
İşlevler
İşlev çağrıları, yuvarlak parantez içinde bir argüman listesi (muhtemelen boş) olan bir tanımlayıcı gibi yazılır. Standart SQL'İN aksine, boş bir argüman listesi için bile parantezler gereklidir. Örnek: now()
.
Düzenli ve agrega işlevleri vardır (bkz. “Aggregate functions”). Bazı toplama işlevleri parantez içinde iki bağımsız değişken listesi içerebilir. Örnek: quantile (0.9) (x)
. Bu toplama fonksiyonları denir “parametric” fonksiyonlar ve ilk listedeki argümanlar çağrılır “parameters”. Parametresiz toplama işlevlerinin sözdizimi, normal işlevlerle aynıdır.
Operatörler
Operatörler, sorgu ayrıştırma sırasında önceliklerini ve ilişkilendirmelerini dikkate alarak karşılık gelen işlevlerine dönüştürülür.
Örneğin, ifade 1 + 2 * 3 + 4
dönüştür toülür plus(plus(1, multiply(2, 3)), 4)
.
Veri türleri ve veritabanı tablosu motorları
Veri türleri ve tablo motorları CREATE
sorgu tanımlayıcıları veya işlevleri aynı şekilde yazılır. Başka bir deyişle, parantez içinde bir argüman listesi içerebilir veya içermeyebilir. Daha fazla bilgi için bölümlere bakın “Data types,” “Table engines,” ve “CREATE”.
İfade Takma Adları
Diğer ad, sorgudaki ifade için kullanıcı tanımlı bir addır.
expr AS alias
-
AS
— The keyword for defining aliases. You can define the alias for a table name or a column name in aSELECT
kullanmadan fık theraAS
kelime.For example, `SELECT table_name_alias.column_name FROM table_name table_name_alias`. In the [CAST](sql_reference/functions/type_conversion_functions.md#type_conversion_function-cast) function, the `AS` keyword has another meaning. See the description of the function.
-
expr
— Any expression supported by ClickHouse.For example, `SELECT column_name * 2 AS double FROM some_table`.
-
alias
— Name forexpr
. Takma adlar ile uyumlu olmalıdır tanıtıcılar sözdizimi.For example, `SELECT "table t".column_name FROM table_name AS "table t"`.
Kullanımı ile ilgili notlar
Diğer adlar bir sorgu veya alt sorgu için geneldir ve herhangi bir ifade için sorgunun herhangi bir bölümünde bir diğer ad tanımlayabilirsiniz. Mesela, SELECT (1 AS n) + 2, n
.
Diğer adlar alt sorgularda ve alt sorgular arasında görünmez. Örneğin, sorgu yürütülürken SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a
ClickHouse istisna oluşturur Unknown identifier: num
.
Sonuç sütunları için bir diğer ad tanımlanmışsa SELECT
bir alt sorgunun yan tümcesi, bu sütunlar dış sorguda görülebilir. Mesela, SELECT n + m FROM (SELECT 1 AS n, 2 AS m)
.
Sütun veya tablo adlarıyla aynı olan diğer adlara dikkat edin. Aşağıdaki örneği ele alalım:
CREATE TABLE t
(
a Int,
b Int
)
ENGINE = TinyLog()
SELECT
argMax(a, b),
sum(b) AS b
FROM t
Received exception from server (version 18.14.17):
Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sum(b) is found inside another aggregate function in query.
Bu örnekte, tablo ilan ettik t
sütun ile b
. Ardından, veri seçerken, sum(b) AS b
takma ad. Takma adlar küresel olduğundan, ClickHouse literal yerine b
ifad theesinde argMax(a, b)
ifad theesiyle sum(b)
. Bu ikame istisnaya neden oldu.
Yıldız işareti
İn a SELECT
sorgu, bir yıldız ifadesinin yerini alabilir. Daha fazla bilgi için bölüme bakın “SELECT”.
İfadeler
Bir ifade, bir işlev, tanımlayıcı, değişmez, bir operatörün uygulaması, parantez içindeki ifade, alt sorgu veya yıldız işaretidir. Ayrıca bir takma ad içerebilir. İfadelerin listesi, virgülle ayrılmış bir veya daha fazla ifadedir. Fonksiyonlar ve operatörler, sırayla, argüman olarak ifadelere sahip olabilirler.