fbpx
SQL

تعلم لغة الاستعلام البنائية ( SQL ) – الدرس العاشر The HAVING statement



عبارة HAVING هي جزء أساسي من Group by حسب الاستعلام ، وهي مطابقة تقريبًا لعبارة WHERE ، ولكنها تعمل في الحقول المجمعة بعد مرحلة التجميع ، في حين تقوم جملة WHERE بتصفية مجموعة البيانات قبل عملية التجميع.

لإعطاء مثال ، ستقوم عبارة WHERE في GROUP BY فقط بتجميع الحقول التي تطابق المعايير:

CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);

INSERT INTO grades (name, class, grade) VALUES
    ("Ahmad", 1, 97), ("Walid", 1, 88), ("Amel", 1, 98), ("Yacine", 1, 82), ("Hicham", 1, Khaled),
    ("Jamal", 2, 93), ("Sofian", 2, 82), ("Karim", 2, 87), ("Maissa", 2, 99), ("Farid", 2, 79);

SELECT class, AVG(grade) 
FROM grades 
WHERE grade > 85 
GROUP BY class;

سنحصل على النتيجة التالية عند التشغيل

1|94.3333333333333
2|93.0

ستقوم عبارة HAVING بتصفية مجموعة البيانات المجمعة الناتجة باستخدام نتيجة التجميع:

CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);

INSERT INTO grades (name, class, grade) VALUES
    ("Ahmad", 1, 97), ("Walid", 1, 88), ("Amel", 1, 98), ("Yacine", 1, 82), ("Hicham", 1, Khaled),
    ("Jamal", 2, 93), ("Sofian", 2, 82), ("Karim", 2, 87), ("Maissa", 2, 99), ("Farid", 2, 79);

SELECT class, AVG(grade) 
FROM grades 
GROUP BY class
HAVING AVG(grade) > 90;

سنحصل على النتيجة التالية عند التشغيل

1|91.25

لاحظ أنه في هذا الاستعلام المحدد ، لم يغير الاستعلام الذي تمت تصفيته WHERE عدد الفصول المجمعة (نظرًا لأن الفلتر احتفظ بطالب واحد على الأقل من كل فصل دراسي) ، ولكن استعلام HAVING الذي تمت تصفيته أزال أحد الفصول الدراسية التي لم تنجح متوسط الدرجة.

يمكنك بالطبع الجمع بين كل من WHERE و HAVING للحصول على النتيجة التي تريدها

تمرين

ابحث عن الدرجة القصوى لجميع الفصول التي تضم 3 طلاب على الأقل.

CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);

INSERT INTO grades (name, class, grade) VALUES
    ("Ahmad", 1, 97), ("Walid", 1, 88),
    ("Jamal", 2, 93), ("Sofian", 2, 82), ("Karim", 2, 87), ("Maissa", 2, 99), ("Farid", 2, 79),
    ("Yousef", 3, 91), ("Bilal", 3, 84), ("Oussama", 3, 97);

- اكتب الرمز الخاص بك هنا    

الحل

CREATE TABLE grades (name TEXT, class INTEGER, grade INTEGER);

INSERT INTO grades (name, class, grade) VALUES
    ("Ahmad", 1, 97), ("Walid", 1, 88),
    ("Jamal", 2, 93), ("Sofian", 2, 82), ("Karim", 2, 87), ("Maissa", 2, 99), ("Farid", 2, 79),
    ("Yousef", 3, 91), ("Bilal", 3, 84), ("Oussama", 3, 97);

- اكتب الرمز الخاص بك هنا
SELECT class, MAX(grade) 
FROM grades 
GROUP BY class
HAVING COUNT(name) >= 3;

سنحصل على النتيجة التالية عند التشغيل

2|99
3|97

الدرس الحادي عشر






Leave a Reply