sql - बनाम खंड पर अंदर शामिल हों




mysql join (7)

सादगी के लिए, मान लें कि सभी प्रासंगिक फ़ील्ड पूर्ण NOT NULL हैं।

तुम कर सकते हो:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

वरना:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

इन दो कामों को MySQL में उसी तरह से करें?


अंतर्निहित एएनएसआई सिंटैक्स में शामिल होना पुराना, कम स्पष्ट और अनुशंसित नहीं है।

इसके अलावा, रिलेशनल बीजगणित WHERE क्लॉज और INNER JOIN में भविष्यवाणियों की अदलाबदल करने की इजाजत देता है, इसलिए WHERE क्लॉज के साथ INNER JOIN प्रश्नों को भविष्यवाणियों द्वारा पुन: व्यवस्थित किया जा सकता है।

मैं आपको सबसे अधिक संभव तरीके से प्रश्नों को लिखने की सलाह देता हूं।

कभी-कभी इसमें INNER JOIN अपेक्षाकृत "अधूरा" शामिल होता है और WHERE फ़िल्टरिंग मानदंडों की सूचियां आसानी से रखरखाव करने के लिए WHERE में कुछ मानदंड डालते हैं।

उदाहरण के लिए, इसके बजाए:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

लिखना:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

लेकिन यह निश्चित रूप से निर्भर करता है।


अन्य ने इंगित किया है कि इनर जॉइन मानव पठनीयता में मदद करता है, और यह सर्वोच्च प्राथमिकता है; मैं सहमत हूँ। मुझे यह बताने की कोशिश करें कि क्यों शामिल वाक्यविन्यास अधिक पठनीय है।

एक मूल चयन क्वेरी यह है:

SELECT stuff
FROM tables
WHERE conditions

चयन खंड हमें बताता है कि हम क्या वापस आ रहे हैं; खंड से हमें बताता है कि हम इसे कहां से प्राप्त कर रहे हैं, और WHERE खंड हमें बताता है कि हम कौन से हैं।

जॉइन टेबल के बारे में एक बयान है, वे एक साथ कैसे बंधे हैं (अवधारणात्मक रूप से, वास्तव में, एक ही तालिका में)। टेबल पर नियंत्रण रखने वाले किसी भी क्वेरी तत्व - जहां से हम सामान प्राप्त कर रहे हैं - अर्थात् से खंड से संबंधित है (और निश्चित रूप से, जहां जॉइन तत्व जाते हैं)। WHERE क्लॉज में शामिल तत्वों को जोड़ना किस और कहां से है ; यही कारण है कि जॉइन वाक्यविन्यास को प्राथमिकता दी जाती है।


उनके पास एक अलग मानव-पठनीय अर्थ है।

हालांकि, क्वेरी ऑप्टिमाइज़र के आधार पर, उनके पास मशीन के समान अर्थ हो सकता है।

आपको हमेशा पठनीय होने के लिए कोड होना चाहिए।

यही कहना है, यदि यह एक अंतर्निहित संबंध है, तो स्पष्ट शामिल होने का उपयोग करें। यदि आप कमजोर संबंधित डेटा से मेल खाते हैं, तो खंड कहां उपयोग करें।


एएनएसआई सिंटैक्स में शामिल है निश्चित रूप से अधिक पोर्टेबल है।

मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर के अपग्रेड के माध्यम से जा रहा हूं, और मैं यह भी उल्लेख करता हूं कि SQL सर्वर में बाहरी जुड़ने के लिए = * और * = वाक्यविन्यास 2005 एसक्यूएल सर्वर और बाद में समर्थित नहीं है (संगतता मोड के बिना)।


मुझे पता है कि आप MySQL के बारे में बात कर रहे हैं, लेकिन वैसे भी: ओरेकल 9 में स्पष्ट रूप से शामिल हो जाते हैं और निहित जुड़ने से विभिन्न निष्पादन योजनाएं उत्पन्न होती हैं। AFAIK जिसे ओरेकल 10+ में हल किया गया है: अब ऐसा कोई अंतर नहीं है।


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

इसके अतिरिक्त रखरखाव के लिए यदि आपके पास पुराने वाक्यविन्यास में एक क्रॉस शामिल है, तो रखरखावकर्ता को कैसे पता चलेगा कि क्या आपके पास एक होना चाहिए (ऐसी परिस्थितियां हैं जहां क्रॉस जॉइन की आवश्यकता होती है) या यदि यह एक दुर्घटना थी जिसे ठीक किया जाना चाहिए?

यदि आप बाएं जुड़ने का उपयोग करते हैं तो यह देखने के लिए कि आप निहित वाक्यविन्यास खराब क्यों हैं, इस सवाल को आपको इंगित करने दें। Sybase * = एक ही आंतरिक तालिका के लिए 2 अलग बाहरी तालिकाओं के साथ Ansi मानक

इसके अलावा (यहां व्यक्तिगत रान), स्पष्ट जुड़ने का उपयोग करने वाला मानक 20 साल से अधिक पुराना है, जिसका अर्थ है कि उन 20 वर्षों के लिए अंतर्निहित वाक्यविन्यास पुराना हो गया है। क्या आप सिंटैक्स का उपयोग कर आवेदन कोड लिखेंगे जो 20 साल से पुराना हो गया है? आप डेटाबेस कोड क्यों लिखना चाहते हैं?


INNER JOIN एएनएसआई सिंटैक्स है जिसका आपको उपयोग करना चाहिए।

इसे आम तौर पर अधिक पठनीय माना जाता है, खासकर जब आप बहुत सारी टेबल में शामिल होते हैं।

जब भी आवश्यकता होती है तो इसे आसानी से एक OUTER JOIN साथ भी बदला जा सकता है।

WHERE वाक्यविन्यास अधिक रिलेशनल मॉडल उन्मुख है।

दो तालिकाओं का परिणाम JOIN एड टेबल का एक कार्टेशियन उत्पाद है जिसमें फ़िल्टर लागू होता है जो कॉलम मिलान में शामिल होने के साथ ही उन पंक्तियों का चयन करता है।

WHERE वाक्यविन्यास के साथ इसे देखना आसान है।

आपके उदाहरण के लिए, MySQL (और आमतौर पर एसक्यूएल में) इन दो प्रश्न समानार्थी हैं।

यह भी ध्यान रखें कि MySQL में STRAIGHT_JOIN क्लॉज भी है।

इस खंड का उपयोग करके, आप JOIN ऑर्डर को नियंत्रित कर सकते हैं: बाहरी लूप में कौन सी तालिका स्कैन की गई है और कौन सा आंतरिक लूप में है।

आप WHERE वाक्यविन्यास का उपयोग कर MySQL में इसे नियंत्रित नहीं कर सकते हैं।





inner-join