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

MySQL ग्रुप बाय बिहेवियर

MySQL मनमाने ढंग से एक पंक्ति चुनता है। व्यवहार में, आमतौर पर उपयोग किए जाने वाले MySQL स्टोरेज इंजन पहले . से मान लौटाते हैं भौतिक भंडारण के संबंध में समूह में पंक्ति।

create table foo (id serial primary key, category varchar(10));

insert into foo (category) values 
  ('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');

select * from foo group by category;

+----+----------+
| id | category |
+----+----------+
|  4 | bar      |
|  1 | foo      |
+----+----------+

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

MySQL एक SQL मोड का समर्थन करता है ONLY_FULL_GROUP_BY यदि आप SQL मानक शब्दार्थ का उल्लंघन करने वाली क्वेरी को चलाने का प्रयास करते हैं तो MySQL एक त्रुटि देता है।

AFAIK, SQLite एकमात्र अन्य RDBMS है जो समूहीकृत क्वेरी में अस्पष्ट कॉलम की अनुमति देता है। SQLite अंतिम . से मान लौटाता है समूह में पंक्ति:

select * from foo group by category;

6|bar
3|foo

हम ऐसे प्रश्नों की कल्पना कर सकते हैं जो अस्पष्ट नहीं होंगे, फिर भी SQL मानक शब्दार्थ का उल्लंघन करते हैं।

SELECT foo.*, parent_of_foo.* 
FROM foo JOIN parent_of_foo 
  ON (foo.parent_id = parent_of_foo.parent_id) 
GROUP BY foo_id;

अस्पष्ट परिणाम उत्पन्न करने का कोई तार्किक तरीका नहीं है। फू में प्रत्येक पंक्ति का अपना समूह होता है, यदि हम फू की प्राथमिक कुंजी द्वारा ग्रुप करते हैं। तो foo के किसी भी कॉलम में समूह में केवल एक मान हो सकता है। यहां तक ​​​​कि फू में एक विदेशी कुंजी द्वारा संदर्भित किसी अन्य तालिका में शामिल होने से प्रति समूह केवल एक मान हो सकता है, यदि समूह फू की प्राथमिक कुंजी द्वारा परिभाषित किए जाते हैं।

MySQL और SQLite तार्किक रूप से स्पष्ट प्रश्नों को डिजाइन करने के लिए आप पर भरोसा करते हैं। औपचारिक रूप से, चयन-सूची में प्रत्येक स्तंभ एक कार्यात्मक निर्भरता होना चाहिए GROUP BY मानदंड में कॉलम की संख्या। यदि आप इसका पालन नहीं करते हैं, तो यह आपकी गलती है। :-)

मानक SQL अधिक सख्त है और कुछ प्रश्नों की अनुमति नहीं देता है जो सकता स्पष्ट हो - शायद इसलिए कि आरडीबीएमएस के लिए सामान्य रूप से सुनिश्चित होना बहुत जटिल होगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अमान्य सिंटैक्स त्रुटि प्रकार =हाइबरनेट द्वारा उत्पन्न डीडीएल में MyISAM

  2. MySQL में ibdata1 फ़ाइल को कैसे सिकोड़ें/शुद्ध करें?

  3. MySQL जॉइन बनाम लेफ्ट जॉइन में अंतर

  4. XAMPP के साथ आसानी से वेब सर्वर सेट करें

  5. Gentoo पर MySQL रिलेशनल डेटाबेस का उपयोग करना