شرح مفصل للاستعلامات المتداخلة في SQL مع أمثلة تطبيقية لاستخراج بيانات الموظفين والعملاء باستخدام جمل select المتداخلة.
Key Takeaways
- الاستعلامات المتداخلة تسمح باستخدام نتائج استعلام داخل استعلام آخر للحصول على بيانات دقيقة.
- الكلمة المفتاحية in تستخدم للتحقق من وجود قيمة ضمن مجموعة نتائج استعلام داخلي.
- استخدام limit 1 مهم عند توقع نتائج متعددة لتجنب أخطاء في الاستعلام.
- فهم أساسيات SQL ضروري قبل التعامل مع الاستعلامات المتداخلة المعقدة.
- الممارسة المستمرة هي أفضل طريقة لإتقان كتابة الاستعلامات المتداخلة.
What the video covers
- تعريف الاستعلامات المتداخلة في SQL وأهميتها في الحصول على معلومات دقيقة.
- شرح كيفية استخدام جملة select داخل أخرى للحصول على معرفات الموظفين الذين باعوا أكثر من 30 ألف دولار.
- ربط بيانات جدول 'works_with' مع جدول 'employee' للحصول على أسماء الموظفين بناءً على معرفاتهم.
- استخدام الكلمة المفتاحية in للتحقق من وجود معرف الموظف ضمن نتائج استعلام آخر.
- مثال عملي على استعلام متداخل لإيجاد العملاء الذين يتعامل معهم فرع يديره مايكل سكوت.
- كيفية استخراج معرف الفرع الذي يديره مدير معين ثم استخدامه لجلب بيانات العملاء المرتبطين بهذا الفرع.
- أهمية استخدام limit 1 لتجنب إرجاع قيم متعددة عند استخدام شرط المساواة في الاستعلامات المتداخلة.
- نصائح لفهم الاستعلامات المتداخلة من خلال تفكيكها إلى أجزاء بسيطة وممارسة الكتابة.
- توضيح أن الاستعلامات المتداخلة قد تكون معقدة لكنها أساسية للاستعلامات المتقدمة في SQL.
- تشجيع المتابعين على التفاعل وترك تعليقات للمساعدة في تحسين المحتوى.
Chapters
- 00:00مقدمة عن الاستعلامات المتداخلة في SQL
- 00:38عرض جدول works_with وبيانات المبيعات
- 01:31ربط بيانات الموظفين باستخدام استعلام متداخل
- 02:11كتابة استعلام لجلب معرفات الموظفين الذين باعوا أكثر من 30 ألف
- 03:17استخدام استعلام متداخل مع الكلمة المفتاحية in لجلب أسماء الموظفين
- 05:02مثال جديد: إيجاد العملاء حسب الفرع الذي يديره مايكل سكوت
- 05:40استخراج معرف الفرع الذي يديره مايكل سكوت
- 07:31استخدام الاستعلام المتداخل لجلب أسماء العملاء
- 08:12أهمية استخدام limit 1 في الاستعلامات المتداخلة
- 08:55نصائح ختامية حول فهم وممارسة الاستعلامات المتداخلة
Full Transcript — Download SRT & Markdown
Speaker A
مرحبًا بكم في أكاديمية درافت (Draft Academy). أنا مايك، وفي هذا الدرس سأتحدث معكم عن الاستعلامات المتداخلة في SQL.
Speaker A
الاستعلام المتداخل هو ببساطة استعلام نستخدم فيه جملتي "select" أو أكثر للحصول على معلومة محددة. في كثير من الأحيان، نرغب في الحصول على معلومات دقيقة جداً، ونحتاج لاستخدام نتائج جملة "select" واحدة لتحديد نتائج جملة أخرى. هذا الموضوع متقدم نوعاً ما، وهو يمثل بداية دخولنا في كتابة الاستعلامات المتقدمة. لكنني أريد أن أوضح لكم كيف يعمل ذلك، لأن الكثير من المعلومات التي ستحتاجون إليها ستتضمن استخدام استعلامات متداخلة.
Speaker A
فلنضع الآن مطلباً على الشاشة. يقول المطلب: "أوجد أسماء جميع الموظفين الذين باعوا أكثر من 30 ألف دولار لعميل واحد". إذن، نريد الحصول على أسماء الموظفين إذا كانوا قد باعوا أكثر من 30 ألف دولار لعميل واحد. لذا، أول شيء سأفعله إذا
Speaker A
كنا نحاول معرفة كيفية كتابة هذا الاستعلام، هو إلقاء نظرة على المعلومات المتاحة لدينا. لدينا هنا جدول "works with"، وهذا الجدول يحتوي على إجمالي المبيعات، أليس كذلك؟ وكل صف من هذه الصفوف يحدد مقدار ما باعه موظف معين لعميل معين،
Speaker A
أليس كذلك؟ على سبيل المثال، الموظف 105 باع 55 ألف دولار للعميل 400، وهكذا. هنا لدينا جزء من المعلومات، أليس كذلك؟ بمعنى آخر، لدينا هنا إجمالي المبيعات. ولكن، ما لا نملكه هو الاسم الأول والأخير للموظف، صحيح؟ نحن لا نملك اسم
Speaker A
الموظف الفعلي. لكن ما نملكه هو معرف (ID) الموظف الذي قام بالعملية، صحيح؟ إذن، لدينا معرف الموظف.
Speaker A
ويمكننا استخدام معرف الموظف للحصول على اسمه الأول والأخير. في هذه الحالة، لدينا جزء من البيانات هنا في جدول "works with"، وجزء آخر في جدول الموظفين "employee". وهذه حالة يمكننا فيها استخدام استعلام متداخل. لذا، أول شيء سأقوم به هو
Speaker A
كتابة استعلام سيجلب لي جميع معرفات الموظفين الذين باعوا أكثر من 30 ألف دولار لعميل واحد. حسناً، سنبدأ بالخطوة الأولى، والتي تعني جلب جميع معرفات الموظفين من هنا إذا كانوا قد باعوا أكثر من 30 ألفاً.
Speaker A
لنبدأ بكتابة هذا الاستعلام. لن يكون الأمر صعباً بالنظر إلى كل ما نعرفه. سأقوم باختيار employee_id من جدول works_with وسأختاره حيث total_sales أكبر من 30,000. وسنقوم بإنهاء هذا الاستعلام. في الواقع، سأقوم بإضافة اسم الجدول كبادئة هنا.
Speaker A
لذا، سأكتب works_with.employee_id وهنا سنكتب works_with.total_sales. فقط ليكون الأمر أكثر وضوحاً. خاصة عندما نتعامل مع استعلامات متداخلة، من المفيد عادةً إضافة اسم الجدول كبادئة تحسباً لوجود أسماء أعمدة مكررة. سأقوم بتشغيل هذا، ومن المفترض أن يعطينا جميع معرفات الموظفين الذين باعوا
Speaker A
أكثر من 30,000. سترى أننا حصلنا على 102، و105 تظهر ثلاث مرات. يبدو أن 105 قد باع الكثير من الورق. الآن لدينا جميع معرفات الموظفين الذين باعوا منتجات بقيمة تزيد عن 30,000. ما يمكننا فعله الآن هو معرفة الأسماء الأولى
Speaker A
والأخيرة لهؤلاء الموظفين من هذه المعلومات. لذا، سأقوم بكتابة استعلام آخر هنا. سأكتب select وسأختار employee.first_name وكذلك employee.last_name من جدول employee. وهنا سنكتب where، وهذا هو المكان الذي سنستخدم فيه استعلاماً متداخلاً.
Speaker A
بشكل أساسي، أريد اختيار جميع الموظفين الذين حصلنا على معرفاتهم من هذا الاستعلام. يمكنني القول employee.emp_id in، وتذكر أن الكلمة المفتاحية in ستعطينا نتيجة إذا كان معرف الموظف ضمن القيم المحددة بين هذين القوسين. لذا، يمكنني فعلياً دمج هذا الاستعلام في الداخل.
Speaker A
سأقوم بأخذ هذا الاستعلام ولصقه هنا بين القوسين. شيء واحد يجب أن تضعه في اعتبارك هو كيفية تنسيق هذا الاستعلام.
Speaker A
سترى أنني قمت بتنسيقه وإزاحته عن الاستعلام الرئيسي. سأقوم بحذف هذه الفاصلة المنقوطة وسنضع واحدة في النهاية. بشكل أساسي، هذا يعني أنني أريد الحصول على الاسم الأول والأخير من جدول الموظفين حيث يكون معرف الموظف ضمن نتيجة هذا الاستعلام. لذا،
Speaker A
إذا تم إرجاع معرف الموظف من هذا الاستعلام، الذي أعطانا معرفات جميع الموظفين الذين باعوا أكثر من 30,000، فسنقوم بإرجاع اسمهم الأول واسمهم الأخير. حسناً، لنقم بتشغيل هذا.
Speaker A
وستلاحظ هنا، أننا نحصل الآن على أسماء الموظفين الاثنين. فقد باع مايكل سكوت أكثر من 30,000 وباع ستانلي هدسون أيضاً أكثر من 30,000. لذا، هذه في الواقع طريقة رائعة جداً يمكننا من خلالها معرفة تلك المعلومات.
Speaker A
إذاً، هذه هي الطريقة التي يمكننا بها استخدام استعلام متداخل، أليس كذلك؟ في كثير من الأحيان ستستخدم الكلمة المفتاحية "in". سأعرض عليك في الواقع بعض الأمثلة الأخرى حيث نستخدم أشياء أخرى. أم، ولكن في هذه الحالة، نحن نتحقق أساساً
Speaker A
لمعرفة ما إذا كان معرف الموظف موجوداً في هذه النتيجة. حسناً. حسناً، الآن لدي مطالبة أخرى هنا. تقول: "اعثر على جميع العملاء الذين يتم التعامل معهم من قبل الفرع الذي يديره مايكل سكوت". إذاً، هذه واحدة أخرى مثيرة للاهتمام. تقول: "افترض
Speaker A
أنك تعرف معرف مايكل". إذاً، سنفترض أننا نعرف ما هو معرف مايكل سكوت. هذه الحالة التي سنحتاج فيها مرة أخرى إلى الحصول على بيانات من جدول واحد من أجل إبلاغ البيانات من جدول آخر. لذا، أول شيء نريد أن نكون قادرين
Speaker A
على القيام به هو معرفة معرف الفرع الذي يديره مايكل سكوت، أليس كذلك؟ لذا، هنا لدينا فروعنا ولكل منها معرف مدير، أليس كذلك؟ وهكذا، ما نحتاج إلى القيام به هو أن نكون قادرين على معرفة أي من هذه الفروع يديره مايكل سكوت. بعد
Speaker A
ذلك، بمجرد حصولنا على تلك المعلومات، يمكننا معرفة جميع العملاء الذين يستخدمون معرف الفرع ذلك، أليس كذلك؟ لذا، هنا سيقوم معرف المدير بتحديد مايكل سكوت وسيقوم معرف الفرع في الواقع بتحديد جدول العملاء هنا لأنه يحتوي على معرف الفرع كمفتاح خارجي. لذا،
Speaker A
أول شيء سنفعله هو معرفة الفرع الذي يديره مايكل سكوت. لذا، يجب أن يكون ذلك سهلاً بما فيه الكفاية. يمكننا فقط قول select وسنقوم في الواقع بعمل branch.branch_id من branch حيث، وتذكر أننا سنفترض أننا نعرف معرف مايكل
Speaker A
سكوت، لذا يمكنني فقط قول branch.manager_id يساوي، ومعرف مايكل سكوت هو 102. لذا، يمكنني فقط قول يساوي 102. وهكذا، ما يجب أن يفعله هذا هو أنه يجب أن يعطينا معرف الفرع للفرع الذي يديره. في هذه الحالة، وفي الواقع عفواً،
Speaker A
بدلاً من branch_id يجب أن يكون هذا manager_id. وهذا سيعطينا الرقم اثنين، أليس كذلك؟ لأن اثنين هو فرع سكرانتون، وهو الفرع الذي يديره مايكل سكوت. الآن بما أن لدينا هذه المعلومة، كل ما نريد فعله هو الحصول على جميع
Speaker A
العملاء الذين يتعامل معهم ذلك الفرع. لذا، يمكننا ببساطة قول select ولماذا لا نحصل فقط على اسم العميل؟ لذا، سنكتب فقط client.client_name من جدول client حيث سنقول هنا ببساطة where client.branch_id يساوي، وهنا سنجعله مساوياً لنتيجة هذا الاستعلام.
Speaker A
إذن، سنجعله مساوياً لنتيجة الحصول على معرف الفرع الذي يديره مايكل سكوت. لذا، سنضع هذه العبارة في الأسفل، وسترى مجدداً أنني أقوم بتضمينها هنا. ما سيحدث هو أن نظام إدارة قواعد البيانات العلائقية عندما يرى عبارة SQL مضمنة كهذه،
Speaker A
فإنه سينفذها أولاً ثم ينفذ العبارة الخارجية. إذن، يبدأ من الداخل ثم يتجه تدريجياً نحو الخارج.
Speaker A
وهكذا، سنتمكن من الحصول على معرف الفرع الذي يديره مايكل سكوت، ومن ثم نستخدم تلك المعلومة للعثور على جميع العملاء. لذا، سأضغط هنا على تشغيل (run) وسأقوم بإزالة الفاصلة المنقوطة من هنا، والآن يمكننا تشغيلها وسترى أننا حصلنا على كل هؤلاء
Speaker A
العملاء. نحصل على أسماء مثل مدرسة دونمور الثانوية، ومقاطعة لاكاوانا، وسكرانتون وايت بيجز، وفيديكس. هؤلاء هم كل العملاء الذين تتم إدارتهم بواسطة فرع سكرانتون. الآن، هناك شيء آخر أريد الإشارة إليه، وهو أنك ستلاحظ هنا أننا نضبط client.branch_id ليكون مساوياً لنتيجة هذه
Speaker A
العبارة. لكن المشكلة هي أن هذه العبارة لا تضمن بالضرورة إرجاع قيمة واحدة فقط. لذا، لنفترض أن مايكل سكوت كان مديراً لعدة فروع، فمن المحتمل أن يعيد هذا قيماً متعددة. لذا، ما نريد فعله هو النزول إلى هنا وكتابة
Speaker A
limit 1. وهذا سيضمن لنا الحصول على واحدة فقط من تلك القيم. الآن إذا ضغطت على تشغيل، سترى أنها تفعل الشيء نفسه.
Speaker A
على الرغم من أننا الآن نضمن فقط أن لدينا قيمة واحدة. لذا، في أي وقت تستخدم فيه المساواة، من الجيد دائماً تحديدها بواحدة ما لم تكن تبحث عن حالة يدير فيها مايكل سكوت فروعاً متعددة، وفي هذه الحالة يمكننا
Speaker A
استخدام in بدلاً من ذلك. حسناً، كانت هذه لمحة بسيطة عن الاستعلامات المتداخلة. من الواضح أن هذه الاستعلامات قد تصبح معقدة جداً، وما يهم حقاً هو امتلاكك لفهم راسخ للأساسيات.
Speaker A
إذا لم تكن تفهم الأساسيات التي تحدثنا عنها حتى هذه اللحظة في الفيديو، فإن استخدام الاستعلامات المتداخلة سيصيبك ببالغ الحيرة.
Speaker A
الاستعلامات المتداخلة ببساطة هي عبارة عن استعلام يغذي استعلاماً آخر، وربما استعلاماً ثالثاً، أليس كذلك؟ نحن نستخدم نتائج استعلام ما للحصول على نتائج من استعلام آخر، وهكذا.
Speaker A
وطالما يمكنك تفكيك الاستعلام المتداخل إلى أجزائه الفردية، فلن تواجه أي مشكلة في كتابتها. في الحقيقة، أفضل طريقة لتصبح بارعاً في كتابة استعلامات أكثر تعقيداً كهذه هي الممارسة فقط. لذا، كلما تدربت أكثر على كتابة الاستعلامات المتداخلة واستخدام كل هذه العناصر معاً،
Speaker A
أصبحت أكثر مهارة في ذلك. شكراً لكم على المشاهدة. إذا أعجبكم الفيديو، يرجى ترك إعجاب والاشتراك في Jeff Academy لتكونوا أول من يعلم عند طرحنا لمحتوى جديد. كما أننا نسعى دائماً للتحسين. لذا، إذا كانت لديكم أ
Speaker A
أصبحت أكثر مهارة في ذلك. شكراً لكم على المشاهدة. إذا أعجبكم الفيديو، يرجى ترك إعجاب والاشتراك في Jeff Academy لتكونوا أول من يعلم عند طرحنا لمحتوى جديد. كما أننا نسعى دائماً للتحسين. لذا، إذا كانت لديكم أي انتقادات بناءة أو
Speaker A
أسئلة أو أي شيء آخر، اتركوا تعليقاً في الأسفل. وأخيراً، إذا كنتم تستمتعون بـ Draft Academy وترغبون في مساعدتنا على النمو، توجهوا إلى draftacademy.com/contribute وساهموا في مستقبلنا.
Topics:SQLاستعلامات متداخلةselectجداول الموظفينجداول العملاءinlimitدروس SQLتحليل البياناتأكاديمية درافت











