الاستعلام الجزئي (subquery) هو استعلام متداخل داخل استعلام آخر — يُستخدم في WHERE أو FROM أو SELECT أو مع EXISTS. وهو يتيح لك استخدام نتيجة استعلام واحد داخل آخر، مما يتمكن من تصفية وحسابات معقدة.
الاستعلام الجزئي (subquery) هو استعلام متداخل داخل استعلام آخر — يُستخدم في WHERE أو FROM أو SELECT أو مع EXISTS. وهو يتيح لك استخدام نتيجة استعلام واحد داخل آخر، مما يتمكن من تصفية وحسابات معقدة.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
الاستعلام الجزئي في WHERE يوفر قيماً للتصفية ضدها — قائمة (باستخدام IN) أو قيمة واحدة (باستخدام عوامل المقارنة).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
الاستعلام الجزئي المترابط يشير إلى الاستعلام الخارجي — ينفذ مرة واحدة لكل صف خارجي (قد يكون أبطأ). الاستعلام الجزئي غير المترابط ينفذ مرة واحدة فقط.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS يفحص ما إذا كان الاستعلام الجزئي يرجع أي صفوف — غالباً ما يكون أكثر كفاءة من IN للفحوصات القائمة على الوجود (يمكنه التوقف عند المطابقة الأولى).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
الاستعلامات الجزئية هي تقنية SQL مهمة للـ الاستعلام المعقد — استخدام نتيجة استعلام واحد داخل آخر يتيح التصفية والحسابات التي لا يمكن للاستعلامات البسيطة التعبير عنها، لذا فإن فهمها مهم لكتابة استعلامات حقيقية.
معرفة الأشكال — الاستعلامات الجزئية في WHERE (التصفية بقائمة باستخدام IN أو بقيمة واحدة باستخدام المقارنات)، الاستعلامات الجزئية المترابطة (التي تشير إلى الاستعلام الخارجي، وتنفذ لكل صف)، EXISTS (فحوصات الوجود الفعالة)، والاستعلامات الجزئية في FROM (الجداول المشتقة) — يغطي الأنماط الشائعة للتعبير عن المنطق المعقد.
فهم الفرق بين الاستعلامات الجزئية المترابطة وغير المترابطة مهم للأداء (الاستعلامات الجزئية المترابطة تنفذ مرة واحدة لكل صف خارجي وقد تكون بطيئة).
وبنفس القدر من الأهمية معرفة العلاقة مع JOINs و CTEs: يمكن إعادة كتابة العديد من الاستعلامات الجزئية كـ JOINs (غالباً أكثر كفاءة وقابلية للقراءة) أو CTEs (أنظف للحالات المعقدة)، لذا فهم متى يتم استخدام كل واحد — الاستعلامات الجزئية لوضوح التصفية/التجميع، JOINs لدمج البيانات — هو مهارة عملية.
نظراً لأن الاستعلامات الحقيقية غالباً ما تتطلب تداخلاً (التصفية حسب النتائج المجمعة، فحوصات الوجود، المقارنة بالقيم المحسوبة)، وحيث أن فهم الاستعلامات الجزئية وخصائص أدائها (خاصة تلك المترابطة) وعلاقتها بـ JOINs/CTEs مهم لكتابة استعلامات معقدة فعالة وفعّالة، فإن إتقان الاستعلامات الجزئية هو معرفة قيمة وكثيراً ما تُطبق لـ SQL يتجاوز الاستعلام الأساسي وموضوع مقابلة شائع يُظهر القدرة على التعبير عن متطلبات البيانات المعقدة.