الاستعلامات الفرعية - الجزء الثاني
جزء من قسم الأساسيات في رحلة SQL على Coddy — الدرس 39 من 72.
هناك ثلاثة أنواع رئيسية من الاستعلامات الفرعية:
- الاستعلامات الفرعية القياسية (Scalar Subqueries) - تعيد قيمة واحدة (صف واحد، عمود واحد)
- الاستعلامات الفرعية للصفوف (Row Subqueries) - تعيد صفاً واحداً بأعمدة متعددة
- الاستعلامات الفرعية للجداول (Table Subqueries) - تعيد صفوفاً وأعمدة متعددة
على سبيل المثال، إليك بعض حالات الاستخدام لكل نوع من أنواع الاستعلامات الفرعية:
الاستعلام الفرعي القياسي (Scalar Subquery) - ابحث عن الموظفين الذين يتقاضون رواتب أعلى من متوسط الراتب:
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);استعلام فرعي للصف - ابحث عن الموظف (أو الموظفين) الذين لديهم نفس القسم والراتب مثل Alice
SELECT name
FROM employees
WHERE (department, salary) = (
SELECT department, salary
FROM employees
WHERE name = 'Alice'
);الاستعلامات الفرعية للجداول - عرض الأقسام وعدد موظفيها
SELECT department, count
FROM (
SELECT department, COUNT(*) as count
FROM employees
GROUP BY department
) as dept_counts;لاحظ حالات الاستخدام:
- Scalar - مقارنات بسيطة (>، <، =)
- عندما تحتاج إلى مطابقة أعمدة متعددة
- عندما تحتاج إلى الاستعلام من مجموعة نتائج
التحدي
سهلالجداول والأعمدة المتاحة:
shop:price,quantity,category,list_date
أوجد الفئات (categories) التي يكون إجمالي الكمية (quantity) فيها أكبر من متوسط جميع الكميات في المتجر.
هام: يجب عليك استخدام استعلام فرعي (subquery) داخل جملة HAVING لحساب المتوسط. لا تستخدم قيمة ثابتة أو استعلاماً منفصلاً — يجب أن يقوم الاستعلام الفرعي بحساب AVG(quantity) من جدول shop مباشرة داخل HAVING.
خطوات الحل:
- أولاً، اكتب استعلاماً فرعياً يحسب متوسط جميع الكميات في المتجر:
SELECT AVG(quantity) FROM shop - بعد ذلك، لكل فئة، قم بجمع كمياتها ومقارنتها بهذا الاستعلام الفرعي باستخدام الكلمة المفتاحية
HAVING
ورقة مرجعية
هناك ثلاثة أنواع رئيسية من الاستعلامات الفرعية (subqueries):
- الاستعلامات الفرعية القياسية (Scalar Subqueries) - تعيد قيمة واحدة (صف واحد، عمود واحد)
- استعلامات الصف الفرعية (Row Subqueries) - تعيد صفاً واحداً بأعمدة متعددة
- استعلامات الجدول الفرعية (Table Subqueries) - تعيد صفوفاً وأعمدة متعددة
الاستعلام الفرعي القياسي (Scalar Subquery) - مقارنات بسيطة (>, <, =):
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);استعلام الصف الفرعي (Row Subquery) - مطابقة أعمدة متعددة:
SELECT name
FROM employees
WHERE (department, salary) = (
SELECT department, salary
FROM employees
WHERE name = 'Alice'
);استعلام الجدول الفرعي (Table Subquery) - الاستعلام من مجموعة نتائج:
SELECT department, count
FROM (
SELECT department, COUNT(*) as count
FROM employees
GROUP BY department
) as dept_counts;جرّب بنفسك
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2الشروط
أساسيات الشروطالكلمة المفتاحية ANDالكلمة المفتاحية ORالكلمة المفتاحية NOTدمج شروط متعددةالأقواسالقيم المنطقية Booleans3تنسيق محدد للنتائج
قيم Nullترتيب النتائج - الجزء الأولترتيب النتائج - الجزء الثانيمراجعة - شركة للأمن السيبرانيتحديد عدد السجلاتمراجعة - مصنع مركبات6تحديات تمهيدية
مراجعة - الانتخابات البرلمانيةمراجعة - اعتقال الشرطة للمجرمينمراجعة - حاوية مشروبات البارمراجعة - هندسة أعمدة جديدة9جداول متعددة
الربط الأساسي - الجزء الأولالربط الأساسي - الجزء الثانيمراجعة - الربط (Join)الربط الذاتي (Self Join)مراجعة - الربط الذاتي (Self Join)الاتحاد (Union)تبسيط الاستعلامات، الكلمة المفتاحية WITHمراجعة - استعلامات WITHمراجعة - مقاول العقارات12Window Functions الجزء الثاني
دوال RANK و DENSE_RANKمراجعة - RANK و DENSE_RANKدالة NTILEدوال التجميعمعيار ROWS و RANGE