mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2026-10-28 16:18:23 +08:00
547 lines
31 KiB
Plaintext
547 lines
31 KiB
Plaintext
---
|
|
description: 'توثيق الصياغة'
|
|
sidebarTitle: 'الصياغة'
|
|
slug: /sql-reference/syntax
|
|
title: 'الصياغة'
|
|
doc_type: 'reference'
|
|
---
|
|
|
|
في هذا القسم، سنستعرض صياغة SQL في ClickHouse.
|
|
يستخدم ClickHouse صياغةً قائمة على SQL، لكنه يوفّر عددًا من الامتدادات والتحسينات.
|
|
|
|
<div id="query-parsing">
|
|
## تحليل الاستعلام
|
|
</div>
|
|
|
|
يوجد نوعان من المحلِّلات في ClickHouse:
|
|
|
|
* *محلِّل SQL كامل* (محلِّل تنازلي تكراري).
|
|
* *محلِّل تنسيق البيانات* (محلِّل تدفّق سريع).
|
|
|
|
يُستخدم محلِّل SQL الكامل في جميع الحالات باستثناء استعلام `INSERT`، إذ يستخدم هذا الاستعلام كلا المحلِّلين.
|
|
|
|
لنستعرض الاستعلام أدناه:
|
|
|
|
```sql
|
|
INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def')
|
|
```
|
|
|
|
كما ذُكر سابقًا، يستخدم استعلام `INSERT` كلا المحلّلين.
|
|
يُحلَّل الجزء `INSERT INTO t VALUES` بواسطة المحلّل الكامل،
|
|
وتُحلَّل البيانات `(1, 'Hello, world'), (2, 'abc'), (3, 'def')` بواسطة محلّل تنسيق البيانات، أو محلّل التدفق السريع.
|
|
|
|
<Accordion title="تشغيل المحلّل الكامل">
|
|
يمكنك أيضًا تشغيل المحلّل الكامل للبيانات
|
|
باستخدام الإعداد [`input_format_values_interpret_expressions`](/ar/reference/settings/formats/input-format#input_format_values_interpret_expressions).
|
|
|
|
عندما تكون قيمة الإعداد المذكور أعلاه `1`،
|
|
يحاول ClickHouse أولًا تحليل القيم باستخدام محلّل التدفق السريع.
|
|
وإذا أخفق ذلك، يحاول ClickHouse استخدام المحلّل الكامل للبيانات، مع التعامل معها كتعبير SQL [تعبير](#expressions).
|
|
</Accordion>
|
|
|
|
يمكن أن تكون البيانات بأي تنسيق.
|
|
وعند استلام استعلام، لا يحتسب الخادم في RAM أكثر من [max_query_size](/ar/reference/settings/session-settings/max#max_query_size) بايت من الطلب
|
|
(افتراضيًا، 1 MB)، ويُحلَّل الباقي كتدفق.
|
|
وذلك لتجنّب المشكلات المرتبطة باستعلامات `INSERT` الكبيرة، وهي الطريقة الموصى بها لإدراج بياناتك في ClickHouse.
|
|
|
|
عند استخدام تنسيق [`Values`](/ar/reference/formats/Values) في استعلام `INSERT`،
|
|
قد يبدو أن البيانات تُحلَّل بالطريقة نفسها كما في التعبيرات ضمن استعلام `SELECT`، لكن الأمر ليس كذلك.
|
|
فتنسيق `Values` أكثر محدوديةً بكثير.
|
|
|
|
يغطي ما تبقّى من هذا القسم المحلّل الكامل.
|
|
|
|
<Note>
|
|
لمزيد من المعلومات حول محلّلات التنسيقات، راجع قسم [التنسيقات](/ar/reference/formats/index).
|
|
</Note>
|
|
|
|
<div id="spaces">
|
|
## المسافات
|
|
</div>
|
|
|
|
* يمكن أن يوجد أي عدد من محارف المسافات بين التركيبات النحوية (بما في ذلك في بداية الاستعلام ونهايته).
|
|
* تشمل محارف المسافات: المسافة، وعلامة الجدولة، وتغذية السطر، وCR، وتغذية الصفحة.
|
|
|
|
<div id="comments">
|
|
## التعليقات
|
|
</div>
|
|
|
|
يدعم ClickHouse التعليقات بنمط SQL وبنمط C:
|
|
|
|
* تبدأ التعليقات بنمط SQL بـ `--` أو `#!` أو `# ` وتستمر حتى نهاية السطر. ويمكن حذف المسافة بعد `--` و`#!`.
|
|
* التعليقات بنمط C:
|
|
* `//` (أو أكثر من حرفي `/`) متبوعًا بنص حتى نهاية السطر. ولا يُشترط وجود مسافات بعد `/`.
|
|
* يمكن أن تمتد من `/*` إلى `*/` في التعليقات متعددة الأسطر. ولا تُشترط المسافات هنا أيضًا.
|
|
* يمكن أن تكون التعليقات بنمط C متداخلة.
|
|
|
|
على سبيل المثال:
|
|
|
|
```sql
|
|
/*
|
|
* Compute the number of days between two dates.
|
|
* /* Returns NULL if either argument is NULL */
|
|
*/
|
|
SELECT
|
|
dateDiff('day', toDate('2024-01-01'), toDate('2024-12-31')) AS days_in_year, -- 365
|
|
dateDiff('day', toDate('2020-01-01'), today()) AS days_since #! since 2020
|
|
///////////////////////////////////////////////////////////////////
|
|
# TODO: add hour/minute variants
|
|
```
|
|
|
|
<div id="keywords">
|
|
## الكلمات المفتاحية
|
|
</div>
|
|
|
|
يمكن أن تكون الكلمات المفتاحية في ClickHouse إما *حساسة لحالة الأحرف* أو *غير حساسة لحالة الأحرف*، بحسب السياق.
|
|
|
|
تكون الكلمات المفتاحية **غير حساسة لحالة الأحرف** عندما تتوافق مع:
|
|
|
|
* معيار SQL. على سبيل المثال، `SELECT` و`select` و`SeLeCt` كلها صيغ صحيحة.
|
|
* طريقة التنفيذ في بعض أنظمة إدارة قواعد البيانات الشائعة (MySQL أو Postgres). على سبيل المثال، `DateTime` هو نفسه `datetime`.
|
|
|
|
<Note>
|
|
يمكنك التحقق مما إذا كان اسم نوع البيانات حساسًا لحالة الأحرف في جدول [system.data_type_families](/ar/reference/system-tables/data_type_families).
|
|
</Note>
|
|
|
|
وعلى خلاف SQL القياسي، فإن جميع الكلمات المفتاحية الأخرى (بما في ذلك أسماء الدوال) **حساسة لحالة الأحرف**.
|
|
|
|
إضافةً إلى ذلك، الكلمات المفتاحية ليست كلمات محجوزة.
|
|
ولا تُعامَل على هذا النحو إلا ضمن السياق المقابل.
|
|
إذا استخدمت [المعرّفات](#identifiers) بالاسم نفسه للكلمات المفتاحية، فأحطها بعلامات اقتباس مزدوجة أو بعلامات `backticks`.
|
|
|
|
على سبيل المثال، يكون الاستعلام التالي صالحًا إذا كان الجدول `table_name` يحتوي على عمود اسمه `"FROM"`:
|
|
|
|
```sql
|
|
SELECT "FROM" FROM table_name
|
|
```
|
|
|
|
<div id="identifiers">
|
|
## المعرّفات
|
|
</div>
|
|
|
|
المعرّفات هي:
|
|
|
|
* أسماء العناقيد، وقواعد البيانات، والجداول، والتقسيمات، والأعمدة.
|
|
* [الدوال](#functions).
|
|
* [أنواع البيانات](/ar/reference/data-types/index).
|
|
* [الأسماء المستعارة للتعبيرات](#expression-aliases).
|
|
|
|
يمكن أن تكون المعرّفات مقتبسة أو غير مقتبسة، مع أن الأخيرة هي المفضّلة.
|
|
|
|
يجب أن تطابق المعرّفات غير المقتبسة التعبير النمطي `^[a-zA-Z_][0-9a-zA-Z_]*$`، ولا يجوز أن تطابق [الكلمات المفتاحية](#keywords).
|
|
راجع الجدول أدناه للاطلاع على أمثلة للمعرّفات الصالحة وغير الصالحة:
|
|
|
|
| المعرّفات الصالحة | المعرّفات غير الصالحة |
|
|
| ---------------------------------------------- | -------------------------------------- |
|
|
| `xyz`, `_internal`, `Id_with_underscores_123_` | `1x`, `tom@gmail.com`, `äußerst_schön` |
|
|
|
|
إذا كنت تريد استخدام معرّفات تطابق الكلمات المفتاحية، أو تريد استخدام رموز أخرى في المعرّفات، فضعها بين علامتي اقتباس مزدوجتين أو بين علامتي التنصيص الخلفيتين، على سبيل المثال: `"id"`، `` `id` ``.
|
|
|
|
<Note>
|
|
تنطبق قواعد محارف الهروب نفسها في المعرّفات المقتبسة أيضًا على القيم النصية الحرفية. راجع [String](#string) لمزيد من التفاصيل.
|
|
</Note>
|
|
|
|
<Tip>
|
|
**تجنّب استخدام النقاط في أسماء الأعمدة**
|
|
|
|
يمكن تفسير أسماء الأعمدة التي تحتوي على نقاط، والأعمدة التي تشترك في بادئة واحدة مفصولة بنقطة، والأعمدة من النوع `Array`، كلٌّ منها على أنه جزء من بنية `Nested` مسطّحة عندما تكون القيمة `flatten_nested = 1` (وهي القيمة الافتراضية). وقد يؤدي ذلك إلى تحقّق غير متوقّع من أطوال المصفوفات عند عمليات insert وفرض قيود على إعادة التسمية.
|
|
|
|
تجنّب استخدام النقاط في أسماء الأعمدة إن أمكن.
|
|
استخدم الشرطات السفلية (`_`) أو فاصلًا آخر بدلًا من النقاط في أسماء الأعمدة، ما لم تكن تحتاج عمدًا إلى دلالات `Nested`.
|
|
</Tip>
|
|
|
|
<div id="literals">
|
|
## القيم الحرفية
|
|
</div>
|
|
|
|
في ClickHouse، القيمة الحرفية هي قيمة تُمثَّل مباشرةً في الاستعلام.
|
|
وبعبارة أخرى، فهي قيمة ثابتة لا تتغير أثناء تنفيذ الاستعلام.
|
|
|
|
يمكن أن تكون القيم الحرفية:
|
|
|
|
* [String](#string)
|
|
* [رقمية](#numeric)
|
|
* [Compound](#compound)
|
|
* [`NULL`](#null)
|
|
* [Heredocs](#heredoc) (قيم String حرفية مخصصة)
|
|
|
|
سنستعرض كلًّا منها بمزيد من التفصيل في الأقسام أدناه.
|
|
|
|
<div id="string">
|
|
### String
|
|
</div>
|
|
|
|
يجب أن تُحاط القيم الحرفية النصية بعلامات اقتباس مفردة. علامات الاقتباس المزدوجة غير مدعومة.
|
|
|
|
تعمل آلية الهروب بإحدى الطريقتين التاليتين:
|
|
|
|
* استخدام علامة اقتباس مفردة سابقة، إذ لا يمكن تهريب محرف علامة الاقتباس المفردة `'` (وهذا المحرف فقط) إلا على هيئة `''`، أو
|
|
* استخدام الشرطة المائلة العكسية السابقة مع تسلسلات الهروب المدعومة التالية والمُدرجة في الجدول أدناه.
|
|
|
|
<Note>
|
|
تفقد الشرطة المائلة العكسية معناها الخاص، أي تُفسَّر حرفيًا، إذا جاءت قبل محارف غير تلك المُدرجة أدناه.
|
|
</Note>
|
|
|
|
| التهريب المدعوم | الوصف |
|
|
| ------------------------------ | ----------------------------------------------------------- |
|
|
| `\xHH` | تحديد محرف من 8 بت متبوع بأي عدد من الأرقام الست عشرية (H). |
|
|
| `\N` | محجوز، ولا يفعل شيئًا (مثلًا `SELECT 'a\Nb'` تُرجع `ab`) |
|
|
| `\a` | تنبيه |
|
|
| `\b` | رجوع للخلف |
|
|
| `\e` | محرف الهروب |
|
|
| `\f` | فاصل صفحة |
|
|
| `\n` | تغذية سطر |
|
|
| `\r` | إرجاع العربة |
|
|
| `\t` | علامة تبويب أفقية |
|
|
| `\v` | علامة تبويب عمودية |
|
|
| `\0` | محرف NULL |
|
|
| `\\` | الشرطة المائلة العكسية |
|
|
| `\'` (أو `''`) | علامة اقتباس مفردة |
|
|
| `\"` | علامة اقتباس مزدوجة |
|
|
| `` ` `` | علامة الاقتباس الخلفية |
|
|
| `\/` | الشرطة المائلة الأمامية |
|
|
| `\=` | علامة يساوي |
|
|
| محارف تحكم ASCII (c <= 31). | |
|
|
|
|
<Note>
|
|
في القيم الحرفية النصية، يجب تهريب `'` و `\` على الأقل باستخدام رموز الهروب `\'` (أو: `''`) و `\\`.
|
|
</Note>
|
|
|
|
<div id="numeric">
|
|
### القيم الحرفية العددية
|
|
</div>
|
|
|
|
تُحلَّل القيم الحرفية العددية على النحو التالي:
|
|
|
|
* إذا كانت القيمة الحرفية مسبوقة بعلامة الطرح `-`، فيُتخطى الرمز وتُطبَّق الإشارة السالبة على النتيجة بعد التحليل.
|
|
* تُحلَّل القيمة الحرفية العددية أولًا كعدد صحيح غير موقَّع بعرض 64 بت، باستخدام الدالة [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul).
|
|
* إذا كانت القيمة مسبوقة بـ `0b` أو `0x`/`0X`، فيُحلَّل العدد كثنائي أو سداسي عشري، على التوالي.
|
|
* إذا كانت القيمة سالبة وكان مقدارها المطلق أكبر من 2<sup>63</sup>، فسيُعاد خطأ.
|
|
* إذا لم ينجح ذلك، تُحلَّل القيمة بعد ذلك كعدد بفاصلة عائمة باستخدام الدالة [strtod](https://en.cppreference.com/w/cpp/string/byte/strtof).
|
|
* بخلاف ذلك، يُعاد خطأ.
|
|
|
|
تُحوَّل القيم الحرفية إلى أصغر نوع تتسع له القيمة.
|
|
على سبيل المثال:
|
|
|
|
* يُحلَّل `1` على أنه `UInt8`
|
|
* يُحلَّل `256` على أنه `UInt16`.
|
|
|
|
<Info>
|
|
**مهم**
|
|
|
|
يجب تحويل قيم الأعداد الصحيحة الأعرض من 64 بت (`UInt128`, `Int128`, `UInt256`, `Int256`) إلى نوع أكبر لكي تُحلَّل بشكل صحيح:
|
|
|
|
```sql
|
|
-170141183460469231731687303715884105728::Int128
|
|
340282366920938463463374607431768211455::UInt128
|
|
-57896044618658097711785492504343953926634992332820282019728792003956564819968::Int256
|
|
115792089237316195423570985008687907853269984665640564039457584007913129639935::UInt256
|
|
```
|
|
|
|
يؤدي ذلك إلى تجاوز الخوارزمية المذكورة أعلاه وتحليل العدد الصحيح باستخدام إجراء يدعم دقةً اعتباطية.
|
|
|
|
وبخلاف ذلك، سيُحلَّل القيمة الحرفية كعدد بفاصلة عائمة، وبالتالي سيكون عرضةً لفقدان الدقة بسبب الاقتطاع.
|
|
</Info>
|
|
|
|
لمزيد من المعلومات، راجع [أنواع البيانات](/ar/reference/data-types/index).
|
|
|
|
تُتجاهل الشرطات السفلية `_` داخل القيم الحرفية العددية، ويمكن استخدامها لتحسين سهولة القراءة.
|
|
|
|
القيم الحرفية العددية التالية مدعومة:
|
|
|
|
| القيمة الحرفية العددية | أمثلة |
|
|
| ------------------------------------------- | ----------------------------------------------- |
|
|
| **الأعداد الصحيحة** | `1`, `10_000_000`, `18446744073709551615`, `01` |
|
|
| **الأعداد العشرية** | `0.1` |
|
|
| **الترميز الأسي** | `1e100`, `-1e-100` |
|
|
| **أعداد الفاصلة العائمة** | `123.456`, `inf`, `nan` |
|
|
| **سداسي عشري** | `0xc0fe` |
|
|
| **سلسلة سداسية عشرية متوافقة مع معيار SQL** | `x'c0fe'` |
|
|
| **ثنائي** | `0b1101` |
|
|
| **سلسلة ثنائية متوافقة مع معيار SQL** | `b'1101'` |
|
|
|
|
<Note>
|
|
القيم الحرفية الثمانية غير مدعومة لتجنب الأخطاء غير المقصودة في التفسير.
|
|
</Note>
|
|
|
|
<div id="compound">
|
|
### المركّبات
|
|
</div>
|
|
|
|
تُنشأ المصفوفات باستخدام `[]`: `[1, 2, 3]`. وتُنشأ الـ Tuples باستخدام `()`: `(1, 'Hello, world!', 2)`.
|
|
من الناحية التقنية، لا تُعد هذه قيَمًا حرفية، بل هي تعبيرات تستخدم عامل إنشاء المصفوفة وعامل إنشاء الـ Tuple، على الترتيب.
|
|
يجب أن تتكوّن المصفوفة من عنصر واحد على الأقل، ويجب أن يتكوّن الـ Tuple من عنصرين على الأقل.
|
|
|
|
<Note>
|
|
توجد حالة منفصلة عند ظهور الـ Tuples في بند `IN` ضمن استعلام `SELECT`.
|
|
يمكن أن تتضمن نتائج الاستعلام Tuples، لكن لا يمكن حفظ الـ Tuples في قاعدة بيانات (باستثناء الجداول التي تستخدم محرك [Memory](/ar/reference/engines/table-engines/special/memory)).
|
|
</Note>
|
|
|
|
<div id="null">
|
|
### NULL
|
|
</div>
|
|
|
|
يُستخدم `NULL` للإشارة إلى أن قيمةً ما مفقودة.
|
|
ولتخزين `NULL` في حقل بجدول، يجب أن يكون هذا الحقل من النوع [Nullable](/ar/reference/data-types/nullable).
|
|
|
|
<Note>
|
|
يجب الانتباه إلى ما يلي بشأن `NULL`:
|
|
|
|
* قد يختلف تمثيل `NULL` بحسب تنسيق البيانات (إدخالًا أو إخراجًا). لمزيد من المعلومات، راجع [تنسيقات البيانات](/ar/reference/formats/index).
|
|
* إن معالجة `NULL` لها بعض التفاصيل الدقيقة. فعلى سبيل المثال، إذا كانت إحدى وسيطات عملية المقارنة على الأقل هي `NULL`، فستكون نتيجة هذه العملية أيضًا `NULL`. وينطبق الأمر نفسه على الضرب والجمع وغير ذلك من العمليات. نوصي بقراءة التوثيق الخاص بكل عملية.
|
|
* في الاستعلامات، يمكنك التحقق من `NULL` باستخدام المعاملين [`IS NULL`](/ar/reference/functions/regular-functions/functions-for-nulls#isNull) و[`IS NOT NULL`](/ar/reference/functions/regular-functions/functions-for-nulls#isNotNull)، وكذلك الدالتين المرتبطتين `isNull` و`isNotNull`.
|
|
</Note>
|
|
|
|
<div id="heredoc">
|
|
### Heredoc
|
|
</div>
|
|
|
|
يُعد [heredoc](https://en.wikipedia.org/wiki/Here_document) أسلوبًا لتعريف سلسلة نصية (غالبًا ما تكون متعددة الأسطر) مع الحفاظ على التنسيق الأصلي.
|
|
ويُعرَّف heredoc بأنه قيمة نصية حرفية مخصّصة توضع بين رمزي `$`.
|
|
|
|
على سبيل المثال:
|
|
|
|
```sql
|
|
SELECT $heredoc$SHOW CREATE VIEW my_view$heredoc$;
|
|
|
|
┌─'SHOW CREATE VIEW my_view'─┐
|
|
│ SHOW CREATE VIEW my_view │
|
|
└────────────────────────────┘
|
|
```
|
|
|
|
<Note>
|
|
* تُعالَج أي قيمة بين محدِّدَي Heredoc "كما هي".
|
|
</Note>
|
|
|
|
<Tip>
|
|
* يمكنك استخدام Heredoc لتضمين مقتطفات من شيفرات SQL أو HTML أو XML وما إلى ذلك.
|
|
</Tip>
|
|
|
|
<div id="defining-and-using-query-parameters">
|
|
## تعريف معلمات الاستعلام واستخدامها
|
|
</div>
|
|
|
|
تتيح لك معلمات الاستعلام كتابة استعلامات عامة تحتوي على عناصر نائبة مجردة بدلًا من المعرّفات الفعلية.
|
|
وعند تنفيذ استعلام يتضمن معلمات استعلام،
|
|
تُفسَّر جميع العناصر النائبة وتُستبدل بقيم معلمات الاستعلام الفعلية.
|
|
|
|
يمكن تعريف معلمات الاستعلام بعدة طرق:
|
|
|
|
* `SET param_<name>=<value>` — باستخدام أمر `SET` داخل استعلام.
|
|
* `--param_<name>='<value>'` — كوسيطة لـ `clickhouse-client` في سطر الأوامر.
|
|
* `param_<name>=<value>` — كمعلمة في سلسلة استعلام URL لواجهة HTTP.
|
|
|
|
يمكن الإشارة إلى معلمة استعلام داخل استعلام باستخدام `{<name>: <datatype>}`، حيث إن `<name>` هو اسم معلمة الاستعلام و`<datatype>` هو نوع البيانات الذي تُحوَّل إليه.
|
|
|
|
<Accordion title="مثال باستخدام أمر SET">
|
|
على سبيل المثال، يعرّف SQL التالي معلمات بأسماء `a` و`b` و`c` و`d`، ولكل منها نوع بيانات مختلف:
|
|
|
|
```sql
|
|
SET param_a = 13;
|
|
SET param_b = 'str';
|
|
SET param_c = '2022-08-04 18:30:53';
|
|
SET param_d = {'10': [11, 12], '13': [14, 15]};
|
|
|
|
SELECT
|
|
{a: UInt32},
|
|
{b: String},
|
|
{c: DateTime},
|
|
{d: Map(String, Array(UInt8))};
|
|
|
|
13 str 2022-08-04 18:30:53 {'10':[11,12],'13':[14,15]}
|
|
```
|
|
</Accordion>
|
|
|
|
<Accordion title="مثال باستخدام clickhouse-client">
|
|
إذا كنت تستخدم `clickhouse-client`، فتُحدَّد المعلمات بصيغة `--param_name=value`. على سبيل المثال، تحمل المعلمة التالية الاسم `message` وتُسترجع كـ `String`:
|
|
|
|
```bash
|
|
clickhouse-client --param_message='hello' --query="SELECT {message: String}"
|
|
|
|
hello
|
|
```
|
|
|
|
إذا كانت معلمة الاستعلام تمثّل اسم database أو table أو function أو أي Identifier آخر، فاستخدم `Identifier` كنوع لها. على سبيل المثال، يعيد الاستعلام التالي rows من table اسمها `uk_price_paid`:
|
|
|
|
```sql
|
|
SET param_mytablename = "uk_price_paid";
|
|
SELECT * FROM {mytablename:Identifier};
|
|
```
|
|
</Accordion>
|
|
|
|
<Accordion title="مثال باستخدام واجهة HTTP">
|
|
يمكن تمرير معلمات الاستعلام كمعلمات في سلسلة استعلام URL مع البادئة `param_`. على سبيل المثال:
|
|
|
|
```bash
|
|
curl -s "http://localhost:8123/?param_message=hello" --data-binary "SELECT {message: String}"
|
|
|
|
hello
|
|
```
|
|
</Accordion>
|
|
|
|
<Accordion title="مثال باستخدام واجهة الويب">
|
|
تكتشف واجهة الويب المضمّنة (`play.html`) تلقائيًا العناصر النائبة للمعلمات بصيغة `{name:Type}` في الاستعلام، وتعرض حقول إدخال معنونة لكل معلمة. تُضمَّن قيم المعلمات في HTTP request، كما تُحفَظ أيضًا في URL الصفحة لأغراض وضع الإشارات المرجعية والمشاركة.
|
|
</Accordion>
|
|
|
|
<Note>
|
|
ليست معلمات الاستعلام بدائل نصية عامة يمكن استخدامها في مواضع عشوائية ضمن استعلامات SQL كيفما اتفق.
|
|
فهي مُصمَّمة أساسًا للعمل داخل عبارات `SELECT` بدلًا من المعرّفات أو القيم الحرفية.
|
|
</Note>
|
|
|
|
<div id="functions">
|
|
## الدوال
|
|
</div>
|
|
|
|
تُكتب استدعاءات الدوال بصيغة مُعرِّف تتبعه قائمة من الوسائط داخل `()`، وقد تكون هذه القائمة فارغة.
|
|
وعلى خلاف SQL القياسي، تكون الأقواس مطلوبة حتى عندما تكون قائمة الوسائط فارغة.
|
|
على سبيل المثال:
|
|
|
|
```sql
|
|
now()
|
|
```
|
|
|
|
هناك أيضًا ما يلي:
|
|
|
|
* [الدوال العادية](/ar/reference/functions/regular-functions/overview).
|
|
* [الدوال التجميعية](/ar/reference/functions/aggregate-functions/index).
|
|
|
|
قد تتضمن بعض الدوال التجميعية قائمتين من الوسائط بين قوسين. على سبيل المثال:
|
|
|
|
```sql
|
|
quantile (0.9)(x)
|
|
```
|
|
|
|
تُسمّى هذه الدوال التجميعية دوالًا "بارامترية"،
|
|
ويُطلَق على الوسيطات في القائمة الأولى اسم "المعلمات".
|
|
|
|
<Note>
|
|
بنية الدوال التجميعية من دون معلمات هي نفسها بنية الدوال العادية.
|
|
</Note>
|
|
|
|
<div id="operators">
|
|
## المعاملات
|
|
</div>
|
|
|
|
تُحوَّل المعاملات إلى الدوال المقابلة لها أثناء تحليل الاستعلام، مع مراعاة أولويتها وترابطيتها.
|
|
|
|
على سبيل المثال، التعبير
|
|
|
|
```text
|
|
1 + 2 * 3 + 4
|
|
```
|
|
|
|
يُحوَّل إلى
|
|
|
|
```text
|
|
plus(plus(1, multiply(2, 3)), 4)`
|
|
```
|
|
|
|
<div id="data-types-and-database-table-engines">
|
|
## أنواع البيانات ومحركات الجداول في قاعدة البيانات
|
|
</div>
|
|
|
|
تُكتب أنواع البيانات ومحركات الجداول في استعلام `CREATE` بالطريقة نفسها التي تُكتب بها المعرّفات أو الدوال.
|
|
وبعبارة أخرى، قد تحتوي على قائمة وسائط بين أقواس، وقد لا تحتوي.
|
|
|
|
لمزيد من المعلومات، راجع الأقسام التالية:
|
|
|
|
* [أنواع البيانات](/ar/reference/data-types/index)
|
|
* [محركات الجداول](/ar/reference/engines/table-engines/index)
|
|
* [CREATE](/ar/reference/statements/create/index).
|
|
|
|
<div id="expressions">
|
|
## التعبيرات
|
|
</div>
|
|
|
|
يمكن أن يكون التعبير أيًا مما يلي:
|
|
|
|
* دالة
|
|
* مُعرّف
|
|
* قيمة حرفية
|
|
* تطبيق معامل
|
|
* تعبير بين قوسين
|
|
* استعلام فرعي
|
|
* علامة النجمة
|
|
|
|
ويمكن أن يتضمن أيضًا [اسمًا مستعارًا](#expression-aliases).
|
|
|
|
قائمة التعبيرات هي تعبير واحد أو أكثر تفصل بينها فاصلات.
|
|
ويمكن للدوال والمعاملات بدورها أن تأخذ تعبيرات كوسيطات.
|
|
|
|
التعبير الثابت هو تعبير تكون نتيجته معروفة أثناء تحليل الاستعلام، أي قبل التنفيذ.
|
|
على سبيل المثال، التعبيرات المبنية على القيم الحرفية هي تعبيرات ثابتة.
|
|
|
|
<div id="expression-aliases">
|
|
## الأسماء المستعارة للتعبيرات
|
|
</div>
|
|
|
|
الاسم المستعار هو اسم يعرّفه المستخدم لـ [تعبير](#expressions) ضمن استعلام.
|
|
|
|
```sql
|
|
expr AS alias
|
|
```
|
|
|
|
تُشرح أجزاء الصياغة أعلاه فيما يلي.
|
|
|
|
| جزء من الصياغة | الوصف | مثال | ملاحظات |
|
|
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| `AS` | الكلمة المفتاحية لتعريف الأسماء المستعارة. يمكنك تعريف الاسم المستعار لاسم جدول أو اسم عمود في عبارة `SELECT` من دون استخدام الكلمة المفتاحية `AS`. | `SELECT table_name_alias.column_name FROM table_name table_name_alias`. | في الدالة [CAST](/ar/reference/functions/regular-functions/type-conversion-functions#CAST)، يكون للكلمة المفتاحية `AS` معنى آخر. راجع وصف الدالة. |
|
|
| `expr` | أي تعبير يدعمه ClickHouse. | `SELECT column_name * 2 AS double FROM some_table` | |
|
|
| `alias` | اسم لـ `expr`. يجب أن تتوافق الأسماء المستعارة مع صياغة [المعرّفات](#identifiers). | `SELECT "table t".column_name FROM table_name AS "table t"`. | |
|
|
|
|
<div id="notes-on-usage">
|
|
### ملاحظات حول الاستخدام
|
|
</div>
|
|
|
|
* تسري الأسماء المستعارة على مستوى الاستعلام أو الاستعلام الفرعي بالكامل، ويمكنك تعريف اسم مستعار لأي تعبير في أي جزء من الاستعلام. على سبيل المثال:
|
|
|
|
```sql
|
|
SELECT (1 AS n) + 2, n`.
|
|
```
|
|
|
|
* الأسماء المستعارة لا تكون مرئية داخل الاستعلامات الفرعية ولا فيما بينها. على سبيل المثال، عند تنفيذ الاستعلام التالي، يُرجع ClickHouse الاستثناء `Unknown identifier: num`:
|
|
|
|
```sql
|
|
`SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a`
|
|
```
|
|
|
|
* إذا تم تعريف اسم مستعار لأعمدة النتيجة في عبارة `SELECT` داخل استعلام فرعي، فستكون هذه الأعمدة مرئية في الاستعلام الخارجي. على سبيل المثال:
|
|
|
|
```sql
|
|
SELECT n + m FROM (SELECT 1 AS n, 2 AS m)`.
|
|
```
|
|
|
|
* انتبه إلى الأسماء المستعارة التي تطابق أسماء الأعمدة أو الجداول. لننظر إلى المثال التالي:
|
|
|
|
```sql
|
|
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.
|
|
```
|
|
|
|
في المثال السابق، عرّفنا الجدول `t` بالعمود `b`.
|
|
ثم عند تحديد البيانات، عرّفنا الاسم المستعار `sum(b) AS b`.
|
|
ونظرًا لأن الأسماء المستعارة عامة النطاق،
|
|
استبدل ClickHouse الرمز `b` في التعبير `argMax(a, b)` بالتعبير `sum(b)`.
|
|
وقد أدى هذا الاستبدال إلى حدوث الاستثناء.
|
|
|
|
<Note>
|
|
يمكنك تغيير هذا السلوك الافتراضي بتعيين [prefer_column_name_to_alias](/ar/reference/settings/session-settings/prefer#prefer_column_name_to_alias) إلى `1`.
|
|
</Note>
|
|
|
|
<div id="asterisk">
|
|
## النجمة
|
|
</div>
|
|
|
|
في استعلام `SELECT`، يمكن أن تحل النجمة محل التعبير.
|
|
لمزيد من المعلومات، راجع القسم [SELECT](/ar/reference/statements/select/index#asterisk). |