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