انتقل إلى محتوى الدرس
الدرس 41
دورة MySQL

الربط الداخلي INNER JOIN والاستعلام من عدة جداول في MySQLMySQL INNER JOIN and Multi Table Queries

تعلّم الربط الداخلي INNER JOIN والاستعلام من عدة جداول في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تفصل قواعد البيانات المطبّعة البيانات في جداول مستقلة (مثل جدول المستخدمين users وجدول الطلبات orders) لمنع التكرار. ولإعادة تجميع البيانات المترابطة عند الاستعلام، يدمج الربط الداخلي INNER JOIN (أو باختصار JOIN لأن كلمة INNER اختيارية في MySQL) صفوف الجدولين متى تحقق شرط التطابق المكتوب بعد كلمة ON:

  • مفهوم التقاطع المشترك: لا يظهر في النتيجة إلا السجلات التي تملك تطابقاً فعلياً في الجدولين معاً، بينما تُستبعد الصفوف غير المرتبطة أو التي تحمل قيمة NULL في مفتاح الربط.
  • الصياغة القياسية الصريحة: اعتمد دائماً صيغة INNER JOIN ... ON بدلاً من الصيغة القديمة المفصولة بفاصلة داخل FROM، لفصل شروط الربط عن شروط التصفية بوضوح.
مخطط الربط الداخلي INNER JOIN والاستعلام متعدد الجداول في MySQL 8
SQL
-- 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 بدلاً من اسم الجدول الأصلي الطويل.
SQL
-- 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).
SQL
-- 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 أحجام الجداول والفهارس المتاحة ليختار الترتيب الفيزيائي الأسرع للتنفيذ تلقائياً.
SQL
-- 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، ولمنع دمج عميلين مختلفين يحملان الاسم الشخصي ذاته عن طريق الخطأ.
SQL
-- 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 ... ONFROM orders o INNER JOIN users u ON o.user_id = u.idأي تعبير منطقي أو مقارنةالربط القياسي للمفاتيح حتى لو اختلفت أسماء الأعمدة بين الجدولين
INNER JOIN ... USINGFROM 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 PK PK
Primary Key
المفتاح الأساسي الفريد لصفوف الجدول الأب الذي يستهدفه شرط الربط الداخلي.
للمراجعة
02 FK FK
Foreign Key
المفتاح الأجنبي في الجدول الفرعي الذي يشير إلى قيمة المفتاح الأساسي في الجدول الأب.
للمراجعة
03 ANSI ANSI
American National Standards Institute SQL
المعيار القياسي للغة SQL الذي رسّخ صياغة الربط الصريح INNER JOIN ... ON.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم آلية المطابقة بـ INNER JOIN داخل قاعدة بياناتك المحلية وتحقق من مجموعة النتائج.

  2. بدّل بين الحالات التفاعلية في قسم الأسماء المستعارة وتأهيل الأعمدة وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

5أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي5 أسئلة تنتظرك
01

ما هي الصفوف التي يرجعها الاستعلام عند ربط جدولين باستخدام INNER JOIN في MySQL؟

تذكّر قاعدة التقاطع المشترك في الربط الداخلي.

02

لماذا يطلق MySQL الخطأ رقم 1052 (العمود غامض في قائمة الحقول) أثناء الاستعلام من عدة جداول؟

حدّد سبب الخطأ عند وجود عمود يحمل الاسم نفسه في جدولين مرتبطين.

03

متى يمكنك استخدام صيغة الاختصار USING (column_name) في جملة الربط الداخلي؟

تحقق من شرط تسمية عمود الربط عند استخدام USING.

04

في MySQL تُعد كلمة INNER اختيارية، ولذلك فإن كتابة JOIN ON ... تكافئ تماماً كتابة INNER JOIN ON ...

تحقق مما إذا كانت كلمة JOIN المجردة تعني الربط الداخلي افتراضياً في MySQL.

05

عند تجميع الطلبات لكل عميل في استعلام مترابط، لماذا ينبغي التجميع حسب المعرّف الفريد u.user_id إلى جانب اسم العميل u.full_name؟

فكّر فيما يحدث لو كان هناك عميلان مختلفان يحملان نفس الاسم الكامل.