في هذا الدرس 6تصفّح المواضيع
بدلاً من سحب آلاف الصفوف إلى ذاكرة التطبيق البرمجي ثم إعادة إدراجها صفاً تلو الآخر، تنقل صيغة INSERT INTO ... SELECT مخرجات أي استعلام SELECT (بما في ذلك الاستعلامات المترابطة عبر JOIN) وتدرجها مباشرةً داخل الجدول الهدف في محرك قاعدة البيانات:
- التطابق الموضعي للأعمدة: اذكر دائماً أسماء الأعمدة المستهدفة صراحةً بعد
INSERT INTOوطابق عددها وأنواع بياناتها مع قائمةSELECTبالترتيب. - الاستغناء عن كلمة
VALUES: عند الإدراج من استعلام، تحل جملةSELECTمحل جملةVALUES (...)بالكامل.
-- Populate shipping_labels from paid orders joined with customers
INSERT INTO shipping_labels (order_id, recipient_name, city, created_at)
SELECT
o.order_id,
u.full_name,
u.city,
o.order_date
FROM orders AS o
INNER JOIN users AS u ON o.user_id = u.user_id
WHERE o.status = 'paid';
يبرز الاستخدام الهندسي الأهم لصيغة INSERT INTO ... SELECT في سيناريوهين أساسيين داخل أنظمة الإنتاج وهما أرشفة البيانات التاريخية وتعبئة جداول التقارير التلخيصية:
- نقل السجلات للأرشيف: نسخ الطلبات المكتملة الأقدم من تاريخ معين إلى جدول أرشيف
orders_archiveلتخفيف حجم الجدول التشغيلي الساخن. - بناء جداول الملخصات المجمعة: ربط جداول الطلبات والأصناف مع
GROUP BYلحساب إجماليات المبيعات الشهرية وتخزينها في جدول تقارير سريع للوحات المتابعة.
-- Load monthly category revenue rollup into a reporting table
INSERT INTO category_monthly_summary
(category_id, report_month, gross_revenue)
SELECT
p.category_id,
'2026-10' AS report_month,
SUM(oi.quantity * oi.unit_price) AS gross_revenue
FROM order_items AS oi
INNER JOIN products AS p ON oi.product_id = p.product_id
GROUP BY p.category_id;
يدعم MySQL صياغة قوية للتحديث متعدد الجداول UPDATE ... JOIN تتيح لك تعديل أعمدة جدول (أو حتى الجدولين المرتبطين معاً في نفس اللحظة) اعتماداً على قيم أو شروط موجودة في جدول آخر:
- ترتيب الجمل الخاص بـ MySQL: تُكتب جملة
INNER JOINأوLEFT JOINمباشرةً بعد اسم الجدول في جملةUPDATE، أي قبل كلمةSETعلى النحو:UPDATE t1 INNER JOIN t2 ON ... SET t1.col = .... - الحسابات العابرة للجداول: يمكنك إسناد قيمة عمود من الجدول الثاني مباشرة إلى عمود في الجدول الأول مثل
SET p.unit_price = s.promo_price.
-- Apply supplier discount rates to matching products via UPDATE JOIN
UPDATE products AS p
INNER JOIN suppliers AS s
ON p.supplier_id = s.supplier_id
SET p.unit_price = ROUND(p.unit_price * (1 - s.discount_rate), 2)
WHERE s.is_preferred = 1
AND p.is_active = 1;
عندما تحتاج إلى حذف سجلات من جدول بناءً على خصائص أو حالات مخزنة في جدول آخر مرتبط به، يوفّر MySQL صيغة الحذف المترابط DELETE ... JOIN:
- تحديد الاسم المستعار بعد
DELETE: اكتب دائماً الاسم المستعار للجدول المراد الحذف منه بين كلمتيDELETEوFROMمثل:DELETE o FROM orders AS o INNER JOIN users AS u ON .... - الحذف من جدول واحد أو جدولين: كتابة
DELETE oتحذف الصفوف المطابقة من جدول الطلبات فقط دون المساس بجدول المستخدمين، بينما كتابةDELETE o, oiتحذف السجلات المطابقة من الجدولين معاً.
-- Delete unpaid draft orders belonging to banned accounts
DELETE o
FROM orders AS o
INNER JOIN users AS u
ON o.user_id = u.user_id
WHERE u.account_status = 'banned'
AND o.status = 'draft';
عبر دمج الحذف المترابط DELETE مع نمط ربط عدم التطابق LEFT JOIN ... WHERE right_table.pk IS NULL، يمكنك تنظيف السجلات اليتيمة المعزولة أو الجلسات المؤقتة المنتهية التي لا تملك سجلاً مقابلاً في الجدول الرئيسي:
- عزل السجلات غير المرتبطة بدقة: وضع الجدول المراد تنظيفه على اليسار وفحص
IS NULLعلى المفتاح الأساسي للجدول الأيمن يحصر الحذف في الصفوف المعزولة فقط. - التحقق المسبق بـ
SELECT: نفّذ دائماً نفس جملةFROM ... LEFT JOIN ... WHERE ... IS NULLكاستعلام قراءةSELECT COUNT(*)أولاً للتحقق من عدد الصفوف قبل تحويلها إلىDELETE.
-- Purge orphaned cart items whose parent shopping cart no longer exists
DELETE ci
FROM cart_items AS ci
LEFT JOIN shopping_carts AS sc
ON ci.cart_id = sc.cart_id
WHERE sc.cart_id IS NULL;
يلخّص الجدول التالي أنماط تعديل البيانات متعددة الجداول في MySQL 8:
| نمط العملية المترابطة | هيكل الصياغة في MySQL 8 | قاعدة تحديد الجدول الهدف | الاستخدام الهندسي الأمثل |
|---|---|---|---|
INSERT INTO ... SELECT | INSERT INTO target (cols) SELECT ... FROM a JOIN b | يُذكر بعد INSERT INTO | أرشفة السجلات التاريخية وتعبئة جداول الملخصات والتقارير |
UPDATE ... JOIN | UPDATE a JOIN b ON ... SET a.col = val WHERE ... | الأعمدة المسندة في SET | تحديث الأسعار أو الحالات اعتماداً على بيانات جدول آخر |
DELETE ... INNER JOIN | DELETE a FROM a INNER JOIN b ON ... WHERE ... | الاسم المستعار بعد DELETE | حذف السجلات المرتبطة بحسابات ملغاة أو فئات محددة |
DELETE ... LEFT JOIN | DELETE a FROM a LEFT JOIN b ON ... WHERE b.id IS NULL | الجدول الأيسر بعد DELETE | تنظيف السجلات اليتيمة التي فقدت ارتباطها بالجدول الأب |
ملخص الدرس: أتقنّا في هذا الدرس نسخ وتلخيص السجلات بين الجداول عبر INSERT INTO ... SELECT، وتحديث الأعمدة المترابطة بصيغة UPDATE ... JOIN ... SET، وحذف السجلات المطابقة أو المعزولة عبر DELETE ... JOIN.
الخطوة التالية والدرس القادم: في الدرس القادم نبدأ وحدة الاستعلامات المتقدمة بدراسة «الاستعلامات الفرعية مع IN و ANY و ALL والجداول المشتقة في MySQL».
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
تنفّذ عمليات INSERT SELECT وUPDATE JOIN وDELETE JOIN تحويلات البيانات العلائقية مباشرةً داخل محرك InnoDB بكفاءة عالية. الخطوة التالية: انتقل إلى درس «الاستعلامات الفرعية مع IN و ANY و ALL والجداول المشتقة في MySQL».
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات5
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Update Joins تحديث مترابط
- تعلّم العمليات متعددة الجداول INSERT SELECT و UPDATE JOIN و DELETE JOIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 Copying Query Results INSERT SELECT نسخ النتائج بـ INSERT SELECT
- المفهوم الهندسي والصياغة العملية الخاصة بقسم نسخ النتائج بـ INSERT SELECT في MySQL 8.
- للمراجعة
- 03 Archiving and Summary Table Loads أرشفة السجلات وجداول التقارير
- المفهوم الهندسي والصياغة العملية الخاصة بقسم أرشفة السجلات وجداول التقارير في MySQL 8.
- للمراجعة
- 04 Updating Columns via UPDATE JOIN تحديث جدول بربطه بآخر
- المفهوم الهندسي والصياغة العملية الخاصة بقسم تحديث جدول بربطه بآخر في MySQL 8.
- للمراجعة
- 05 Multi Table DELETE JOIN Syntax حذف السجلات بـ DELETE JOIN
- المفهوم الهندسي والصياغة العملية الخاصة بقسم حذف السجلات بـ DELETE JOIN في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات3
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 DML DML
- Data Manipulation Language
- تعليمات معالجة البيانات في SQL المسؤولة عن إدراج وتحديث وحذف الصفوف.
- للمراجعة
- 02 ETL ETL
- Extract, Transform, Load
- نمط استخراج وتحويل وتحميل البيانات الذي تنفذه تعليمة INSERT INTO ... SELECT داخل القاعدة.
- للمراجعة
- 03 Orphan Row سجل يتيم
- Orphaned Child Record
- صف فرعي يشير مفتاحه الأجنبي إلى سجل أب غير موجود، ويُنظف عبر DELETE ... LEFT JOIN.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم نسخ النتائج بـ INSERT SELECT داخل قاعدة بياناتك المحلية وتحقق من مجموعة النتائج.
-
بدّل بين الحالات التفاعلية في قسم أرشفة السجلات وجداول التقارير وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي5 أسئلة تنتظرك +
عند استخدام صيغة INSERT INTO target_table (col1, col2) SELECT ...، ماذا يحدث لكلمة VALUES؟
تذكّر القاعدة النحوية عند الإدراج المباشر من مخرجات استعلام.
ما هي التعليمة التي تنشئ جدول أرشيف فارغاً يطابق أعمدة وفهارس جدول موجود تماماً تمهيداً لملئه بـ INSERT INTO ... SELECT؟
حدّد صيغة نسخ هيكل الجدول دون صفوفه في MySQL.
في MySQL، أين يجب وضع جملة INNER JOIN أو LEFT JOIN داخل تعليمة التحديث متعدد الجداول UPDATE؟
تحقق من الترتيب الصحيح للجمل داخل تعليمة UPDATE المترابطة في MySQL.
في التعليمة DELETE o FROM orders AS o INNER JOIN users AS u ON o.user_id = u.user_id WHERE u.is_banned = 1، أي جدول تُحذف منه الصفوف؟
انظر إلى الاسم المستعار المكتوب مباشرةً بعد كلمة DELETE.
دمج DELETE t1 FROM t1 LEFT JOIN t2 ON t1.parent_id = t2.id WHERE t2.id IS NULL يحذف السجلات الفرعية اليتيمة في t1 التي لا تملك سجلاً أباً في t2.
تحقق من عمل نمط LEFT JOIN ... IS NULL عند استخدامه مع تعليمة DELETE.