سؤال

هل هناك فرق كبير بين ما يلي؟

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

و

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

هل لدى مستخدمي SO تفضيل واحد على الآخر؟

هل كانت مفيدة؟

المحلول

وهناك لا فرق، ولكن القراءة من الثانية أفضل بكثير عندما يكون لديك كبيرة متعددة انضمام الاستعلام مع اضافية حيث شروط الترشيح.
فصل الانضمام بنود وشروط مرشح هو شيء جيد:)

نصائح أخرى

والسابق هو ANSI 89 غوي، وهذا الأخير هو ANSI 92.

ل<م> هذا الاستعلام معين ليس هناك فرق. ومع ذلك، مع السابق تفقد القدرة على الفصل بين مرشح من شرط الربط في الاستعلامات المعقدة، وبناء الجملة لتحديد LEFT RIGHT مباراة مقابل INNER غالبا ما تكون مربكة، وخاصة إذا كان لديك للذهاب ذهابا وإيابا بين مختلف البائعين ديسيبل. أنا لا أحب بناء الجملة القديمة على الإطلاق.

وليس هناك فرق في محرك استعلام SQL.

لقراءة، وهذا الأخير هو أسهل بكثير للقراءة إذا كنت تستخدم بفواصل والمسافة البادئة.

لالصلات الداخلية، لا يهم إذا كنت وضعت "الفلاتر" و "ينضم" في ON أو جملة WHERE، محسن الاستعلام يجب أن تقرر ما يجب القيام به لأول مرة على أي حال (قد اختار للقيام مرشح لأول مرة، والانضمام في وقت لاحق ، أو العكس بالعكس

لالصلات الخارجي ومع ذلك، هناك فرق، وأحيانا تريد يوول لوضع شرط في شرط ON، أحيانا في WHERE. وضع شرط في جملة WHERE لصلة خارجية يمكن تحويلها إلى INNER JOIN (بسبب كيفية عمل بالقيم الفارغة)

وعلى سبيل المثال، والتحقق من القراءة بين العينتين التالية:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

ومقابل

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

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

  1. إنه المعيار المعتمد حاليًا
  2. فهو يحتفظ بالصلات في جملة FROM ويقوم بالتصفية في جملة WHERE
  3. فهو يجعل الصلات الخارجية الأكثر تعقيدًا لليسار واليمين والكامل أسهل بكثير
  4. تعتمد تعليمات MSSQL كلها على بناء الجملة هذا، وبالتالي من الأسهل بكثير الحصول على مساعدة بشأن استعلامات المشكلة الخاصة بك

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

لا فرق. أجد الشكل الأول أكثر قابلية للقراءة واستخدام الشكل الثاني فقط عند القيام بأنواع أخرى من ينضم (الخارجي، LEFT الداخلية، الخ).

والنموذج الثاني هو SQL92 جملة متوافقة. هذا ينبغي أن يعني ذلك كانت مدعومة من قبل جميع البائعين قواعد البيانات الحالية والمستقبلية. ومع ذلك، فإن الحقيقة هي أن الشكل الأول هو السائد بحيث يضمن ذلك أيضا أن يكون حول لفترة أطول مما كنا الرعاية.

وإلا فإنها هي نفسها في جميع النواحي في كيفية تعامل قواعد البيانات اثنين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top