الوحدة 13: SQL – لغة معالجة البيانات (DML)

تهدف هذه الوحدة إلى تمكين الطلاب من التعامل مع البيانات داخل قواعد البيانات من خلال أوامر DML: SELECT، INSERT، UPDATE، DELETE، واستخدام الدوال المدمجة وضم الجداول.

الهدف من الوحدة

تهدف هذه الوحدة إلى تمكين الطلاب من التعامل مع البيانات داخل قواعد البيانات من خلال أوامر DML (Data Manipulation Language): SELECT، INSERT، UPDATE، DELETE، واستخدام الدوال المدمجة وضم الجداول.

13.1 تعليمة SELECT

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

  • التعريف:

    تُستخدم تعليمة SELECT لاستخراج البيانات من جداول قاعدة البيانات. يمكنك تحديد الأعمدة التي تريدها، الجداول التي ستسترجع منها البيانات، والشروط التي يجب أن تستوفيها السجلات.

  • الصياغة الأساسية:
    
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition
    ORDER BY column1 ASC|DESC;
                                
    • column1, column2, ...: الأعمدة التي تريد استرجاعها. يمكنك استخدام * لاسترجاع جميع الأعمدة.
    • table_name: اسم الجدول الذي تريد استرجاع البيانات منه.
    • WHERE condition: (اختياري) يُستخدم لتصفية السجلات بناءً على شرط محدد.
    • ORDER BY column1 ASC|DESC: (اختياري) يُستخدم لفرز النتائج بترتيب تصاعدي (ASC) أو تنازلي (DESC) بناءً على عمود واحد أو أكثر.
مثال عملي:

لاستخراج أسماء الموظفين ورواتبهم من جدول Employees حيث الراتب أكبر من 5000، وترتيبهم أبجديًا حسب الاسم:


SELECT Name, Salary
FROM Employees
WHERE Salary > 5000
ORDER BY Name ASC;
                        

خيارات مهمة مع SELECT:

  • DISTINCT: تُستخدم لإرجاع القيم الفريدة فقط في عمود محدد، مما يزيل أي صفوف مكررة من مجموعة النتائج.
    SELECT DISTINCT City FROM Customers;
  • LIMIT (أو TOP في SQL Server): تُستخدم لتحديد العدد الأقصى من السجلات التي سيتم إرجاعها. مفيدة لتقليل الحمل على قاعدة البيانات.
    SELECT Name, Email FROM Employees LIMIT 10; -- لـ MySQL وPostgreSQL
    -- SELECT TOP 10 Name, Email FROM Employees; -- لـ SQL Server
  • LIKE: تُستخدم للبحث عن نمط محدد في عمود نصي باستخدام أحرف البدل (wildcard characters) مثل % (يمثل أي عدد من الأحرف) و _ (يمثل حرفًا واحدًا).
    SELECT ProductName FROM Products WHERE ProductName LIKE 'Laptop%'; -- المنتجات التي تبدأ بـ "Laptop"
    SELECT Email FROM Employees WHERE Email LIKE '%@example.com'; -- البريد الإلكتروني الذي ينتهي بـ "@example.com"

لمزيد من المعلومات حول تعليمة SELECT، يمكنك زيارة: SQL SELECT – W3Schools

13.2 تعليمة INSERT

تُستخدم تعليمة INSERT لإضافة بيانات جديدة إلى الجداول.

  • التعريف:

    تُستخدم تعليمة INSERT INTO لإضافة سجلات (صفوف) جديدة إلى جدول موجود في قاعدة البيانات.

  • الصياغة الأساسية:
    
    INSERT INTO table_name (column1, column2, column3, ...)
    VALUES (value1, value2, value3, ...);
                                
    • table_name: اسم الجدول الذي ستُضاف إليه البيانات.
    • (column1, column2, ...): (اختياري) قائمة الأعمدة التي ستُدخل فيها البيانات. إذا تم تضمين قيم لجميع الأعمدة بنفس الترتيب، يمكن حذف هذه القائمة.
    • (value1, value2, ...): القيم المقابلة للأعمدة المحددة. يجب أن تتطابق أنواع البيانات.
مثال عملي:

لإضافة موظف جديد إلى جدول Employees:


INSERT INTO Employees (EmployeeID, Name, Salary, HireDate, Email)
VALUES (1, 'علي', 6000, '2023-01-15', 'ali.a@example.com');
                        

إذا كنت تضيف قيمًا لجميع الأعمدة وبنفس الترتيب الذي تم تعريفها به في الجدول، يمكنك حذف قائمة الأعمدة:


-- إذا كان ترتيب الأعمدة في جدول Employees هو: EmployeeID, Name, Salary, HireDate, Email
INSERT INTO Employees
VALUES (2, 'سارة', 7500, '2022-03-01', 'sara.m@example.com');
                        

لمزيد من المعلومات حول تعليمة INSERT، يمكنك زيارة: SQL INSERT – W3Schools

13.3 تعليمة UPDATE

تُستخدم تعليمة UPDATE لتعديل البيانات الموجودة في جدول.

  • التعريف:

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

  • الصياغة الأساسية:
    
    UPDATE table_name
    SET column1 = value1, column2 = value2, ...
    WHERE condition;
                                
    • table_name: اسم الجدول الذي ستُعدّل بياناته.
    • SET column1 = value1, ...: يحدد الأعمدة الجديدة وقيمها.
    • WHERE condition: (اختياري) يُحدد السجلات التي سيتم تحديثها.
مثال عملي:

لتعديل راتب الموظف ذو الرقم 1 ليصبح 6500:


UPDATE Employees
SET Salary = 6500
WHERE EmployeeID = 1;
                        

لتحديث عدة أعمدة:


UPDATE Products
SET Price = 25.00, StockQuantity = 150
WHERE ProductID = 101;
                        
تحذير هام:

عدم استخدام جملة WHERE في تعليمة UPDATE سيؤدي إلى تحديث جميع السجلات في الجدول! هذا يمكن أن يؤدي إلى فقدان بيانات لا يمكن استعادتها.

لمزيد من المعلومات حول تعليمة UPDATE، يمكنك زيارة: SQL UPDATE – W3Schools

13.4 تعليمة DELETE

تُستخدم تعليمة DELETE لحذف سجلات من الجدول.

  • التعريف:

    تُستخدم تعليمة DELETE FROM لحذف صف واحد أو أكثر من السجلات من جدول في قاعدة البيانات.

  • الصياغة الأساسية:
    
    DELETE FROM table_name
    WHERE condition;
                                
    • table_name: اسم الجدول الذي ستُحذف منه البيانات.
    • WHERE condition: (اختياري) يُحدد السجلات التي سيتم حذفها.
مثال عملي:

لحذف الموظف ذو الرقم 1 من جدول Employees:


DELETE FROM Employees
WHERE EmployeeID = 1;
                        

لحذف جميع الطلبات التي تمت قبل تاريخ معين:


DELETE FROM Orders
WHERE OrderDate < '2023-01-01';
                        
تحذير هام:

عدم استخدام جملة WHERE في تعليمة DELETE سيؤدي إلى حذف جميع السجلات في الجدول! هذا يمكن أن يؤدي إلى فقدان بيانات لا يمكن استعادتها.

لمزيد من المعلومات حول تعليمة DELETE، يمكنك زيارة: SQL DELETE – W3Schools

13.5 الدوال المدمجة (Built-in Functions)

تُقدم SQL مجموعة غنية من الدوال المدمجة التي تُمكنك من إجراء عمليات حسابية، معالجة النصوص، التعامل مع التواريخ، وغيرها من العمليات مباشرة على البيانات المسترجعة.

  • التعريف:

    هي دوال مُعدة مسبقًا تُسهل العمليات الحسابية والمنطقية والتحويلية على البيانات في قواعد البيانات. تُستخدم غالبًا في جمل SELECT، WHERE، أو HAVING.

  • أمثلة شائعة على الدوال المجمعة (Aggregate Functions):
    • COUNT(): تُرجع عدد السجلات التي تطابق معيارًا محددًا.
      SELECT COUNT(*) AS TotalEmployees FROM Employees; -- عدد كل الموظفين
      SELECT COUNT(Email) FROM Employees; -- عدد الموظفين الذين لديهم بريد إلكتروني غير NULL
    • SUM(): تُرجع المجموع الكلي للقيم العددية في عمود.
      SELECT SUM(Salary) AS TotalSalaries FROM Employees; -- مجموع رواتب الموظفين
    • AVG(): تُرجع متوسط القيم العددية في عمود.
      SELECT AVG(Salary) AS AverageSalary FROM Employees; -- متوسط رواتب الموظفين
    • MIN(): تُرجع أصغر قيمة في عمود.
      SELECT MIN(Price) AS CheapestProduct FROM Products; -- أرخص منتج
    • MAX(): تُرجع أكبر قيمة في عمود.
      SELECT MAX(OrderDate) AS LatestOrderDate FROM Orders; -- أحدث تاريخ طلب
    ملاحظة: تستخدم الدوال المجمعة (Aggregate Functions) غالبًا مع جملة GROUP BY لتطبيق الدالة على مجموعات من السجلات بدلاً من الجدول بأكمله.
    SELECT DepartmentID, AVG(Salary) AS AvgDeptSalary FROM Employees GROUP BY DepartmentID;
  • أمثلة على دوال السلاسل النصية (String Functions):
    • CONCAT(str1, str2, ...): لدمج سلاسل نصية.
    • LENGTH(string) (أو LEN()): لإرجاع طول السلسلة.
    • LOWER(string) / UPPER(string): لتحويل النص إلى أحرف صغيرة / كبيرة.
  • أمثلة على دوال التاريخ والوقت (Date and Time Functions):
    • NOW() / CURRENT_DATE(): لإرجاع التاريخ والوقت الحاليين.
    • DATEDIFF(unit, start_date, end_date): لحساب الفرق بين تاريخين.

لمزيد من المعلومات حول دوال SQL، يمكنك زيارة: SQL Functions – W3Schools

13.6 ضم الجداول (Joining Tables)

تُستخدم عمليات الضم (JOINs) لدمج الصفوف من جدولين أو أكثر بناءً على عمود مشترك بينهما (عادةً مفتاح رئيسي ومفتاح خارجي)، مما يُمكنك من استرجاع بيانات مترابطة مخزنة عبر جداول متعددة.

  • التعريف:

    عملية تُستخدم لربط جدولين أو أكثر في استعلام واحد للحصول على بيانات مترابطة. تتم عملية الربط عادةً عن طريق مقارنة القيم في عمود مشترك (أو أكثر) بين الجداول.

  • أنواع JOIN الشائعة:
    • INNER JOIN:

      يُرجع فقط الصفوف التي تتطابق فيها القيم في كلا الجدولين. هذا هو النوع الأكثر شيوعًا من الضم.

    • LEFT JOIN (أو LEFT OUTER JOIN):

      يُرجع جميع الصفوف من الجدول الأيسر، بالإضافة إلى الصفوف المطابقة من الجدول الأيمن. إذا لم يكن هناك تطابق في الجدول الأيمن، فستظهر قيم NULL للأعمدة من الجدول الأيمن.

    • RIGHT JOIN (أو RIGHT OUTER JOIN):

      يُرجع جميع الصفوف من الجدول الأيمن، بالإضافة إلى الصفوف المطابقة من الجدول الأيسر. إذا لم يكن هناك تطابق في الجدول الأيسر، فستظهر قيم NULL للأعمدة من الجدول الأيسر. (هو عكس LEFT JOIN).

    • FULL OUTER JOIN (أو FULL JOIN):

      يُرجع جميع الصفوف من كلا الجدولين. إذا لم يكن هناك تطابق في أحد الجدولين، فستظهر قيم NULL للأعمدة من الجدول الآخر.

مثال عملي:

لنفترض أن لدينا جداول: Students (StudentID, NameCourses (CourseID, CourseName)، و Enrollments (EnrollmentID, StudentID, CourseID, Grade).

لإظهار أسماء الطلاب والمقررات التي سجلوها (لجلب بيانات من ثلاثة جداول):


SELECT
    S.Name AS StudentName,
    C.CourseName
FROM
    Enrollments E
INNER JOIN
    Students S ON E.StudentID = S.StudentID
INNER JOIN
    Courses C ON E.CourseID = C.CourseID;
                        

في هذا المثال:

  • Enrollments هو الجدول المركزي الذي يربط الطلاب بالمقررات.
  • INNER JOIN Students ON E.StudentID = S.StudentID: يربط جدول Enrollments بجدول Students باستخدام StudentID.
  • INNER JOIN Courses ON E.CourseID = C.CourseID: يربط جدول Enrollments بجدول Courses باستخدام CourseID.
  • AS يُستخدم لإعطاء أسماء مستعارة (aliases) للأعمدة والجداول لتسهيل القراءة وتجنب تضارب الأسماء.

لمزيد من المعلومات حول ضم الجداول (JOINs)، يمكنك زيارة: SQL JOIN – W3Schools

13.7 مصطلحات أساسية (Key Terms)

المصطلح (الإنجليزية) المصطلح (العربية) التعريف
DML (Data Manipulation Language) لغة معالجة البيانات جزء من SQL يُستخدم لاسترجاع، إضافة، تعديل، وحذف البيانات في قاعدة البيانات.
SELECT تحديد / استعلام أمر DML لاستخراج البيانات من جدول أو أكثر.
INSERT INTO إدخال في أمر DML لإضافة صفوف جديدة من البيانات إلى جدول.
UPDATE تحديث أمر DML لتعديل البيانات الموجودة في جدول.
DELETE FROM حذف من أمر DML لحذف صفوف من البيانات من جدول.
WHERE Clause جملة WHERE تُستخدم لتصفية السجلات بناءً على شرط محدد في أوامر SELECT, UPDATE, DELETE.
ORDER BY ترتيب حسب تُستخدم لفرز مجموعة النتائج بترتيب تصاعدي أو تنازلي.
DISTINCT فريد تُستخدم لإرجاع قيم غير مكررة فقط.
LIMIT / TOP تحديد / أعلى تُستخدم لتحديد العدد الأقصى من السجلات المراد إرجاعها.
LIKE يشبه تُستخدم للبحث عن نمط محدد في عمود نصي.
Built-in Functions الدوال المدمجة دوال جاهزة في SQL لإجراء عمليات على البيانات (مثل COUNT, SUM, AVG, MIN, MAX).
Aggregate Functions الدوال المجمعة دوال تُجري عمليات حسابية على مجموعة من الصفوف وتُرجع قيمة واحدة (مثل COUNT, SUM, AVG).
GROUP BY تجميع حسب تُستخدم لتجميع الصفوف التي تحتوي على نفس القيم في أعمدة محددة في مجموعات.
JOIN ضم / ربط عملية دمج الصفوف من جدولين أو أكثر بناءً على عمود مشترك.
INNER JOIN ضم داخلي يُرجع الصفوف المتطابقة فقط من كلا الجدولين.
LEFT JOIN ضم أيسر يُرجع جميع الصفوف من الجدول الأيسر والصفوف المتطابقة من الجدول الأيمن.
RIGHT JOIN ضم أيمن يُرجع جميع الصفوف من الجدول الأيمن والصفوف المتطابقة من الجدول الأيسر.
FULL OUTER JOIN ضم خارجي كامل يُرجع جميع الصفوف من كلا الجدولين، مع قيم NULL للصفوف غير المتطابقة.
Alias اسم مستعار اسم مؤقت يُعطى لجدول أو عمود في استعلام SQL.

ملخص الوحدة

  • لغة معالجة البيانات (DML) هي جزء أساسي من SQL للتعامل مع البيانات.
  • أوامر DML الرئيسية هي SELECT (لاسترجاع البيانات)، INSERT (لإضافة بيانات)، UPDATE (لتعديل بيانات)، وDELETE (لحذف بيانات).
  • جملة WHERE حاسمة لتصفية السجلات في أوامر SELECT، UPDATE، وDELETE لمنع العمليات غير المقصودة.
  • الدوال المدمجة (مثل COUNT، SUM، AVG، MIN، MAX) تُمكن من إجراء عمليات حسابية وتحويلات على البيانات.
  • عمليات ضم الجداول (JOINs) مثل INNER JOIN وLEFT JOIN تُستخدم لدمج البيانات من جداول متعددة بناءً على العلاقات بينها.

13.8 تمارين مقترحة (Suggested Exercises)

استخدم قاعدة بيانات افتراضية تحتوي على الجداول التالية لتطبيق التمارين:

جدول Employees:

EmployeeID (INT PK) Name (VARCHAR) Salary (DECIMAL) DepartmentID (INT FK)
1أحمد علي6000.0010
2سارة محمد7500.0020
3فهد خالد5500.0010
4نور يوسف8000.0030

جدول Departments:

DepartmentID (INT PK) DepartmentName (VARCHAR)
10الموارد البشرية
20التسويق
30التطوير

جدول Courses:

CourseID (INT PK) CourseName (VARCHAR) Credits (INT)
101مقدمة في قواعد البيانات3
102البرمجة بلغة بايثون4

  1. تعليمة SELECT:
    اكتب استعلام SQL لاستخراج Name وSalary لجميع الموظفين من جدول Employees، ورتب النتائج بترتيب تنازلي حسب Salary، ثم تصاعدي حسب Name.
  2. تعليمة INSERT:
    أضف سجلًا جديدًا إلى جدول Courses بالمعلومات التالية: CourseID = 103، CourseName = 'أساسيات الأمن السيبراني'، Credits = 3.
  3. تعليمة UPDATE:
    قم بتعديل راتب الموظف ذو EmployeeID = 2 في جدول Employees ليصبح 8200.00.
  4. تعليمة DELETE:
    اكتب استعلامًا لحذف الموظف ذو EmployeeID = 4 من جدول Employees. (افترض أنه لا يوجد تكامل مرجعي يمنع الحذف أو قم بتعطيله مؤقتًا لأغراض التمرين).
  5. الدوال المدمجة:
    استخدم دالة AVG() لحساب متوسط رواتب الموظفين في كل قسم. يجب أن يظهر الاستعلام DepartmentID ومتوسط الراتب لكل قسم.
  6. ضم الجداول (JOIN):
    صمم استعلام INNER JOIN بين جدولي Employees وDepartments لإظهار EmployeeID، Name، وDepartmentName لجميع الموظفين.
  7. ضم الجداول (LEFT JOIN):
    صمم استعلام LEFT JOIN بين جدولي Departments وEmployees. أظهر DepartmentName وName لجميع الأقسام، مع إظهار الموظفين المرتبطين بها. (يجب أن تُظهر الأقسام التي ليس لها موظفين أيضًا).