Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

SQLالدوال التجميعية

  • مفهوم الدوال التجميعية
  • تجهيز قاعدة البيانات التي سنطبق عليها
  • أمثلة على استخدام الدالة MIN()
  • أمثلة على استخدام الدالة MAX()
  • أمثلة على استخدام الدالة AVG()
  • أمثلة حول استخدام الدالة SUM()
  • أمثلة حول استخدام الدالة COUNT()

مفهوم الدوال التجميعية

الدوال التجميعية ( Aggregate Functions ) عبارة عن مجموعة دوال جاهزة يمكن استخدامها لإجراء عمليات حسابية على مجموعة من القيم و النتيجة في النهاية تكون عبارة عن قيمة واحدة.

في ما يلي الدوال التجميعية الأكثر أهمية و التي يمكن استخدامها في جميع أنواع قواعد البيانات.

الدالة استخدامها
MIN() ترجع أصغر قيمة موجودة في العمود.
MAX() ترجع أكبر قيمة موجودة في العمود.
AVG() ترجع القيمة المتوسطة للقيم الموجودة في العمود.
SUM() ترجع مجموع القيم الموجودة في العمود.
COUNT() ترجع عدد الأسطر الموجودة في الجدول الناتج من الإستعلام.

الدول MIN()، MAX()، AVG() و SUM() تتجاهل الحقول الفارغة التي قيمتها تساوي NULL.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

مثال

-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
DROP DATABASE IF EXISTS harmash;
-- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
CREATE DATABASE harmash;
-- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
USE harmash;
-- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
-- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
CREATE TABLE employees (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(20),
is_married BOOLEAN,
salary DECIMAL(7,2),
birthday Date
);
-- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
-- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
-- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
-- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها DROP DATABASE IF EXISTS harmash; -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها CREATE DATABASE harmash; -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات USE harmash; -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات CREATE TABLE employees ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(50), last_name VARCHAR(20), is_married BOOLEAN, salary DECIMAL(7,2), birthday Date ); -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23"); INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08"); INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12"); INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04"); INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27"); INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12"); INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10"); INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14"); INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12"); INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");

فيما يلي البيانات التي قمنا بإضافتها في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة على استخدام الدالة MIN()

الإستعلام التالي يقوم بجلب أدنى راتب يتم إعطاؤه للموظف في الشركة.
أي سنعرض أصغر قيمة موجودة في العمود salary.

المثال الأول

SELECT MIN(salary) AS 'Lowest Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أصغر قيمة في العامود
FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT MIN(salary) AS 'Lowest Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أصغر قيمة في العامود FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Lowest Salary
700.00

الإستعلام التالي يقوم بجلب أقدم تاريخ ميلاد موضوع لموظف في الشركة.
أي سنعرض أقدم تاريخ موجود في العمود birthday.

المثال الثاني

SELECT MIN(birthday) AS 'Oldest Date' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أقدم تاريخ في العامود
FROM employees; -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT MIN(birthday) AS 'Oldest Date' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أقدم تاريخ في العامود FROM employees; -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Oldest Date
1985-09-20

أمثلة على استخدام الدالة MAX()

الإستعلام التالي يقوم بجلب أعلى راتب يتم إعطاؤه للموظف في الشركة.
أي سنعرض أكبر قيمة موجودة في العمود salary.

المثال الأول

SELECT MAX(salary) AS 'Highest Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أكبر قيمة في العامود
FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT MAX(salary) AS 'Highest Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أكبر قيمة في العامود FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Highest Salary
1000.00

الإستعلام التالي يقوم بجلب أحدث تاريخ ميلاد موضوع لموظف في الشركة.
أي سنعرض أحدث تاريخ موجود في العمود birthday.

المثال الثاني

SELECT MAX(birthday) AS 'Latest Date' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أحدث تاريخ في العامود
FROM employees; -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT MAX(birthday) AS 'Latest Date' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أحدث تاريخ في العامود FROM employees; -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Latest Date
1995-03-10

أمثلة على استخدام الدالة AVG()

الإستعلام التالي يقوم بعرض متوسط الرواتب التي يتم إعطاءها للموظفين في الشركة كل شهر.
ما فعلناه لحساب متوسط الرواتب هو حساب متوسط جميع الرواتب الموضوعة في العمود salary.

المثال الأول

SELECT AVG(salary) AS 'Average Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT AVG(salary) AS 'Average Salary' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Average Salary
842.500000

العدد يظهر فيه 6 أرقام بعد الفاصلة لأن عمليات الجمع و القسمة التي أجرتها الدالة AVG() أدت إلى إرجاع النتيجة بالنوع FLOAT.


الإستعلام التالي هو نفس الإستعلام السابق تماماً مع فرق واحد و هو أننا قمنا بتعديل شكل القيمة التي سيتم إرجاعها في النتيجة بواسطة الدالة FORMAT() حتى تظهر رقمين فقط بعد الفاصلة لتكون مشابهة للرواتب المخزنة في العمود salary.

المثال الثاني

SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)' -- مع تغيير شكل القيمة التي سترجع و إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)' -- مع تغيير شكل القيمة التي سترجع و إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Average Salary ($)
842.50

الإستعلام التالي يقوم بعرض متوسط الرواتب التي يتم إعطاءها للموظفين المتزوجين فقط كل شهر.
ما فعلناه لحساب متوسط رواتب المتزوجين فقط هو وضع شرط أن قيمة الحقل is_married يجب أن تساوي 1 في السطر الذي سيتم حساب أخذ قيمة salary منه. كما أننا قمنا بتعديل شكل القيمة التي سيتم إرجاعها في النتيجة بواسطة الدالة FORMAT() حتى تظهر رقمين فقط بعد الفاصلة لتكون مشابهة للرواتب المخزنة في العمود salary.

المثال الثالث

SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)' -- مع تغيير شكل القيمة التي سترجع و إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
FROM employees -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
WHERE is_married = 1; -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل
SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)' -- مع تغيير شكل القيمة التي سترجع و إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود FROM employees -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود WHERE is_married = 1; -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل

النتيجة

Average Salary For Married ($)
910.50

أمثلة حول استخدام الدالة SUM()

الإستعلام التالي يقوم بعرض إجمالي الرواتب التي يتم إعطاءها للموظفين في الشركة كل شهر.
ما فعلناه لحساب إجمالي الرواتب هو حساب ناتج جمع جميع الرواتب الموضوعة في العمود salary.

المثال الأول

SELECT SUM(salary) AS 'Total Salaries ($)' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود
FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT SUM(salary) AS 'Total Salaries ($)' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود FROM employees; -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

النتيجة

Total Salaries ($)
8425.00

الإستعلام التالي يقوم بعرض إجمالي الرواتب التي يتم إعطاءها للموظفين المتزوجين كل شهر.
ما فعلناه لحساب إجمالي رواتب الموظفين المتزوجين فقط هو وضع شرط أن الحقل is_married يجب أن يساوي 1 في السطر الذي سيتم حساب أخذ قيمة salary منه.

المثال الثاني

SELECT SUM(salary) AS 'Total Salaries For Married ($)' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود
FROM employees -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
WHERE is_married = 1; -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل
SELECT SUM(salary) AS 'Total Salaries For Married ($)' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود FROM employees -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود WHERE is_married = 1; -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل

النتيجة

Total Salaries For Married ($)
4550.00

أمثلة حول استخدام الدالة COUNT()

الإستعلام التالي يقوم بعرض إجمالي عدد الموظفين في الشركة.
ما فعلناه لحساب عدد الموظفين هو حساب كم رقم id يوجد في الجدول لأن هذا العمود لا يمكن أن يكون فيه حقول فارغة و هذا ما نحتاجه بالضبط هنا.

المثال الأول

SELECT COUNT(id) AS 'Total Employees' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة id هنا قمنا بجلب عدد القيم الموجودة في العامود
FROM employees; -- id هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
SELECT COUNT(id) AS 'Total Employees' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة id هنا قمنا بجلب عدد القيم الموجودة في العامود FROM employees; -- id هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود

يمكنك وضع الرمز * مكان الحقل id و لكن هذا الأسلوب لا ينصح به.

SELECT COUNT(*) AS 'Total Employees'
FROM employees;
SELECT COUNT(*) AS 'Total Employees' FROM employees;

النتيجة

Total Employees
10

الإستعلام التالي يقوم بعرض إجمالي عدد الموظفين المتزوجين الموجودين في جدول الموظفين.
ما فعلناه لحساب عدد الموظفين المتزوجين فقط هو وضع شرط أن قيمة الحقل is_married يجب أن تساوي 1.

المثال الثاني

SELECT COUNT(id) AS 'Total Married Employees' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة id هنا قمنا بجلب عدد القيم الموجودة في العامود
FROM employees; -- id هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
WHERE is_married = 1; -- يجب أن يساوي 1 حتى يتم حساب عدده is_married هنا قمنا بتحديد أن الحقل
SELECT COUNT(id) AS 'Total Married Employees' -- مع تغيير إسم العمود الذي سيتم عرضه في النتيجة id هنا قمنا بجلب عدد القيم الموجودة في العامود FROM employees; -- id هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود WHERE is_married = 1; -- يجب أن يساوي 1 حتى يتم حساب عدده is_married هنا قمنا بتحديد أن الحقل

النتيجة

Total Male Employees
5