الدرس 7 من 10

تصفية المجموعات

هدف الدرس

HAVING مقابل WHERE

01

الشرح

WHERE يصفّي الصفوف قبل التجميع، وHAVING يصفّي المجموعات بعده. فشرط على الطلب الواحد مكانه WHERE، وشرط على نتيجة التجميع مكانه HAVING.

لذلك يفشل WHERE COUNT(*) > 3: حين يُقرأ WHERE لم يحدث العدّ بعد. والصحيح HAVING COUNT(*) > 3.

والخطأ المعاكس أخطر لأنه صامت في SQLite: شرط الصفوف إن وُضع في HAVING لا يُخرج الصفّ من العدّ، فتظهر أرقام خاطئة بلا رسالة خطأ.

02

المطلوب

اعرض city وorders_count للمدن التي فيها طلبان أو أكثر، دون احتساب الطلبات التي مبلغها أقلّ من 50.

معايير التصحيح

4 معايير
  1. العمودان city و orders_count
  2. كل مدينة فيها طلبان على الأقل
  3. ما دون 50 خارج العدّ، و50 داخله
  4. المدن المطابقة كلها ولا غيرها
الجداول المتاحة في هذا الدرس
CREATE TABLE orders (
  id       INTEGER PRIMARY KEY,
  customer TEXT    NOT NULL,
  city     TEXT    NOT NULL,
  amount   INTEGER NOT NULL,
  rating   INTEGER
);

INSERT INTO orders (customer, city, amount, rating) VALUES
  ('ليان', 'الرياض', 120, 5),
  ('خالد', 'جدة',    300, 4),
  ('ليان', 'الرياض',  80, NULL),
  ('ريم',  'الدمام',  45, 3),
  ('سارة', 'الرياض', 210, 5),
  ('خالد', 'جدة',     50, NULL),
  ('فهد',  'جدة',    150, 2),
  ('نورة', 'الرياض',  95, 4),
  ('عمر',  'مكة',    400, NULL),
  ('ليان', 'الرياض',  35, 4),
  ('ريم',  'الدمام', 130, NULL),
  ('سارة', 'الرياض',  70, 3);
query.sql
المخرجاتSQLite · sql.js

جارٍ تحميل SQLite…

–/4

يبدأ الفحص حين تجهز البيئة.

4 معايير في بطاقة «المطلوب».