MySQL के प्रश्नों में, इसके बजाय जुड़ने का उपयोग क्यों करें?


108

ऐसा लगता है कि दो या अधिक तालिकाओं को संयोजित करने के लिए, हम या तो जुड़ने का उपयोग कर सकते हैं या जहां। एक के बाद एक फायदे क्या हैं?


2
आपके उपयोग के आधार पर, संभवतः इसके परिणाम समान होते हैं, लेकिन एक JOIN के साथ आप अन्य प्रकार के संघ कर सकते हैं।
zneak

क्या इससे आपके सवाल का जवाब मिलता है?
आईएनआर जोइन

जवाबों:


160

किसी भी क्वेरी में एक से अधिक टेबल शामिल हैं, टेबल "ए" से टेबल "बी" के परिणामों को जोड़ने के लिए एसोसिएशन के कुछ रूप की आवश्यकता होती है। ऐसा करने का पारंपरिक (ANSI-89) साधन है:

  1. FROM क्लॉज़ में अल्पविराम से अलग सूची में शामिल तालिकाओं की सूची बनाएँ
  2. WHERE क्लॉज में तालिकाओं के बीच सहयोग लिखें

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

यहां ANSI-92 JOIN सिंटैक्स का उपयोग करके फिर से लिखा गया प्रश्न है:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

प्रदर्शन के परिप्रेक्ष्य से:


जहाँ समर्थित (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), अन्य पर सिंटैक्स का उपयोग करने के लिए कोई प्रदर्शन लाभ नहीं है। आशावादी उन्हें एक ही प्रश्न के रूप में देखता है। लेकिन अधिक जटिल प्रश्न ANSI-92 सिंटैक्स का उपयोग करने से लाभ उठा सकते हैं:

  • जोइन ऑर्डर को नियंत्रित करने की क्षमता - वह ऑर्डर जो टेबल स्कैन किया जाता है
  • शामिल होने से पहले एक टेबल पर फिल्टर मानदंड लागू करने की क्षमता

एक रखरखाव परिप्रेक्ष्य से:


ANSI-89 पर ANSI-92 JOIN सिंटैक्स का उपयोग करने के कई कारण हैं:

  • अधिक पठनीय, जैसा कि JOIN मानदंड WHERE क्लॉज से अलग है
  • जॉय मानदंड याद करने की संभावना कम है
  • ININ को छोड़कर अन्य प्रकार के JOIN के लिए लगातार वाक्यविन्यास समर्थन, जिससे अन्य डेटाबेस पर उपयोग करना आसान हो जाता है
  • जहां क्लॉज केवल तालिकाओं के कार्टेशियन उत्पाद के निस्पंदन के रूप में कार्य करता है

एक डिजाइन परिप्रेक्ष्य से:


ANSI-92 JOIN सिंटैक्स पैटर्न है, न कि पैटर्न-विरोधी:

  • क्वेरी का उद्देश्य अधिक स्पष्ट है; एप्लिकेशन द्वारा उपयोग किए जाने वाले कॉलम स्पष्ट हैं
  • यह जब भी संभव हो सख्त टाइपिंग का उपयोग करने के बारे में मॉड्यूलरिटी नियम का पालन करता है। स्पष्ट रूप से लगभग सार्वभौमिक रूप से बेहतर है।

निष्कर्ष


परिचित और / या आराम की कमी, मुझे ANSI-92 JOIN सिंटैक्स के बजाय ANSI-89 WHERE क्लॉज का उपयोग जारी रखने का कोई लाभ नहीं दिखता है। कुछ लोग शिकायत कर सकते हैं कि एएनएसआई -92 सिंटैक्स अधिक क्रिया है, लेकिन यही इसे स्पष्ट करता है। अधिक स्पष्ट, समझने और बनाए रखने में आसान है।


14
"... किसी भी क्वेरी में एक से अधिक तालिका शामिल होती है, तालिका 'ए' से परिणाम को टेबल 'बी' से जोड़ने के लिए किसी न किसी रूप की आवश्यकता होती है ... अन्यथा आपको कार्टेशियन उत्पाद मिल जाएगा, और आप शायद ऐसा नहीं चाहते हैं (वे कार्टेशियन LOUSY उत्पाद बनाते हैं)।
स्कॉट स्मिथ 3

8

ज्यादातर लोग जोइन सिंटैक्स को थोड़ा स्पष्ट पाते हैं जैसे कि क्या शामिल हो रहा है। इसके अतिरिक्त, यह एक मानक होने का लाभ है।

व्यक्तिगत रूप से, मैं WHEREs पर "बड़ा हुआ" हूं, लेकिन जितना अधिक मैं जॉय सिंटैक्स का उपयोग करता हूं उतना अधिक मैं यह देखना शुरू कर रहा हूं कि मैं और अधिक स्पष्ट कैसे हूं।


1
@ नवाफ मुझे समझ में आया - मुझे पुराने स्टाइल के सिंटैक्स पर लाया गया था, लेकिन एक बार जब मैं नए के लिए अभ्यस्त हो गया, तो लाभ स्पष्ट हो गए जैसे कि गलती से क्रॉस जॉइन करना कठिन, अधिक स्पष्ट, यह देखना आसान है कि क्या ज्वाइन है और क्या है एक फिल्टर, आदि ... मैं आदी हो गया।
बेसिक

8

जहाँ सिंटैक्स (निहितार्थ के रूप में जाना जाता है अन्य) का उपयोग करने के साथ ये समस्याएं हैं:

सबसे पहले, आकस्मिक क्रॉस जॉइन प्राप्त करना बहुत आसान है, क्योंकि मेज के नामों के आगे सम्मिलित स्थितियां ठीक नहीं हैं। यदि आपके पास 6 तालिकाओं को एक साथ जोड़ा जा रहा है, तो जहां खंड में एक को याद करना आसान है। आप अलग-अलग कीवर्ड का उपयोग करके इस निश्चित को बहुत बार देखेंगे। यह डेटाबेस के लिए आहुंग प्रदर्शन हिट है। आप स्पष्ट ज्वाइन सिंटैक्स का उपयोग करके एक आकस्मिक क्रॉस जॉइन नहीं कर सकते क्योंकि यह सिंटैक्स चेक में विफल हो जाएगा।

कुछ डेटाबेस में पुराने सिंटैक्स में दाएं और बाएं जोड़ समस्याग्रस्त हैं (SQl सर्वर में आपको सही परिणाम प्राप्त करने की गारंटी नहीं है)। इसके अलावा वे SQL सर्वर मुझे पता है में पदावनत हैं।

यदि आप एक क्रॉस जॉइन का उपयोग करने का इरादा रखते हैं, तो यह पुराने सिंटैक्स से स्पष्ट नहीं है। यह वर्तमान एएनएसआईआई मानक का उपयोग करके स्पष्ट है।

अनुरक्षक के लिए यह देखना बहुत कठिन है कि कौन से फ़ील्ड ज्वाइन का हिस्सा हैं या यहां तक ​​कि कौन सी टेबल एक साथ जुड़ती हैं और किस क्रम में इम्प्लांट सिंटैक्स का उपयोग किया जाता है। इसका मतलब है कि प्रश्नों को संशोधित करने में अधिक समय लग सकता है। मैंने बहुत कम लोगों को जाना है, जो एक बार स्पष्ट जुड़ने वाले वाक्य रचना के साथ सहज महसूस करने के लिए समय निकाल लेते हैं, कभी पुराने रास्ते पर लौट जाते हैं।

मैंने यह भी देखा है कि कुछ लोग जो इन निहित जोड़ का उपयोग करते हैं, वे वास्तव में यह नहीं समझते हैं कि कैसे काम में शामिल होता है और इस प्रकार उनके प्रश्नों में गलत परिणाम मिल रहे हैं।

ईमानदारी से, क्या आप किसी अन्य प्रकार के कोड का उपयोग करेंगे जो 18 साल पहले एक बेहतर विधि के साथ बदल दिया गया था?


6

स्पष्ट जुड़ाव इरादे को जोड़ता है, जहां फ़िल्टर करने के लिए क्लॉज को छोड़कर। यह क्लीनर है और यह मानक है, और आप बाएं बाहरी या दाएं बाहरी जैसे काम कर सकते हैं जो केवल जहां करना मुश्किल है।


3

आप दो तालिकाओं के संयोजन के लिए WHERE का उपयोग नहीं कर सकते। लिखने के लिए आप क्या कर सकते हैं:

SELECT * FROM A, B
WHERE ...

यहाँ अल्पविराम लेखन के बराबर है:

SELECT *
FROM A
CROSS JOIN B
WHERE ...

क्या आप लिखेंगे? नहीं - क्योंकि यह वह नहीं है जो आप बिल्कुल मतलब है। आप एक क्रॉस जॉइन नहीं करना चाहते हैं, आप एक INNER JOIN चाहते हैं। लेकिन जब आप कॉमा लिखते हैं, तो आप क्रोस जॉइन कह रहे हैं और यह भ्रामक है।


0

वास्तव में आपको अक्सर "WHERE" और "JOIN" दोनों की आवश्यकता होती है।

"JOIN" का प्रयोग दो कॉलम के डेटा को पुनः प्राप्त करने के लिए किया जाता है - एक सामान्य कॉलम के मूल्यों पर आधारित। यदि आप इस परिणाम को और फ़िल्टर करना चाहते हैं, तो WHERE क्लॉज़ का उपयोग करें।

उदाहरण के लिए, "LEFT JOIN" बाईं तालिका से सभी पंक्तियों को पुनर्प्राप्त करता है, साथ ही दाईं तालिका से मिलान पंक्तियाँ। लेकिन यह किसी विशिष्ट मूल्य या अन्य स्तंभों पर रिकॉर्ड को फ़िल्टर नहीं करता है जो JOIN का हिस्सा नहीं हैं। इस प्रकार, यदि आप इस परिणाम को आगे फ़िल्टर करना चाहते हैं, तो WHERE क्लॉज में अतिरिक्त फ़िल्टर निर्दिष्ट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.