بيانات الاختبار والموارد
movie_id في صف من جدول genres على القيمة id من صف في جدول movies.
توجد علاقة متعددة إلى متعددة بين الأفلام والممثلين.
وتُطبَّع هذه العلاقة متعددة إلى متعددة إلى علاقتين من واحد إلى متعدد باستخدام جدول roles.
ويحتوي كل صف في جدول roles على قيم العمود id من جدولي movies وactors.
أنواع JOIN التي يدعمها ClickHouse
INNER JOIN
INNER JOIN، لكل زوج من الصفوف المتطابقة بحسب مفاتيح الربط، قيم الأعمدة من الصف في الجدول الأيسر مدمجةً مع قيم الأعمدة من الصف في الجدول الأيمن.
إذا كان للصف أكثر من تطابق واحد، فستُعاد جميع التطابقات (أي يُنتَج الجداء الديكارتي للصفوف ذات مفاتيح الربط المتطابقة).
يستخرج هذا الاستعلام الأنواع لكل فيلم من خلال ربط جدول movies بجدول genres:
يمكن حذف الكلمة المفتاحية
INNER.INNER JOIN أو تغييره باستخدام أحد أنواع الربط الأخرى التالية.
(LEFT / RIGHT / FULL) OUTER JOIN
LEFT OUTER JOIN بطريقة مشابهة لـ INNER JOIN؛ لكنه يعيد أيضًا، بالنسبة إلى صفوف الجدول الأيسر غير المتطابقة، القيم الافتراضية لأعمدة الجدول الأيمن.
يكون استعلام RIGHT OUTER JOIN مشابهًا لذلك، ويعيد أيضًا قيم الصفوف غير المتطابقة من الجدول الأيمن مع القيم الافتراضية لأعمدة الجدول الأيسر.
ويجمع استعلام FULL OUTER JOIN بين LEFT OUTER JOIN وRIGHT OUTER JOIN، ويعيد قيم الصفوف غير المتطابقة من الجدولين الأيسر والأيمن، مع القيم الافتراضية لأعمدة الجدول الأيمن والأيسر، على الترتيب.
يمكن تهيئة ClickHouse لإرجاع NULLs بدلًا من القيم الافتراضية (لكن ذلك أقل توصيةً لأسباب تتعلق بالأداء).
movies التي لا تحتوي على تطابقات في جدول genres، وبالتالي تحصل (وقت الاستعلام) على القيمة الافتراضية 0 للعمود movie_id:
يمكن الاستغناء عن الكلمة المفتاحية
OUTER.CROSS JOIN
CROSS JOIN حاصل الجداء الديكارتي الكامل للجدولين من دون مراعاة مفاتيح الربط.
يُدمَج كل صف من الجدول الأيسر مع كل صف من الجدول الأيمن.
لذلك، فإن الاستعلام التالي يدمج كل صف من جدول movies مع كل صف من جدول genres:
WHERE لربط الصفوف المتطابقة ومحاكاة سلوك INNER JOIN بهدف العثور على أنواع كل فيلم:
CROSS JOIN عدة جداول في عبارة FROM مفصولة بفواصل.
يعيد ClickHouse كتابة CROSS JOIN إلى INNER JOIN إذا وُجدت تعبيرات ربط في قسم WHERE من الاستعلام.
يمكنك التحقق من ذلك في الاستعلام المثال باستخدام EXPLAIN SYNTAX (الذي يعرض النسخة المُحسَّنة نحويًا التي يُعاد إليها كتابة الاستعلام قبل تنفيذه):
INNER JOIN في نسخة الاستعلام CROSS JOIN المحسَّنة نحويًا الكلمة المفتاحية ALL، وقد أُضيفت صراحةً للحفاظ على دلالات الجداء الديكارتي في CROSS JOIN حتى عند إعادة كتابته إلى INNER JOIN، حيث يمكن تعطيل الجداء الديكارتي في هذه الحالة.
OUTER من RIGHT OUTER JOIN، كما يمكن إضافة الكلمة المحجوزة الاختيارية ALL، لذا يمكنك كتابة ALL RIGHT JOIN وسيعمل ذلك دون مشكلة.
(LEFT / RIGHT) SEMI JOIN
LEFT SEMI JOIN قيم الأعمدة لكل صف من الجدول الأيسر له تطابق واحد على الأقل في مفتاح الربط مع الجدول الأيمن.
ولا يُعاد إلا أول تطابق يتم العثور عليه (إذ يكون الجداء الديكارتي معطّلًا).
ويعمل استعلام RIGHT SEMI JOIN بالطريقة نفسها، إذ يعيد القيم لجميع الصفوف من الجدول الأيمن التي لها تطابق واحد على الأقل في الجدول الأيسر، ولكن لا يُعاد إلا أول تطابق يتم العثور عليه.
يعثر هذا الاستعلام على جميع الممثلين/الممثلات الذين شاركوا في فيلم خلال عام 2023.
لاحظ أنه عند استخدام ربط عادي (INNER)، سيظهر الممثل/الممثلة نفسه أكثر من مرة إذا كان لديه أكثر من دور واحد في عام 2023:
(LEFT / RIGHT) ANTI JOIN
LEFT ANTI JOIN قيم الأعمدة لجميع الصفوف غير المتطابقة من الجدول الأيسر.
وبالمثل، يعيد RIGHT ANTI JOIN قيم الأعمدة لجميع الصفوف غير المتطابقة من الجدول الأيمن.
يمكن إعادة صياغة استعلام مثال الربط الخارجي السابق باستخدام anti join للعثور على الأفلام التي لا تملك نوعًا في مجموعة البيانات:
(LEFT / RIGHT / INNER) ANY JOIN
LEFT ANY JOIN مزيجًا من LEFT OUTER JOIN وLEFT SEMI JOIN، ما يعني أن ClickHouse يعيد قيم الأعمدة لكل صف من الجدول الأيسر، إما مقترنةً بقيم أعمدة صف مطابق من الجدول الأيمن، أو بقيم الأعمدة الافتراضية للجدول الأيمن إذا لم يوجد تطابق.
إذا كان لصف من الجدول الأيسر أكثر من تطابق واحد في الجدول الأيمن، فإن ClickHouse يعيد فقط قيم الأعمدة المقترنة من أول تطابق يعثر عليه (مع تعطيل الجداء الديكارتي).
وبالمثل، فإن RIGHT ANY JOIN هو مزيج من RIGHT OUTER JOIN وRIGHT SEMI JOIN.
أما INNER ANY JOIN فهو INNER JOIN مع تعطيل الجداء الديكارتي.
يوضح المثال التالي LEFT ANY JOIN من خلال مثال تجريدي يستخدم جدولين مؤقتين (left_table وright_table) أُنشئا باستخدام دالة الجدول values table function:
RIGHT ANY JOIN:
INNER ANY JOIN:
ASOF JOIN
ASOF JOIN إمكانات مطابقة غير دقيقة.
إذا لم يكن لصف من الجدول الأيسر تطابق تام في الجدول الأيمن، فسيُستخدَم بدلًا منه أقرب صف مطابق من الجدول الأيمن.
ويُعد هذا مفيدًا بشكل خاص في تحليلات السلاسل الزمنية، ويمكن أن يقلّل تعقيد الاستعلام بشكل كبير.
يوضح المثال التالي تحليلات سلاسل زمنية لبيانات سوق الأسهم.
يحتوي جدول quotes على أسعار لرموز الأسهم استنادًا إلى أوقات محددة خلال اليوم.
ويُحدَّث السعر كل 10 ثوانٍ في بيانات المثال.
أما جدول trades فيسرد صفقات الرموز — أي أن حجمًا محددًا من أحد الرموز قد تم شراؤه في وقت محدد:
لحساب التكلفة الفعلية لكل صفقة، نحتاج إلى مطابقة الصفقات مع أقرب وقت لسعر العرض الخاص بها.
ويصبح ذلك سهلًا وموجزًا باستخدام ASOF JOIN، حيث تُستخدَم عبارة ON لتحديد شرط التطابق التام، وتُستخدَم عبارة AND لتحديد شرط أقرب مطابقة — فبالنسبة إلى رمز محدد (تطابق تام)، تبحث عن الصف ذي الوقت “الأقرب” من جدول quotes عند وقت صفقة ذلك الرمز أو قبله مباشرةً (مطابقة غير دقيقة):
تُعدّ عبارة
ON في ASOF JOIN مطلوبة، وهي تحدد شرط تطابق تام إلى جانب شرط التطابق غير التام في عبارة AND.