انضم لذكاء صباعي: www.zka2soba3y.com ونادي الجينيس: www.gbc4.com. واتساب: 01157611470
مقدمة عن الـ Subquery
ليه بنستخدم الـ Subquery؟
أماكن استخدام الـ Subquery
أنواع الـ Subquery
1. Scalar Subquery (استعلام فرعي أحادي القيمة)
2. Multi-row Subquery (استعلام فرعي متعدد الصفوف)
3. Correlated Subquery (استعلام فرعي مرتبط)
مميزات استخدام الـ Subquery
عيوب وملاحظات على الـ Subquery
الخلاصة
مقدمة عن الـ Subquery (الاستعلامات الفرعية)
يا جماعة الخير، أهلاً بكم في درس جديد ومهم جداً في عالم الـ SQL Server. النهارده هنتكلم عن مفهوم أساسي ومحوري لأي حد شغال على قواعد البيانات، وهو الـ Subquery أو الاستعلام الفرعي. ببساطة كده، الـ Subquery هو “استعلام داخل استعلام آخر”. يعني بتكتب جملة SELECT جوه جملة SELECT تانية، أو جوه أي جملة SQL تانية.
ليه بنستخدم الـ Subquery؟
ممكن تسأل نفسك، طب إيه لازمتها؟ ليه ما أعملش كل حاجة في استعلام واحد كبير؟ الحقيقة يا جماعة، الـ Subquery بتوفر لنا قوة ومرونة مش عادية في التعامل مع البيانات المعقدة. بتخلينا نقدر نكسر المشكلة الكبيرة لأجزاء صغيرة، كل جزء بيحل مشكلة معينة، وده بيخلي الكود أنظف وأسهل في الفهم والصيانة.
بتساعدنا نعمل حاجات زي:
- نجيب بيانات معتمدة على نتيجة استعلام تاني.
- نفلتر بيانات بناءً على شروط معقدة.
- نعمل حسابات تجميعية (Aggregations) بطرق مبتكرة.
أماكن استخدام الـ Subquery
الـ Subquery مش مقتصرة بس على جملة الـ SELECT. دي ممكن تستخدمها في أماكن كتير جداً في الـ SQL، زي:
- في جملة SELECT (كعمود): عشان ترجع قيمة واحدة لكل صف.
- في جملة FROM (كجدول مشتق – Derived Table): عشان تعتبر نتيجة الاستعلام الفرعي كجدول مؤقت تقدر تتعامل معاه.
- في جملة WHERE: عشان تفلتر الصفوف بناءً على نتيجة الاستعلام الفرعي.
- في جملة HAVING: زي WHERE بس للـ Groups (المجموعات).
- في جملة INSERT: عشان تدخل بيانات جاية من استعلام تاني.
- في جملة UPDATE: عشان تحدث بيانات بناءً على شروط أو قيم من استعلام فرعي.
- في جملة DELETE: عشان تحذف صفوف بناءً على شروط من استعلام فرعي.
أنواع الـ Subquery
عندنا تلات أنواع رئيسية للـ Subquery، وكل نوع ليه استخدامه وخصائصه:
1. Scalar Subquery (استعلام فرعي أحادي القيمة)
ده أبسط نوع. الاستعلام الفرعي هنا بيرجع قيمة واحدة بس (صف واحد وعمود واحد). لو رجع أكتر من قيمة، هيطلع لك إيرور.
مثال: لو عايزين نجيب اسم الموظف اللي مرتبه أعلى من متوسط مرتبات كل الموظفين.
SELECT EmployeeName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);
2. Multi-row Subquery (استعلام فرعي متعدد الصفوف)
النوع ده بيرجع أكتر من صف، وممكن يرجع عمود واحد أو أكتر. بنستخدمه غالباً مع الـ Operators اللي بتقبل مجموعة من القيم زي IN, NOT IN, ANY, ALL, EXISTS, NOT EXISTS.
مثال: عايزين نجيب أسماء الموظفين اللي شغالين في أقسام معينة (مثلاً قسم التسويق والمبيعات).
SELECT EmployeeName, DepartmentID
FROM Employees
WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName IN ('Marketing', 'Sales'));
- IN: لو القيمة موجودة في أي قيمة من اللي رجعها الـ Subquery.
- ANY: لو القيمة بتطابق أي قيمة من اللي رجعها الـ Subquery (مثلاً > ANY).
- ALL: لو القيمة بتطابق كل القيم اللي رجعها الـ Subquery (مثلاً > ALL).
- EXISTS: لو الـ Subquery رجع أي صفوف (مش مهم إيه هي، المهم أنه رجع).
3. Correlated Subquery (استعلام فرعي مرتبط)
ده بقى النوع اللي ممكن يلخبط شوية، بس هو قوي جداً. الـ Correlated Subquery بيعتمد على الاستعلام الخارجي (Outer Query) عشان يتنفذ. يعني بيتنفيذ مرة لكل صف من الصفوف اللي بيرجعها الاستعلام الخارجي. وده معناه إنه مش بيشتغل لوحده، لازم يكون مربوط بالاستعلام اللي بره.
مثال: عايزين نجيب الموظفين اللي مرتبهم أعلى من متوسط مرتبات قسمهم.
SELECT e1.EmployeeName, e1.Salary, e1.DepartmentID
FROM Employees e1
WHERE e1.Salary > (SELECT AVG(e2.Salary) FROM Employees e2 WHERE e2.DepartmentID = e1.DepartmentID);
مميزات استخدام الـ Subquery
- المرونة: بتخليك تحل مشاكل معقدة جداً بطرق مبتكرة.
- التنظيم: بتساعدك تقسم الاستعلامات الكبيرة لأجزاء صغيرة، وده بيخلي الكود أسهل في القراءة والفهم.
- الاستقلالية: الـ Subquery ممكن تتكتب بمعزل عن الاستعلام الرئيسي في البداية، وبعدين تدمجها.
- بديل للـ Joins: في بعض الحالات، ممكن تكون بديل للـ Joins، وخصوصاً لما تكون عايز تجيب بيانات من جدول واحد بناءً على شروط من جدول تاني من غير ما تضم كل الأعمدة.
عيوب وملاحظات على الـ Subquery
زي أي أداة، ليها مميزات وعيوب لازم ناخد بالنا منها:
- الأداء (Performance): الـ Correlated Subquery بالذات ممكن تكون بطيئة جداً لو مش مكتوبة صح أو لو بتتعامل مع كميات كبيرة من البيانات. في كتير من الأحيان، الـ JOINs بتكون أسرع وأكثر كفاءة.
- التعقيد: لو الاستعلام الفرعي بقى كبير ومعقد، ممكن يبقى صعب قراءته وصيانته، وممكن يسبب لخبطة.
- التصحيح (Debugging): لو في مشكلة في الـ Subquery، ممكن يكون صعب تحدد فين المشكلة بالظبط.
الخلاصة
الـ Subquery أداة قوية جداً في ترسانة أي مطور قواعد بيانات. بتفتح لك أبواب لحل مشاكل معقدة بطرق منطقية ومنظمة. المهم إنك تفهم إمتى تستخدمها صح، وإمتى ممكن يكون في بدائل أفضل للأداء أو الوضوح.
أتمنى يكون الدرس ده وضح لكم مفهوم الـ Subquery بأنواعها المختلفة واستخداماتها. لو عندكم أي أسئلة، ماتترددوش تسألوا.
وفي الختام، أهدي هذا العمل والجهد المبذول للاستاذ/ أبو الدهب، على دعمه المتواصل وتشجيعه الدائم في إعداد وتقديم هذه المقالة التعليمية. شكراً جزيلاً لك.
