← يتطلب: قواعد البيانات الكائنية الأساسيات مبتدئ ⏱ 6 ساعات الدورة 04

SQL على منصة آيريس

SQL on InterSystems IRIS

🎯 أهداف التعلم

1فهم كيفية تعريف الجداول وإدارتها عبر SQL
2تعلم كتابة استعلامات SELECT المتقدمة
3فهم JOIN وأنواعه المختلفة
4تعلم إنشاء الإجراءات المخزنة (Stored Procedures)
5فهم الفهارس وكيفية تحسين الاستعلامات
6تعلم استخدام الدوال المدمجة في IRIS SQL
01

تعريف الجداول وإدارتها

في منصة IRIS، يمكنك إنشاء الجداول إما عبر SQL مباشرة أو عبر تعريف فئة ObjectScript مع خاصية [DdlAllowed].

-- إنشاء جدول الموظفين
CREATE TABLE HR.Employee (
    ID INT IDENTITY PRIMARY KEY,
    EmployeeCode VARCHAR(20) NOT NULL UNIQUE,
    FullName VARCHAR(150) NOT NULL,
    Email VARCHAR(200),
    Department VARCHAR(50),
    Position VARCHAR(100),
    Salary DECIMAL(12,2),
    HireDate DATE DEFAULT CURRENT_DATE,
    IsActive BOOLEAN DEFAULT TRUE
)

-- إضافة عمود جديد
ALTER TABLE HR.Employee ADD Phone VARCHAR(20)

-- إنشاء فهرس
CREATE INDEX idx_dept ON HR.Employee (Department)
CREATE INDEX idx_salary ON HR.Employee (Salary DESC)

-- حذف جدول
-- DROP TABLE HR.Employee

-- عرض هيكل الجدول
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'HR' AND TABLE_NAME = 'Employee'
ℹ️ معلومة

في IRIS، كل جدول SQL يقابل فئة ObjectScript. يمكنك رؤية الفئة المقابلة من خلال Management Portal.

02

استعلامات SELECT المتقدمة

تدعم IRIS SQL مجموعة كاملة من أوامر الاستعلام المتقدمة.

-- استعلام مع شروط متعددة
SELECT FullName, Department, Salary
FROM HR.Employee
WHERE Department IN ('تقنية المعلومات', 'الموارد البشرية')
  AND Salary BETWEEN 5000 AND 15000
  AND IsActive = 1
ORDER BY Salary DESC

-- استخدام الدوال المدمجة
SELECT 
    FullName,
    UPPER(Department) AS DeptUpper,
    LENGTH(FullName) AS NameLength,
    COALESCE(Email, 'غير محدد') AS Email,
    DATEDIFF('year', HireDate, CURRENT_DATE) AS YearsEmployed,
    FORMAT(Salary, 'N2') AS FormattedSalary
FROM HR.Employee

-- استعلام مع GROUP BY
SELECT 
    Department,
    COUNT(*) AS EmpCount,
    AVG(Salary) AS AvgSalary,
    MIN(Salary) AS MinSalary,
    MAX(Salary) AS MaxSalary,
    SUM(Salary) AS TotalSalary
FROM HR.Employee
WHERE IsActive = 1
GROUP BY Department
HAVING COUNT(*) > 3
ORDER BY AvgSalary DESC

-- استعلام فرعي (Subquery)
SELECT FullName, Salary, Department
FROM HR.Employee
WHERE Salary > (
    SELECT AVG(Salary) FROM HR.Employee
    WHERE Department = 'تقنية المعلومات'
)
ORDER BY Salary DESC
03

JOIN وأنواعه

تُستخدم JOIN لربط البيانات من جداول متعددة.

-- INNER JOIN: فقط السجلات المتطابقة
SELECT 
    e.FullName,
    e.Department,
    d.ManagerName
FROM HR.Employee e
INNER JOIN HR.Department d ON e.Department = d.DeptName

-- LEFT JOIN: جميع الموظفين مع الأقسام إن وجدت
SELECT 
    e.FullName,
    COALESCE(d.DeptName, 'غير محدد') AS Department
FROM HR.Employee e
LEFT JOIN HR.Department d ON e.Department = d.DeptName

-- SELF JOIN: مقارنة الموظفين في نفس القسم
SELECT 
    e1.FullName AS Employee1,
    e2.FullName AS Employee2,
    e1.Department
FROM HR.Employee e1
INNER JOIN HR.Employee e2 ON e1.Department = e2.Department
WHERE e1.ID < e2.ID

-- JOIN متعدد الجداول
SELECT 
    e.FullName,
    d.DeptName,
    p.ProjectName,
    t.TaskName
FROM HR.Employee e
LEFT JOIN HR.Department d ON e.Department = d.DeptName
LEFT JOIN Projects.Assignment a ON e.ID = a.EmployeeID
LEFT JOIN Projects.Project p ON a.ProjectID = p.ID
LEFT JOIN Projects.Task t ON p.ID = t.ProjectID
04

الإجراءات المخزنة (Stored Procedures)

الإجراءات المخزنة هي مجموعات من أوامر SQL/ObjectScript تُخزن في قاعدة البيانات وتُنفذ عند استدعائها.

-- إنشاء إجراء مخزن لحساب الراتب السنوي
CREATE PROCEDURE HR.CalculateAnnualSalary(
    IN empID INT,
    OUT annualSalary DECIMAL(14,2)
)
LANGUAGE OBJECTSCRIPT
{
    &sql(SELECT Salary * 12 INTO :annualSalary 
         FROM HR.Employee WHERE ID = :empID)
    IF SQLCODE '= 0 {
        SET annualSalary = 0
    }
}

-- إجراء لإرجاع قائمة الموظفين
CREATE PROCEDURE HR.GetEmployeesByDept(
    IN deptName VARCHAR(50)
)
RETURNS TABLE (FullName VARCHAR(150), Salary DECIMAL(12,2))
LANGUAGE OBJECTSCRIPT
{
    SET query = "SELECT FullName, Salary FROM HR.Employee WHERE Department = ? ORDER BY Salary DESC"
    SET tStatement = ##class(%SQL.Statement).%New()
    SET tStatus = tStatement.%Prepare(query)
    SET result = tStatement.%Execute(deptName)
    QUIT result
}

-- استدعاء الإجراء
CALL HR.GetEmployeesByDept('تقنية المعلومات')
05

تحسين الاستعلامات

تحسين أداء الاستعلامات أمر حاسم في بيئات الإنتاج.

-- استخدام EXPLAIN لخطة التنفيذ
EXPLAIN SELECT * FROM HR.Employee WHERE Department = 'تقنية المعلومات'

-- استخدام فهارس COVERING INDEX
CREATE INDEX idx_cover ON HR.Employee (Department) 
INCLUDE (FullName, Salary)

-- تجنب SELECT *
-- بدلاً من:
SELECT * FROM HR.Employee WHERE IsActive = 1
-- استخدم:
SELECT ID, FullName, Department FROM HR.Employee WHERE IsActive = 1

-- استخدام TOP لتقليل النتائج
SELECT TOP 10 FullName, Salary
FROM HR.Employee
WHERE IsActive = 1
ORDER BY Salary DESC

-- استخدام EXISTS بدلاً من IN للبيانات الكبيرة
SELECT e.FullName
FROM HR.Employee e
WHERE EXISTS (
    SELECT 1 FROM HR.Department d 
    WHERE d.DeptName = e.Department AND d.Budget > 100000
)
⚠️ تنبيه

استخدم EXPLAIN لمراجعة خطة التنفيذ قبل نشر الاستعلامات في بيئة الإنتاج. تأكد من أن الاستعلام يستخدم الفهارس المتاحة.

📝 اختبار التحقق

1 ما هو الربط المستخدم لدمج البيانات من جداول متعددة؟
A MERGE
B JOIN
C COMBINE
D LINK
💡 الشرح

JOIN هو الأمر المستخدم لدمج البيانات من جداول متعددة في SQL.

2 أي نوع JOIN يُرجع جميع السجلات من الجدول الأيسر؟
A INNER JOIN
B RIGHT JOIN
C LEFT JOIN
D FULL JOIN
💡 الشرح

LEFT JOIN يُرجع جميع السجلات من الجدول الأيسر والسجلات المتطابقة من الجدول الأيمن.

3 ما هو الغرض من الإجراءات المخزنة؟
A إنشاء جداول جديدة
B تخزين مجموعة أوامر SQL للتنفيذ المتكرر
C حذف البيانات
D نسخ قاعدة البيانات
💡 الشرح

الإجراءات المخزنة تُخزن مجموعة أوامر SQL/ObjectScript للتنفيذ المتكرر والمحسّن.

💡 النقاط الرئيسية

  • IRIS SQL يدعم جميع أوامر SQL القياسية مع إضافات خاصة
  • كل جدول SQL يقابل فئة ObjectScript
  • JOIN يربط البيانات من جداول متعددة
  • الإجراءات المخزنة تحسّن أداء العمليات المتكررة
  • استخدم EXPLAIN لتحليل خطط التنفيذ