لماذا ينجح EXISTS مع COUNT حتى عندما لا توجد سجلات مطابقة؟

متقدمقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

من الأخطاء الدقيقة كتابة EXISTS حول استعلام يستخدم COUNT(*) دون GROUP BY أو HAVING، مع الاعتقاد أنه يفحص وجود السجلات الأصلية. هذا الاستعلام التجميعي يعيد صفًا واحدًا يحتوي على العدد، حتى إذا كان العدد صفرًا. ولأن EXISTS يفحص وجود الصف، يصبح الشرط متحققًا.

لا يفحص الاختبار ما إذا كانت القيمة المعروضة أكبر من صفر. إنه يرى صف نتيجة التجميع فقط. إذا كان المطلوب وجود طلب مطابق، فاستخدم اختيارًا عاديًا مثل SELECT 1 مع شروط المطابقة. ويمكن أيضًا مقارنة نتيجة العد بالصفر، لكن ذلك يعبر عن الاختبار بطريقة مختلفة.

مثال

SELECT EXISTS (
  SELECT COUNT(*)
  FROM (SELECT 1 AS id) AS t
  WHERE t.id = 99
) AS has_result_row;

وجود HAVING قد يستبعد صف التجميع، كما أن التجميع حسب عمود يغير شكل النتائج. لذلك ينطبق هذا الفخ على البنية المحددة المذكورة، وليس على كل استخدام لدوال التجميع.

باختصار: داخل EXISTS، صف يحمل العدد صفرًا يظل صفًا موجودًا ويحقق اختبار الوجود.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

أي معرّفات يعيدها الاستعلام التالي؟

CREATE TABLE customers (id INT PRIMARY KEY);
CREATE TABLE orders (id INT PRIMARY KEY, customer_id INT NOT NULL);
INSERT INTO customers (id) VALUES (1), (2);
INSERT INTO orders (id, customer_id) VALUES (10, 1);

SELECT c.id
FROM customers AS c
WHERE EXISTS (
  SELECT COUNT(*)
  FROM orders AS o
  WHERE o.customer_id = c.id
)
ORDER BY c.id;