تتيح لك عبارة WHERE تصفية البيانات القادمة من عبارة FROM في SELECT.
إذا وُجدت عبارة WHERE، فيجب أن تليها تعبير من النوع UInt8.
وتُستبعَد الصفوف التي تُقيَّم فيها هذه التعبير إلى 0 من المعالجات اللاحقة أو من النتيجة.
غالبًا ما تُستخدم تعبير التي تلي عبارة WHERE مع عوامل المقارنة والعوامل المنطقية، أو مع إحدى الدوال العادية العديدة.
تُقيَّم تعبير الخاصة بـ WHERE من حيث إمكانية استخدام الفهارس وpartition pruning، إذا كان table engine الخاص بـ underlying table يدعم ذلك.
التحقق من NULL
إذا كنت بحاجة إلى التحقق مما إذا كانت قيمة هي NULL، فاستخدم:
IS NULLأوisNullIS NOT NULLأوisNotNull
وإلا فلن يطابق أي تعبير يحتوي على NULL أي شرط مطلقًا.
تصفية البيانات باستخدام العوامل المنطقية
يمكنك استخدام الدوال المنطقية التالية مع عبارة WHERE لدمج عدة شروط:
استخدام أعمدة UInt8 كشرط
في ClickHouse، يمكن استخدام أعمدة UInt8 مباشرةً كشروط منطقية، بحيث تمثّل 0 القيمة false وتمثّل أي قيمة غير صفرية (وغالبًا 1) القيمة true.
ويَرِد مثال على ذلك في القسم أدناه.
استخدام معاملات المقارنة
يمكن استخدام معاملات المقارنة التالية:
| المعامل | الدالة | الوصف | مثال |
|---|---|---|---|
a = b |
equals(a, b) |
يساوي | price = 100 |
a == b |
equals(a, b) |
يساوي (صيغة بديلة) | price == 100 |
a != b |
notEquals(a, b) |
لا يساوي | category != 'Electronics' |
a <> b |
notEquals(a, b) |
لا يساوي (صيغة بديلة) | category <> 'Electronics' |
a < b |
less(a, b) |
أقل من | price < 200 |
a <= b |
lessOrEquals(a, b) |
أقل من أو يساوي | price <= 200 |
a > b |
greater(a, b) |
أكبر من | price > 500 |
a >= b |
greaterOrEquals(a, b) |
أكبر من أو يساوي | price >= 500 |
a LIKE s |
like(a, b) |
مطابقة النمط (حساسة لحالة الأحرف) | name LIKE '%top%' |
a NOT LIKE s |
notLike(a, b) |
عدم مطابقة النمط (حساسة لحالة الأحرف) | name NOT LIKE '%top%' |
a ILIKE s |
ilike(a, b) |
مطابقة النمط (غير حساسة لحالة الأحرف) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c |
a >= b AND a <= c |
التحقق من النطاق (شامل) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c |
a < b OR a > c |
التحقق من الخروج عن النطاق | price NOT BETWEEN 100 AND 500 |
مطابقة الأنماط والتعبيرات الشرطية
إلى جانب معاملات المقارنة، يمكنك استخدام مطابقة الأنماط والتعبيرات الشرطية في عبارة WHERE.
| الميزة | الصياغة | مراعي لحالة الأحرف | الأداء | الأفضل لـ |
|---|---|---|---|---|
LIKE |
col LIKE '%pattern%' |
نعم | سريع | مطابقة الأنماط مع تمييز حالة الأحرف |
ILIKE |
col ILIKE '%pattern%' |
لا | أبطأ | البحث دون تمييز حالة الأحرف |
if() |
if(cond, a, b) |
لا ينطبق | سريع | الشروط الثنائية البسيطة |
multiIf() |
multiIf(c1, r1, c2, r2, def) |
لا ينطبق | سريع | الشروط المتعددة |
CASE |
CASE WHEN ... THEN ... END |
لا ينطبق | سريع | منطق شرطي قياسي في SQL |
راجع "مطابقة الأنماط والتعبيرات الشرطية" للاطلاع على أمثلة الاستخدام.
تعبير يتضمن قيماً حرفية أو أعمدة أو استعلامات فرعية
يمكن أن يتضمن التعبير الذي يلي عبارة WHERE أيضاً قيماً حرفية، أو أعمدة، أو استعلامات فرعية، وهي عبارات SELECT متداخلة تُرجِع قيماً تُستخدم في الشروط.
| النوع | التعريف | التقييم | الأداء | المثال |
|---|---|---|---|---|
| قيمة حرفية | قيمة ثابتة | عند كتابة الاستعلام | الأسرع | WHERE price > 100 |
| عمود | مرجع إلى بيانات الجدول | لكل صف | سريع | WHERE price > cost |
| استعلام فرعي | عبارة SELECT متداخلة | وقت تنفيذ الاستعلام | يختلف | WHERE id IN (SELECT ...) |
يمكنك المزج بين القيم الحرفية والأعمدة والاستعلامات الفرعية في الشروط المعقدة:
-- Literal + Column
WHERE price > 100 AND category = 'Electronics'
-- Column + Subquery
WHERE price > (SELECT AVG(price) FROM products) AND in_stock = true
-- Literal + Column + Subquery
WHERE category = 'Electronics'
AND price < 500
AND id IN (SELECT product_id FROM bestsellers)
-- All three with logical operators
WHERE (price > 100 OR category IN (SELECT category FROM featured))
AND in_stock = true
AND name LIKE '%Special%'أمثلة
التحقق من NULL
الاستعلامات التي تتضمن قيماً من نوع NULL:
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x;
INSERT INTO t_null VALUES (1, NULL), (2, 3);
SELECT * FROM t_null WHERE y IS NULL;
SELECT * FROM t_null WHERE y != 0;┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
└───┴──────┘
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘تصفية البيانات باستخدام العوامل المنطقية
بالنظر إلى الجدول والبيانات التاليين:
CREATE TABLE products (
id UInt32,
name String,
price Float32,
category String,
in_stock Bool
) ENGINE = MergeTree()
ORDER BY id;
INSERT INTO products VALUES
(1, 'Laptop', 999.99, 'Electronics', true),
(2, 'Mouse', 25.50, 'Electronics', true),
(3, 'Desk', 299.00, 'Furniture', false),
(4, 'Chair', 150.00, 'Furniture', true),
(5, 'Monitor', 350.00, 'Electronics', true),
(6, 'Lamp', 45.00, 'Furniture', false);1. AND - يجب أن يكون كلا الشرطين true:
SELECT * FROM products
WHERE category = 'Electronics' AND price < 500; ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴───────┴─────────────┴──────────┘2. OR - يجب أن يتحقق شرط واحد على الأقل:
SELECT * FROM products
WHERE category = 'Furniture' OR price > 500; ┌─id─┬─name───┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 3 │ Desk │ 299 │ Furniture │ false │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 6 │ Lamp │ 45 │ Furniture │ false │
└────┴────────┴────────┴─────────────┴──────────┘3. NOT - ينفي شرطًا:
SELECT * FROM products
WHERE NOT in_stock; ┌─id─┬─name─┬─price─┬─category──┬─in_stock─┐
1. │ 3 │ Desk │ 299 │ Furniture │ false │
2. │ 6 │ Lamp │ 45 │ Furniture │ false │
└────┴──────┴───────┴───────────┴──────────┘4. XOR - يجب أن يتحقق شرط واحد فقط (وليس كلاهما):
SELECT *
FROM products
WHERE xor(price > 200, category = 'Electronics') ┌─id─┬─name──┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 3 │ Desk │ 299 │ Furniture │ false │
└────┴───────┴───────┴─────────────┴──────────┘5. دمج عدة عوامل:
SELECT * FROM products
WHERE (category = 'Electronics' OR category = 'Furniture')
AND in_stock = true
AND price < 400; ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 4 │ Chair │ 150 │ Furniture │ true │
3. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴───────┴─────────────┴──────────┘6. استخدام صيغة الدوال:
SELECT * FROM products
WHERE and(or(category = 'Electronics', price > 100), in_stock); ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴────────┴─────────────┴──────────┘تكون صيغة الكلمات المفتاحية في SQL (AND, OR, NOT, XOR) أوضح للقراءة عمومًا، لكن صيغة الدوال قد تكون مفيدة في التعبيرات المعقدة أو عند إنشاء استعلامات ديناميكية.
استخدام أعمدة UInt8 كشرط
انطلاقًا من الجدول الوارد في مثال سابق، يمكنك استخدام اسم العمود مباشرةً كشرط:
SELECT * FROM products
WHERE in_stock ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴────────┴─────────────┴──────────┘استخدام معاملات المقارنة
تستخدم الأمثلة أدناه الجدول والبيانات من المثال أعلاه. حُذفت النتائج للإيجاز.
1. المساواة الصريحة مع true (= 1 أو = true):
SELECT * FROM products
WHERE in_stock = true;
-- or
WHERE in_stock = 1;2. المساواة الصريحة بـ false (= 0 أو = false):
SELECT * FROM products
WHERE in_stock = false;
-- or
WHERE in_stock = 0;3. عدم التساوي (!= 0 أو != false):
SELECT * FROM products
WHERE in_stock != false;
-- or
WHERE in_stock != 0;4. أكبر من:
SELECT * FROM products
WHERE in_stock > 0;5. أصغر من أو يساوي:
SELECT * FROM products
WHERE in_stock <= 0;6. الجمع بين شروط أخرى:
SELECT * FROM products
WHERE in_stock AND price < 400;7. استخدام المعامل IN:
في المثال أدناه، تمثّل (1, true) قيمة من النوع Tuple.
SELECT * FROM products
WHERE in_stock IN (1, true);يمكنك أيضًا استخدام مصفوفة لتحقيق ذلك:
SELECT * FROM products
WHERE in_stock IN [1, true];8. الخلط بين أساليب المقارنة:
SELECT * FROM products
WHERE category = 'Electronics' AND in_stock = true;مطابقة الأنماط والتعبيرات الشرطية
تستخدم الأمثلة أدناه الجدول والبيانات الواردين في المثال أعلاه. وحُذفت النتائج للاختصار.
أمثلة على LIKE
-- Find products with 'o' in the name
SELECT * FROM products WHERE name LIKE '%o%';
-- Result: Laptop, Monitor
-- Find products starting with 'L'
SELECT * FROM products WHERE name LIKE 'L%';
-- Result: Laptop, Lamp
-- Find products with exactly 4 characters
SELECT * FROM products WHERE name LIKE '____';
-- Result: Desk, Lampأمثلة على ILIKE
-- Case-insensitive search for 'LAPTOP'
SELECT * FROM products WHERE name ILIKE '%laptop%';
-- Result: Laptop
-- Case-insensitive prefix match
SELECT * FROM products WHERE name ILIKE 'l%';
-- Result: Laptop, Lampأمثلة على IF
-- Different price thresholds by category
SELECT * FROM products
WHERE if(category = 'Electronics', price < 500, price < 200);
-- Result: Mouse, Chair, Monitor
-- (Electronics under $500 OR Furniture under $200)
-- Filter based on stock status
SELECT * FROM products
WHERE if(in_stock, price > 100, true);
-- Result: Laptop, Chair, Monitor, Desk, Lamp
-- (In stock items over $100 OR all out-of-stock items)أمثلة على multiIf
-- Multiple category-based conditions
SELECT * FROM products
WHERE multiIf(
category = 'Electronics', price < 600,
category = 'Furniture', in_stock = true,
false
);
-- Result: Mouse, Monitor, Chair
-- (Electronics < $600 OR in-stock Furniture)
-- Tiered filtering
SELECT * FROM products
WHERE multiIf(
price > 500, category = 'Electronics',
price > 100, in_stock = true,
true
);
-- Result: Laptop, Chair, Monitor, Lampأمثلة على CASE
صيغة CASE البسيطة:
-- Different rules per category
SELECT * FROM products
WHERE CASE category
WHEN 'Electronics' THEN price < 400
WHEN 'Furniture' THEN in_stock = true
ELSE false
END;
-- Result: Mouse, Monitor, ChairCASE الشرطي:
-- Price-based tiered logic
SELECT * FROM products
WHERE CASE
WHEN price > 500 THEN in_stock = true
WHEN price > 100 THEN category = 'Electronics'
ELSE true
END;
-- Result: Laptop, Monitor, Mouse, Lamp