اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

يقول خبراء بان الخلافات المزعومة بين Exists  و INفي التقنية و الاداء ناتجة عن عدم ادراك (implementations, limitations,bugs ) التطبيقات و المحددات او الحدود و الاخطاء لدى البعض ، و عموما ناتجة في غالبها عن قصور في فهم صحيح لقواعد البيانات .

إن التحليل السليم وإحسان تعريف وإنشاء الجداول، ودقة الإحصاءات، وتكوين قاعدة بيانات سليمة ، لها تأثير على خطة التنفيذ للقاعدة وبالتالي على مقاييس الأداء والفاعلية .

و للتفصيل نقول ، لا بد من ادراك المشغلات و الجمل و غاياتها و استيعاب تطبيقاتها و محدداتها ( حدودها ) قبل التعامل معها و / أو اختيار أي منها ، فلا بد من تطابق غايتنا من الاستخدام مع الغاية التي جعلها المطورون لهذا المشغل او الجملة ، بالاضافة لمراعاة الحدود و السرعة الافتراضية لاظهر النتائج و الوصول للغايات.

و ابتداءا ... لماذا لا نتحقق من الناس الذين طوروا تلك المشغلات في أنظمتهم؟

الجواب المباشر من  Microsoft يقول بان :

IN

Determines whether a specified value matches any value in a sub query or a list.

لتحديد ما إذا كانت قيمة محددة تطابق أي قيمة في استعلام فرعي أو قائمة.

EXISTS:

Specifies a sub query to test for the existence of rows.

تخصيص استعلام فرعي لاختبار وجود صفوف.

و بالبحث في الغايات نجد أن :

Exists  مشغل يتحقق من وجود نتيجة استعلام فرعي ، يختبر المشغل ما إذا كان طلب البحث الفرعي يجلب صفا واحدا على الأقل ليعود بالقيمة True، اما اذا لم يتم إرجاع أي بيانات ، يقوم هذا المشغل بالعودة بالقيمة FALSE.

Exists هو:

·         مشغل مقارنة comparison operator  

·         يستخدم في جملة  Where ليقيم شرط  It Exists

·         يخبرك اذا كان الاستعلام قد عاد باي نتيجة

·         يعود بالقيمة True   اذا كان الاستعلام الفرعي يحتوي أي صف

SELECT agent_code,agent_name,working_area,commission 
FROM agents
WHERE exists
(SELECT * FROM  customer
WHERE grade=3
AND agents.agent_code=customer.agent_code)
ORDER BY commission;

IN مشغل يقوم بالتحقق من قيمة ضمن مجموعة من القيم مفصولة بفواصل واسترجاع صفوف الجدول المطابقة ، ويرجع بالقيمة 1 عندما تكون قيمة البحث الموجودة ضمن النطاق وخلاف ذلك يرجع بالقيمة 0.

يمكن أن تكون قيمة التحقق قيمة نصية ، سلسلة أو كلمة أو جملة (string , word , sentence ) ، أو قيمة رقمية ، ويمكن أيضا التحقق من هذه القيم ضمن مجموعة من القيم مفصولة بفواصل واسترجاع الصفوف التي تحتوي على هذه القيم .

SELECT *
FROM agents
WHERE working_area IN(‘London’,’Mumbai’,’Chennai’);

 

و بالتنقيب بين ملاحظات المطورين و المستخدمين في باب الغايات و باب السرعة ، نورد لكم بعض الملاحظات و التطبيقات من هنا وهناك :

IN يدعم فقط علاقات المساواة (أو عدم المساواة عندما يسبقه Not).

وهو مرادف ل = أي / = بعض، على سبيل المثال

select    * 
from      t1 
where     x in (select x from t2) ;

Exists   يدعم أنواع مختلفة من العلاقات، والتي لا يمكن التعبير عنها باستخدام IN ، على سبيل المثال

select    * 
from      t1 
where     exists (select    null 
                  from      t2 
                  where     t2.x=t1.x 
                        and t2.y>t1.y 
                        and t2.z like '℅' || t1.z || '℅'  ) ;

في IN لا يمكن مقارنة أي شيء مع  NULL ، ولكن شرط Exists  يمكن مقارنة كل شيء مع  NULL .

عندما لا تعرف ان كان السجل موجودا أم لا، يجب عليك اختيار EXIST

عندما يكون طلب البحث الداخلي لجلب ألاف الصفوف، سيكون Exists هو الخيار الأفضل

عندما يكون طلب البحث الداخلي لجلب صفوف محدودة ، سيكون IN أسرع

هذا عموم القول و بعض تفصيله .....

  • Like 1
  • Thanks 1
  • 10 months later...
  • 6 months later...
قام بنشر

بارك الله فيك يا ابا آدم ووفقك على الرغم أني جديد في فهم SQL إلا أني استفدت من طرحك المبارك دمت بود وخير وبركة

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information