Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या MySQL उन स्तंभों का चयन करने की अनुमति देकर मानक को तोड़ रहा है जो खंड द्वारा समूह का हिस्सा नहीं हैं?

<ब्लॉकक्वॉट>

मानक SQL आपकी क्वेरी को अस्वीकार कर देगा क्योंकि आप गैर-समेकित फ़ील्ड का चयन नहीं कर सकते जो ग्रुप बाय क्लॉज का हिस्सा नहीं हैं एक समग्र क्वेरी में

यह सही, 1992 तक . है ।

लेकिन यह 2003 और उसके बाद से सारा तौर पर गलत है।

SQL-2003 मानक से, 6IWD6-02-Foundation-2011-01.pdf, http से ://www.wiscorp.com/ , पैराग्राफ-7.12 (क्वेरी विनिर्देश), पृष्ठ 398 :

<ब्लॉकक्वॉट>
  1. यदि टी एक समूहीकृत तालिका है, तो जी को टी के समूहन कॉलम का सेट होने दें। प्रत्येक ((मान अभिव्यक्ति)) में निहित ((सूची का चयन करें)) प्रत्येक कॉलम संदर्भ जो टी के कॉलम को संदर्भित करता है, कुछ को संदर्भित करेगा स्तंभ C जो कार्यात्मक रूप से निर्भर . है जी या . पर एक समेकित तर्क में शामिल होगा ((सेट फंक्शन स्पेसिफिकेशन)) जिसकी एग्रीगेशन क्वेरी QS है

अब MYSQL ने न केवल . की अनुमति देकर इस सुविधा को लागू किया है कॉलम जो कार्यात्मक रूप से निर्भर हैं समूहीकरण स्तंभों पर लेकिन सभी कॉलम की अनुमति देता है . यह उन उपयोगकर्ताओं के साथ कुछ समस्याएं पैदा कर रहा है जो यह नहीं समझते हैं कि समूहीकरण कैसे काम करता है और अनिश्चित परिणाम प्राप्त करते हैं जहां वे उम्मीद नहीं करते हैं।

लेकिन आपका कहना सही है कि MySQL ने एक ऐसी सुविधा जोड़ी है जो SQL-मानकों के साथ विरोध करती है (हालाँकि आपको लगता है कि यह गलत कारण से है)। यह पूरी तरह से सटीक नहीं है क्योंकि उन्होंने एक SQL-मानक सुविधा जोड़ी है, लेकिन सबसे अच्छे तरीके से नहीं (अधिक आसान तरीके की तरह) लेकिन यह नवीनतम मानकों के साथ संघर्ष करती है।

आपके प्रश्न का उत्तर देने के लिए, इस MySQL सुविधा (एक्सटेंशन) का कारण मुझे नवीनतम SQL-मानकों (2003+) के अनुसार होना चाहिए। उन्होंने इसे इस तरह से लागू करने का विकल्प क्यों चुना (पूरी तरह से अनुपालन नहीं), हम केवल अनुमान लगा सकते हैं।

जैसा कि @Quassnoi और @Johan ने उदाहरणों के साथ उत्तर दिया, यह मुख्य रूप से एक प्रदर्शन और रखरखाव का मुद्दा है। लेकिन कार्यात्मक रूप से निर्भर स्तंभों को पहचानने के लिए आरडीबीएमएस को आसानी से पर्याप्त चतुर (स्काईनेट को छोड़कर) में नहीं बदला जा सकता है, इसलिए MySQL डेवलपर्स ने एक विकल्प बनाया:

<ब्लॉकक्वॉट>

हम (MySQL) आपको (MySQL उपयोगकर्ता) यह सुविधा देते हैं जो SQL-2003 मानकों में है। यह कुछ GROUP BY . में गति में सुधार करता है प्रश्न, लेकिन एक पकड़ है। आपको सावधान रहना होगा (और SQL इंजन नहीं) इसलिए SELECT . में कॉलम और हो रहा है सूचियाँ कार्यात्मक रूप से GROUP BY . पर निर्भर हैं स्तंभ। यदि नहीं, तो आपको अनिश्चित परिणाम मिल सकते हैं।

<ब्लॉकक्वॉट>

यदि आप इसे अक्षम करना चाहते हैं, तो आप sql_mode . सेट कर सकते हैं करने के लिए ONLY_FULL_GROUP_BY

यह सब MySQL डॉक्स में है:ग्रुप बाय (5.5) - हालांकि उपरोक्त शब्दों में नहीं बल्कि आपके उद्धरण में (वे यह भी उल्लेख करना भूल गए कि यह मानक SQL-2003 से विचलन है जबकि मानक SQL-92 नहीं)। इस तरह के विकल्प आम हैं, मुझे लगता है कि सभी सॉफ्टवेयर में, अन्य आरडीबीएमएस शामिल हैं। वे प्रदर्शन, पिछड़ी संगतता और कई अन्य कारणों से बने हैं। Oracle में प्रसिद्ध '' NULL के समान है उदाहरण के लिए और SQL-सर्वर में शायद कुछ भी हैं।

पीटर बोमन द्वारा यह ब्लॉग पोस्ट भी है, जहां MySQL डेवलपर्स की पसंद का बचाव किया गया है:ग्रुप बाय मिथ्स को खारिज करना

2011 में, @Mark Byers के रूप में हमें एक टिप्पणी में सूचित किया (DBA.SE पर एक संबंधित प्रश्न में), PostgreSQL 9.1 ने एक नई सुविधा जोड़ी (रिलीज की तारीख:सितंबर 2011) इस उद्देश्य के लिए डिज़ाइन किया गया। यह MySQL के कार्यान्वयन से अधिक प्रतिबंधात्मक और मानक के करीब है।

बाद में, 2015 में MySQL ने घोषणा की कि 5.7 संस्करण में, मानक के अनुरूप व्यवहार में सुधार किया गया है और वास्तव में कार्यात्मक निर्भरता को पहचानता है, (पोस्टग्रेज कार्यान्वयन से भी बेहतर)। दस्तावेज़ीकरण:MySQL GROUP BY की हैंडलिंग (5.7) और पीटर बोमन द्वारा एक अन्य ब्लॉग पोस्ट:MySQL 5.7.5:ग्रुप बाय कार्यात्मक निर्भरता का सम्मान करता है!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. गंभीर त्रुटि:ध्यान में न आया त्रुटि:अपरिभाषित समारोह के लिए कॉल mysql_connect ()

  2. शीर्ष सामान्य MySQL प्रश्न

  3. मूडल MySQL डेटाबेस के लिए स्वचालित विफलता को कैसे सेटअप करें

  4. अपने MariaDB या MySQL डेटाबेस का भौतिक बैकअप बनाएं

  5. एसक्यूएल परिणामों में खाली तिथियों को पैड करने का सबसे सरल तरीका क्या है (या तो MySQL या पर्ल एंड पर)?