SELECT لاسترجاع البيانات. وبشكل افتراضي، تُعاد البيانات المطلوبة إلى العميل، ويمكن عند استخدامها مع INSERT INTO توجيهها إلى جدول آخر.
البنية
SELECT مطلوبة؛ أما جميع البنود الأخرى فاختيارية.
يُشرح SELECT وبنوده الاختيارية في أقسام منفصلة:
- بند WITH
- بند SELECT
- بند ALL
- بند DISTINCT
- بند FROM
- بند SAMPLE
- بند ARRAY JOIN
- بند JOIN
- بند PREWHERE
- بند WHERE
- بند GROUP BY
- بند HAVING
- بند WINDOW
- بند QUALIFY
- بند ORDER BY
- بند LIMIT BY
- بند LIMIT
- بند OFFSET
- بند UNION
- بند INTERSECT
- بند EXCEPT
- بند INTO OUTFILE
- بند FORMAT
بند SELECT
تُحتسب التعبيرات المحددة في بندSELECT بعد اكتمال جميع العمليات في البنود الموضحة أعلاه. وتعمل هذه التعبيرات كما لو كانت تُطبَّق على صفوف منفصلة في النتيجة. وإذا كانت التعبيرات في بند SELECT تحتوي على دوال تجميع، فإن ClickHouse يعالج دوال التجميع والتعبيرات المستخدمة بوصفها وسيطات لها أثناء تجميع GROUP BY.
إذا كنت تريد تضمين جميع الأعمدة في النتيجة، فاستخدم رمز النجمة (*). على سبيل المثال: SELECT * FROM ....
الاختيار الديناميكي للأعمدة
يتيح لك الاختيار الديناميكي للأعمدة (ويُعرف أيضًا باسم تعبير COLUMNS) مطابقة بعض الأعمدة في النتائج باستخدام تعبير نمطي re2.a.
COLUMNS في استعلام وتطبيق الدوال عليها.
على سبيل المثال:
COLUMNS إلى الدالة على هيئة وسيط منفصل. ويمكنك أيضًا تمرير وسائط أخرى إلى الدالة إذا كانت تدعمها. توخَّ الحذر عند استخدام الدوال. إذا كانت الدالة لا تدعم عدد الوسائط التي مرَّرتها إليها، فإن ClickHouse يُلقي استثناءً.
على سبيل المثال:
COLUMNS('a') عمودين: aa وab. وتُرجِع COLUMNS('c') العمود bc. لا يمكن تطبيق العامل + على 3 وسيطات، لذلك يرفع ClickHouse استثناءً بالرسالة المناسبة.
قد تكون أنواع بيانات الأعمدة التي طابقت التعبير COLUMNS مختلفة. وإذا لم يطابق COLUMNS أي أعمدة وكان هو التعبير الوحيد في SELECT، فإن ClickHouse يرفع استثناءً.
اختيار الأعمدة باستخدام LIKE أو ILIKE
يمكنك أيضًا اختيار الأعمدة عبر مطابقة أسمائها مع نمط بعد *، باستخدام LIKE المطابق لحالة الأحرف أو ILIKE غير المطابق لحالة الأحرف:
LIKE وILIKE دلالات LIKE، لا دلالات التعبيرات النمطية. يطابق المحرف % أي تسلسل من المحارف، ويطابق المحرف _ أي محرف واحد، ويُستخدم \ لإلغاء المعنى الخاص لكل من % و_ و\. والفرق الوحيد بينهما هو أن LIKE يطابق أسماء الأعمدة مع مراعاة حالة الأحرف، بينما ILIKE غير حساس لحالة الأحرف. على سبيل المثال:
a، مثل aa وab.
تدعم * LIKE و* ILIKE أيضًا العلامات النجمية المؤهلة ومحوِّلات الأعمدة:
النجمة
يمكنك وضع نجمة في أي جزء من الاستعلام بدلًا من تعبير. وعند تحليل الاستعلام، تُوسَّع النجمة إلى قائمة بكل أعمدة الجدول (باستثناء الأعمدةMATERIALIZED وALIAS). ولا يوجد سوى عدد قليل من الحالات التي يكون فيها استخدام النجمة مبررًا:
- عند إنشاء dump للجدول.
- في الجداول التي لا تحتوي إلا على عدد قليل من الأعمدة، مثل جداول النظام.
- للحصول على معلومات عن الأعمدة الموجودة في جدول. في هذه الحالة، اضبط
LIMIT 1. لكن من الأفضل استخدام الاستعلامDESC TABLE. - عند وجود تصفية قوية على عدد صغير من الأعمدة باستخدام
PREWHERE. - في الاستعلامات الفرعية (لأن الأعمدة غير المطلوبة للاستعلام الخارجي تُستبعد من الاستعلامات الفرعية).
القيم القصوى
بالإضافة إلى النتائج، يمكنك أيضًا الحصول على القيم الدنيا والقصوى لأعمدة النتائج. للقيام بذلك، اضبط الإعداد extremes على 1. تُحسب القيم الدنيا والقصوى للأنواع الرقمية، والتواريخ، وقيم التاريخ والوقت. أما الأعمدة الأخرى، فتُخرَج لها القيم الافتراضية. يُحسب صفّان إضافيان — القيم الدنيا والقيم القصوى، على الترتيب. ويُخرَج هذان الصفّان الإضافيان في التنسيقاتXML وJSON* وTabSeparated* وCSV* وVertical وTemplate وPretty*، بشكل منفصل عن الصفوف الأخرى. ولا يُخرَجان في التنسيقات الأخرى.
في تنسيقات JSON* وXML، تُخرَج القيم القصوى في حقل منفصل باسم ‘extremes’. وفي تنسيقات TabSeparated* وCSV* وVertical، يأتي هذا الصف بعد النتيجة الرئيسية، وبعد ‘totals’ أيضًا إذا كان موجودًا. ويسبقه صف فارغ (بعد البيانات الأخرى). وفي تنسيقات Pretty*، يُخرَج الصف في جدول منفصل بعد النتيجة الرئيسية، وبعد totals أيضًا إذا كان موجودًا. وفي تنسيق Template، تُخرَج القيم القصوى وفقًا للقالب المحدد.
تُحسب القيم القصوى للصفوف قبل LIMIT، ولكن بعد LIMIT BY. ومع ذلك، عند استخدام LIMIT offset, size، تُدرَج الصفوف التي تسبق offset ضمن extremes. ويتصرف النطاق LIMIT ... AFTER ... UNTIL مثل LIMIT هنا: إذ تُحسب القيم القصوى على الصفوف المقروءة قبل تطبيق النطاق. وفي الطلبات المتدفقة، قد تتضمن النتيجة أيضًا عددًا قليلًا من الصفوف التي مرّت عبر LIMIT.
ملاحظات
يمكنك استخدام المرادفات (الأسماء المستعارة باستخدامAS) في أي جزء من الاستعلام.
تدعم بنود GROUP BY وORDER BY وLIMIT BY الوسيطات الموضعية. لتمكين ذلك، فعِّل الإعداد enable_positional_arguments. بعد ذلك، على سبيل المثال، سيؤدي ORDER BY 1,2 إلى فرز صفوف الجدول حسب العمود الأول ثم العمود الثاني.
تفاصيل التنفيذ
إذا كان الاستعلام لا يتضمن بنودDISTINCT وGROUP BY وORDER BY ولا الاستعلامات الفرعية IN وJOIN، فستتم معالجة الاستعلام بالكامل على نحوٍ تدفقي، باستخدام مقدار O(1) من RAM. بخلاف ذلك، قد يستهلك الاستعلام قدرًا كبيرًا من RAM إذا لم تُحدَّد القيود المناسبة:
max_memory_usagemax_rows_to_group_bymax_rows_to_sortmax_rows_in_distinctmax_bytes_in_distinctmax_rows_in_setmax_bytes_in_setmax_rows_in_joinmax_bytes_in_joinmax_bytes_before_external_sortmax_bytes_ratio_before_external_sortmax_bytes_before_external_group_bymax_bytes_ratio_before_external_group_by
مُعدِّلات SELECT
يمكنك استخدام المُعدِّلات التالية في استعلاماتSELECT.
تركيبات المعدِّلات
يمكنك استخدام كل معدِّل على حدة أو الجمع بينها. أمثلة: استخدام المعدِّل نفسه عدة مرات.الإعدادات في استعلام SELECT
يمكنك تحديد الإعدادات اللازمة مباشرةً داخل استعلامSELECT. ولا تُطبَّق قيمة الإعداد إلا على هذا الاستعلام، ثم تُعاد إلى القيمة الافتراضية أو إلى القيمة السابقة بعد تنفيذ الاستعلام.
للتعرّف على طرق أخرى لضبط الإعدادات، راجع هنا.
بالنسبة إلى الإعدادات المنطقية المعيّنة إلى true، يمكنك استخدام صيغة مختصرة بحذف تعيين القيمة. وعند تحديد اسم الإعداد فقط، يُعيَّن تلقائيًا إلى 1 (صواب).
مثال