الاستعلامات الفرعية
غالبا ما تحتاج إلى استرداد البيانات استنادا إلى الشروط المشتقة من البيانات الموجودة في قاعدة البيانات الخاصة بك.
تسمح لك الاستعلامات الفرعية بالقيام بذلك عن طريق السماح لك باستخدام نتيجة عبارة واحدة SELECT كجزء من جملة أخرى. وهذا مفيد لمهام مثل العثور على جميع العملاء الذين وضعوا طلبات تتجاوز متوسط معين أو تحديد المنتجات التي توفرها مجموعة محددة من الموردين.
يمكن استخدام الاستعلامات الفرعية في السياقات التالية:
ضمن عبارات SELECT العبارات (FROM، ، WHERE، HAVING عبارة)
ضمن عبارات معالجة البيانات (INSERT، ، UPDATEعبارة DELETE )
النقاط الرئيسية التي يجب التأكيد عليها
الاستعلام الفرعي هو دائما عبارة SELECT .
الاستعلام الفرعي محاط بأقواس ().
يتم استخدام نتيجة الاستعلام الفرعي بواسطة الاستعلام الخارجي.
أمثلة الاستعلام الفرعي
SELECT product_name, price
FROM sales.products
WHERE price > (
SELECT AVG(price)
FROM sales.products
);
يسترد هذا الاستعلام أسماء المنتجات وأسعارها من sales.products الجدول حيث يكون المنتج price أكبر من متوسط price جميع المنتجات في الجدول نفسه. يستخدم الاستعلام الفرعي ضمن WHERE عبارة لحساب المتوسط price عن طريق تحديد AVG(price) من sales.products الجدول. ثم تتم مقارنة نتيجة هذا الاستعلام الفرعي بالعمود price في الاستعلام الخارجي لتصفية وعرض المنتجات التي تتجاوز أسعارها هذا المتوسط المحسوب فقط.
SELECT customer_id, customer_name
FROM sales.customers
WHERE customer_id IN (
SELECT DISTINCT customer_id
FROM sales.orders
);
يسترد هذا الاستعلام معرفات العملاء وأسماءهم من sales.customers الجدول الذين قاموا بوضع طلب واحد على الأقل. يحقق ذلك باستخدام طلب فرعي ضمن WHERE عبارة . يحدد الاستعلام الفرعي قيما مميزة customer_id من sales.orders الجدول، ويمثل العملاء الذين قاموا بأي طلبات. ثم يستخدم الاستعلام الخارجي هذه المعرفات لتصفية معلومات العميل وعرضها، مع التأكد من تضمين العملاء المرتبطين بالطلبات فقط في النتيجة.
SELECT supplier_id, AVG (price) AS avg_price
FROM (
SELECT supplier_id, price
FROM sales.products
) AS product_prices
GROUP BY supplier_id;
يحسب هذا الاستعلام متوسط سعر المنتج لكل مورد. يستخدم الاستعلام الفرعي في FROM عبارة لتحديد supplier_id و السعر من sales.products table. ثم يقوم الاستعلام الخارجي بتجميع النتيجة حسب supplier_id ويحسب المتوسط price لكل مجموعة. يمكن أن يكون هذا الأسلوب مفيدا عندما تريد إجراء التجميع على مجموعة بيانات تمت تصفيتها أو معالجتها مسبقا.
UPDATE sales.products
SET price = price * 1.1
WHERE category_id = (
SELECT category_id
FROM sales.products
GROUP BY category_id
ORDER BY AVG(price) DESC LIMIT 1
);
يزيد هذا الاستعلام أسعار المنتجات في الفئة بأعلى متوسط سعر بمقدار 10%.
UPDATE تعدل العبارة price العمود في sales.products الجدول، وتضربه في 1.1 للصفوف المطابقة للشرط في العبارة WHERE .
يحدد الاستعلام الفرعي داخل WHERE عبارة الفئة ذات المتوسط category_id الأعلى عن طريق تجميع المنتجات حسبهاprice، وحساب المتوسط category_id لكل مجموعة، وترتيبها بترتيب تنازلي للمتوسط price.price
LIMIT 1 يضمن تحديد النتيجة العليا فقط، أي الفئة ذات المتوسط priceالأعلى، واستخدامها لتصفية صفوف التحديث.