الدرس 7 من 10
تصفية المجموعات
- 12 دقيقة
- 4 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
HAVING مقابل WHERE
01
الشرح
WHERE يصفّي الصفوف قبل التجميع، وHAVING يصفّي المجموعات بعده. فشرط على الطلب الواحد مكانه WHERE، وشرط على نتيجة التجميع مكانه HAVING.
لذلك يفشل WHERE COUNT(*) > 3: حين يُقرأ WHERE لم يحدث العدّ بعد. والصحيح HAVING COUNT(*) > 3.
والخطأ المعاكس أخطر لأنه صامت في SQLite: شرط الصفوف إن وُضع في HAVING لا يُخرج الصفّ من العدّ، فتظهر أرقام خاطئة بلا رسالة خطأ.
02
المطلوب
اعرض city وorders_count للمدن التي فيها طلبان أو أكثر، دون احتساب الطلبات التي مبلغها أقلّ من 50.
معايير التصحيح
4 معايير- العمودان city و orders_count
- كل مدينة فيها طلبان على الأقل
- ما دون 50 خارج العدّ، و50 داخله
- المدن المطابقة كلها ولا غيرها
الجداول المتاحة في هذا الدرس
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);