الاستعلامات الفرعية والجداول المشتقة (Subqueries and Derived Tables) :
الاستعلامات
الفرعية، المعروفة أيضًا باسم الاستعلامات المدمجة، هي استعلامات مدمجة داخل
استعلام SQL آخر. إنها أدوات قوية في SQL تسمح بالحصول على البيانات وتلاحظ عمليات استرجاع البيانات القوية
والمعقدة. إليك نظرة عامة على الاستعلامات الفرعية والجداول المشتقة:
فهم الاستعلامات الفرعية (Subqueries):
الاستعلامات
الفرعية هي استعلامات مدمجة داخل استعلام SQL آخر، مما يسمح بالحصول على استعلامات معقدة وديناميكية.
هناك ثلاثة
أنواع رئيسية من الاستعلامات الفرعية:
الاستعلام الفرعي المقياس(Scalar Subquery): يعيد قيمة واحدة.
الاستعلام الفرعي للعمود (Column Subquery): يعيد عمودًا واحدًا من صفوف متعددة.
الاستعلام الفرعي للصف(Row Subquery): يعيد صفًا واحدًا من أعمدة متعددة.
استخدام
الاستعلامات الفرعية:
يمكن استخدام
الاستعلامات الفرعية في أجزاء مختلفة من عبارة SQL، بما في ذلك عبارات SELECT و WHERE و FROM.
في عبارة SELECT، يمكن استخدام الاستعلام الفرعي لحساب قيمة تظهر كجزء من مجموعة
النتائج.
في عبارة WHERE، يمكن للاستعلام الفرعي تصفية الصفوف المسترجعة بواسطة الاستعلام
الرئيسي بناءً على شروط معينة.
في عبارة FROM، يمكن للاستعلام الفرعي أن يكون كجدول مشتق، مما يوفر مجموعة
بيانات مؤقتة للتلاعب اللاحق.
مقدمة عن
الجداول المشتقة:
الجدول المشتق،
المعروف أيضًا باسم العرض المتضمن أو الاستعلام في عبارة FROM، هو استعلام فرعي يظهر في عبارة FROM من الاستعلام الرئيسي.
يسمح لك
بمعالجة نتيجة الاستعلام الفرعي كجدول مؤقت، والذي يمكن استخدامه بعد ذلك في
الاستعلام الرئيسي.
الجداول المشتقة مفيدة عندما تحتاج إلى تنفيذ تحويلات معقدة أو تجميعات على مجموعة فرعية من البيانات قبل الانضمام بها مع جداول أخرى.
الاستعلام
الفرعي المقياس في عبارة SELECT
نفترض أن لدينا جدولًا يحتوي على معلومات حول الموظفين وجدول آخر يحتوي على تقديرات لأداء كل موظف. يمكننا استخدام الاستعلام الفرعي لاسترجاع أعلى تقدير للأداء كقيمة محسوبة لكل موظف في الجدول الرئيسي.
SELECT EmployeeID, EmployeeName, (SELECT MAX(Rating) FROM Performance WHERE EmployeeID = Employees.EmployeeID) AS MaxRating
FROM Employees;
لفهم العلاقة بين جداول "الموظفين" و "الأداء"
وتوضيحها بشكل مخطط، يمكن رسم مخطط بسيط يوضح الجداول والعلاقة بينها.
+---------------+ +------------------+
| Employees | | Performance |
+---------------+ +------------------+
| EmployeeID | <----------- | EmployeeID |
| EmployeeName | | Rating |
| ... | | ... |
+---------------+ +------------------+
في هذا المخطط:
الجدول "الموظفين" يحتوي على معلومات الموظفين مثل معرف الموظف واسمه
الجدول "الأداء" يحتوي على تقييمات الأداء لكل موظف، وهو مرتبط بجدول "الموظفين" من خلال مفتاح خارجي EmployeeID الذي يشير إلى معرف الموظف في كل جدول.
الاستعلام
الفرعي للعمود في عبارة WHERE:
لنفترض أن لدينا جدولًا يحتوي على طلبات الشراء وجدولًا آخر يحتوي على المنتجات التي يمكن شراؤها. يمكن استخدام الاستعلام الفرعي لاسترجاع قائمة المنتجات المتاحة في طلب الشراء الحالي.
SELECT OrderID, ProductName, Quantity FROM Purchases WHERE ProductID IN (SELECT ProductID FROM Products WHERE Available = 1);
لفهم العلاقة بين جداولين وتوضيحها بشكل مخطط، يمكن رسم مخطط بسيط يوضح الجداول والعلاقة بينها.
+------------+ +------------+
| Purchases | | Products |
+------------+ +------------+
| OrderID | | ProductID |
| ProductID | -------->| ProductName|
| Quantity | | Available |
| ... | | ... |
+------------+ +------------+
في هذا المخطط:
الجدول "Purchases"
يحتوي على معلومات حول المشتريات
مثل رقم الطلب ومعرف المنتج والكمية.
الجدول "Products"
يحتوي على معلومات حول المنتجات
مثل معرف المنتج واسم المنتج وما إذا كانت متاحة أم لا.
العلاقة بين
الجدولين هي من خلال الحقل "ProductID" في كل منهما.
الشرط المستخدم في الاستعلام (WHERE
ProductID IN (SELECT ProductID FROM Products WHERE Available = 1) يقوم بتحديد المشتريات التي تتعلق
بالمنتجات المتاحة فقط.
الاستعلام
الفرعي للصف في عبارة WHERE:
لنفترض أن لدينا جدولًا يحتوي على معلومات حول الموظفين وجدولًا آخر يحتوي على معلومات عن المشاريع التي يعملون عليها. يمكن استخدام الاستعلام الفرعي لاسترجاع معلومات عن المشاريع التي يعمل عليها كل موظف.
SELECT EmployeeID, EmployeeName, ProjectName
FROM Projects
WHERE (EmployeeID, ProjectID) IN (SELECT EmployeeID, ProjectID FROM EmployeeProjects);
لفهم العلاقة بين جداولين وتوضيحها بشكل مخطط، يمكن رسم مخطط بسيط يوضح الجداول والعلاقة بينها.
+----------------+ +-------------------+ | Projects | | EmployeeProjects | +----------------+ +-------------------+ | EmployeeID | -------->| EmployeeID | | ProjectID | | ProjectID | | ProjectName | | ... | | ... | +-------------------+ +----------------+
في هذا المخطط:
الجدول Projectsيحتوي على معلومات حول المشاريع
مثل معرف الموظف، معرف المشروع، واسم المشروع.
الجدول "EmployeeProjects"
يحتوي على العلاقة بين الموظفين
والمشاريع عبر معرف الموظف ومعرف المشروع.
العلاقة بين
الجدولين هي من خلال حقول EmployeeID و ProjectID في كل منهما.
الشرط المستخدم في الاستعلام
يختار أسماء الموظفين وأسماء المشاريع للمشاريع التي شاركوا فيها.
الجدول المشتق
في عبارة FROM:
لنفترض أن لدينا جدولًا يحتوي على معلومات حول المبيعات الشهرية ونريد حساب إجمالي المبيعات لكل شهر. يمكننا استخدام الجدول المشتق لحساب مجموع المبيعات لكل شهر قبل استخدامه في استعلام الاستعلام الرئيسي.
SELECT Month, TotalSales
FROM (
SELECT MONTH(OrderDate) AS Month, SUM(TotalPrice) AS TotalSales
FROM Sales
GROUP BY MONTH(OrderDate)
) AS MonthlySales;
تم تجزأت الامر للتوضيح العلاقات الفرعية:
- الاستعلام الرئيسي:
SELECT Month, TotalSales
FROM (
SELECT MONTH(OrderDate) AS Month, SUM(TotalPrice) AS TotalSales
FROM Sales
GROUP BY MONTH(OrderDate)
) AS MonthlySales;
- الاستعلام الفرعي:
SELECT MONTH(OrderDate) AS Month, SUM(TotalPrice) AS TotalSales
FROM Sales
GROUP BY MONTH(OrderDate);
االعلاقة الرئيسية:
الجدول: MonthlySales
الأعمدة: Month و TotalSales
الوصف: يوفر الجدول MonthlySales معلومات حول المبيعات الشهرية، حيث تتمثل الأعمدة في Month التي تحتوي على رقم الشهر و TotalSales التي تحتوي على إجمالي المبيعات في كل شهر.
العلاقات
الفرعية:
الاستعلام
الفرعي:
الهدف: استعراض
المبيعات الشهرية.
الوصف: يقوم الاستعلام الفرعي
بحساب إجمالي المبيعات لكل شهر من خلال تجميع البيانات من جدول Sales واستخدام الدالة SUM لحساب المجموع. يتم تجميع البيانات بواسطة دالة GROUP
BY التي تستخدم MONTH(OrderDate) لتجميع البيانات حسب الشهر.
الاستعلام
الرئيسي:
الهدف: عرض
البيانات الشهرية مع إجمالي المبيعات.
الوصف: يقوم الاستعلام الرئيسي
بتحديد الأعمدة Month و TotalSales من الجدول MonthlySales الذي تم إنشاؤه باستخدام الاستعلام الفرعي. تمثل العملية الرئيسية
استعلامًا استعلامًا لعرض البيانات الشهرية مع إجمالي المبيعات في كل شهر.