في هذا الدرس 6تصفّح المواضيع
تفصل قواعد البيانات المطبّعة البيانات في جداول مستقلة (مثل جدول المستخدمين users وجدول الطلبات orders) لمنع التكرار. ولإعادة تجميع البيانات المترابطة عند الاستعلام، يدمج الربط الداخلي INNER JOIN (أو باختصار JOIN لأن كلمة INNER اختيارية في MySQL) صفوف الجدولين متى تحقق شرط التطابق المكتوب بعد كلمة ON:
- مفهوم التقاطع المشترك: لا يظهر في النتيجة إلا السجلات التي تملك تطابقاً فعلياً في الجدولين معاً، بينما تُستبعد الصفوف غير المرتبطة أو التي تحمل قيمة
NULLفي مفتاح الربط. - الصياغة القياسية الصريحة: اعتمد دائماً صيغة
INNER JOIN ... ONبدلاً من الصيغة القديمة المفصولة بفاصلة داخلFROM، لفصل شروط الربط عن شروط التصفية بوضوح.
-- Match orders with their owning customer via INNER JOIN
SELECT
orders.order_id,
users.full_name,
orders.total_amount,
orders.order_date
FROM orders
INNER JOIN users
ON orders.user_id = users.user_id;
عندما يشترك جدولان مرتبطان في أسماء أعمدة متطابقة مثل id أو status أو created_at، فإن كتابة اسم العمود مجرداً يطلق خطأ MySQL رقم 1052 بسبب غموض المصدر. ويعالج تعريف الأسماء المستعارة للجداول في جملتي FROM وJOIN (مثل FROM orders AS o) هذه المشكلة باحترافية:
- إزالة الغموض وتأهيل الأعمدة: أسبِق كل عمود بالاسم المستعار لجدوله (
o.created_atمقابلu.created_at) لتحديد الجدول المقصود بدقة. - قاعدة نطاق الاسم المستعار: بمجرد منح الجدول اسماً مستعاراً داخل الاستعلام، يجب استخدام الاسم المستعار حصرياً في
SELECTوONوWHEREبدلاً من اسم الجدول الأصلي الطويل.
-- Qualify shared column names using concise table aliases
SELECT
o.order_id,
u.full_name,
o.status AS order_status,
o.created_at AS ordered_at
FROM orders AS o
INNER JOIN users AS u
ON o.user_id = u.user_id;
عندما يحمل عمود المفتاح الأجنبي في الجدول الفرعي وعمود المفتاح الأساسي في الجدول الأب الاسم نفسه تماماً (كأن يحتوي الجدولان معاً على العمود category_id أو user_id)، يوفّر MySQL صيغة الاختصار الأنيقة USING (column_name) بديلاً عن شرط المساواة الطويل ON t1.col = t2.col:
- دمج عمود المفتاح المشترك: بخلاف شرط
ONالذي يكرر عمود المفتاح مرتين عند استدعاءSELECT *، تدمج صيغةUSING (user_id)العمودين في عمود واحد مشترك بالنتيجة. - دعم المفاتيح المركبة: يمكنك تمرير أكثر من عمود مشترك داخل القوسين مفصولةً بفواصل مثل
USING (store_id, fiscal_year).
-- Join tables sharing an identical key name via USING
SELECT
category_id,
c.category_name,
p.product_title,
p.unit_price
FROM products AS p
INNER JOIN categories AS c
USING (category_id);
تتطلب تقارير المتاجر الإلكترونية والأنظمة المؤسسية غالباً استخراج بيانات تمتد عبر ثلاثة جداول أو أكثر، لا سيما عند المرور بجدول وسيط لعلاقة متعدد لمتعدد (مثل ربط orders بجدول بنود الطلب order_items ثم جدول المنتجات products). وفي MySQL يتم تسلسل جمل INNER JOIN تباعاً بحيث يرتبط كل جدول جديد بجدول سبق تعريفه:
- التسلسل المنطقي للربط: ابدأ بالجدول الرئيسي في
FROM، ثم اربطه بالجدول الوسيط، ثم اربط الجدول الوسيط بجدول تفاصيل المنتجات. - إعادة الترتيب الذكية بالمحسّن: يحلّل محسّن الاستعلامات في InnoDB أحجام الجداول والفهارس المتاحة ليختار الترتيب الفيزيائي الأسرع للتنفيذ تلقائياً.
-- Chain 3 tables across a junction table
SELECT
o.order_id,
u.full_name AS customer,
p.product_title,
oi.quantity,
oi.unit_price
FROM orders AS o
INNER JOIN users AS u ON o.user_id = u.user_id
INNER JOIN order_items AS oi ON o.order_id = oi.order_id
INNER JOIN products AS p ON oi.product_id = p.product_id;
بعد ربط الجداول عبر INNER JOIN، يمكنك دمجها بسلاسة مع جمل التصفية والتجميع WHERE وGROUP BY وHAVING وORDER BY لبناء تقارير تحليلية دقيقة:
- التصفية المسبقة بـ
WHERE: صفِّ السجلات المترابطة (مثلWHERE o.status = 'paid') قبل مرحلة تجميع المجموعات. - التجميع بالمفتاح الأساسي: جمّع دائماً حسب المفتاح الأساسي والاسم معاً (
GROUP BY u.user_id, u.full_name) للتوافق مع وضعONLY_FULL_GROUP_BYالافتراضي في MySQL 8، ولمنع دمج عميلين مختلفين يحملان الاسم الشخصي ذاته عن طريق الخطأ.
-- Aggregate paid revenue per customer across joined tables
SELECT
u.user_id,
u.full_name,
COUNT(o.order_id) AS paid_orders,
SUM(o.total_amount) AS lifetime_value
FROM users AS u
INNER JOIN orders AS o ON u.user_id = o.user_id
WHERE o.status = 'paid'
GROUP BY u.user_id, u.full_name
ORDER BY lifetime_value DESC;
يقارن الجدول التالي بين صيغ وأنماط الربط الداخلي INNER JOIN في MySQL 8:
| نمط الربط | مثال الصياغة في SQL | الشرط الأساسي | الاستخدام الهندسي الأمثل |
|---|---|---|---|
INNER JOIN ... ON | FROM orders o INNER JOIN users u ON o.user_id = u.id | أي تعبير منطقي أو مقارنة | الربط القياسي للمفاتيح حتى لو اختلفت أسماء الأعمدة بين الجدولين |
INNER JOIN ... USING | FROM products p INNER JOIN categories c USING (category_id) | تطابق اسم العمود في الجدولين | اختصار شرط المساواة ودمج عمود المفتاح المشترك في النتيجة |
| ربط عدة جداول متسلسلة | FROM a JOIN b ON ... JOIN c ON ... | مفاتيح تربط كل جدول بسابقه | استعراض الجداول الوسيطة وعلاقات متعدد لمتعدد |
| التجميع بعد الربط | FROM u JOIN o ON ... GROUP BY u.id | التوافق مع ONLY_FULL_GROUP_BY | حساب إجماليات المبيعات وعدد الطلبات لكل عميل أو قسم |
ملخص الدرس: أتقنّا في هذا الدرس آلية عمل الربط الداخلي INNER JOIN لمطابقة السجلات المتقاطعة بين الجداول، واستخدام الأسماء المستعارة لمنع غموض الأعمدة (خطأ 1052)، واختصار الربط عبر USING، وتسلسل ربط ثلاثة جداول أو أكثر مع دوال التجميع.
الخطوة التالية والدرس القادم: في الدرس القادم سننتقل إلى دراسة «الربط الخارجي LEFT JOIN و RIGHT JOIN في MySQL» للاحتفاظ بالصفوف غير المرتبطة واكتشاف السجلات المفقودة.
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
يمنحك الجمع بين صيغة INNER JOIN ... ON الصريحة والأسماء المستعارة للجداول استعلامات متعددة الجداول واضحة وعالية الكفاءة في MySQL 8. الخطوة التالية: انتقل إلى درس «الربط الخارجي LEFT JOIN و RIGHT JOIN في MySQL».
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات5
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 INNER JOIN الربط الداخلي
- تعلّم الربط الداخلي INNER JOIN والاستعلام من عدة جداول في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 How INNER JOIN Matches Rows آلية المطابقة بـ INNER JOIN
- المفهوم الهندسي والصياغة العملية الخاصة بقسم آلية المطابقة بـ INNER JOIN في MySQL 8.
- للمراجعة
- 03 Table Aliases and Qualification الأسماء المستعارة وتأهيل الأعمدة
- المفهوم الهندسي والصياغة العملية الخاصة بقسم الأسماء المستعارة وتأهيل الأعمدة في MySQL 8.
- للمراجعة
- 04 Shorthand Join Condition with USING اختصار شرط الربط بـ USING
- المفهوم الهندسي والصياغة العملية الخاصة بقسم اختصار شرط الربط بـ USING في MySQL 8.
- للمراجعة
- 05 Joining Three or More Tables ربط ثلاثة جداول متسلسلة
- المفهوم الهندسي والصياغة العملية الخاصة بقسم ربط ثلاثة جداول متسلسلة في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات3
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PK PK
- Primary Key
- المفتاح الأساسي الفريد لصفوف الجدول الأب الذي يستهدفه شرط الربط الداخلي.
- للمراجعة
- 02 FK FK
- Foreign Key
- المفتاح الأجنبي في الجدول الفرعي الذي يشير إلى قيمة المفتاح الأساسي في الجدول الأب.
- للمراجعة
- 03 ANSI ANSI
- American National Standards Institute SQL
- المعيار القياسي للغة SQL الذي رسّخ صياغة الربط الصريح INNER JOIN ... ON.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم آلية المطابقة بـ INNER JOIN داخل قاعدة بياناتك المحلية وتحقق من مجموعة النتائج.
-
بدّل بين الحالات التفاعلية في قسم الأسماء المستعارة وتأهيل الأعمدة وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي5 أسئلة تنتظرك +
ما هي الصفوف التي يرجعها الاستعلام عند ربط جدولين باستخدام INNER JOIN في MySQL؟
تذكّر قاعدة التقاطع المشترك في الربط الداخلي.
لماذا يطلق MySQL الخطأ رقم 1052 (العمود غامض في قائمة الحقول) أثناء الاستعلام من عدة جداول؟
حدّد سبب الخطأ عند وجود عمود يحمل الاسم نفسه في جدولين مرتبطين.
متى يمكنك استخدام صيغة الاختصار USING (column_name) في جملة الربط الداخلي؟
تحقق من شرط تسمية عمود الربط عند استخدام USING.
في MySQL تُعد كلمة INNER اختيارية، ولذلك فإن كتابة JOIN ON ... تكافئ تماماً كتابة INNER JOIN ON ...
تحقق مما إذا كانت كلمة JOIN المجردة تعني الربط الداخلي افتراضياً في MySQL.
عند تجميع الطلبات لكل عميل في استعلام مترابط، لماذا ينبغي التجميع حسب المعرّف الفريد u.user_id إلى جانب اسم العميل u.full_name؟
فكّر فيما يحدث لو كان هناك عميلان مختلفان يحملان نفس الاسم الكامل.