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

कौन सा डीबीएमएस एक विशेषता के आधार पर एक आदेश की अनुमति देता है, जो कि चयन खंड में मौजूद नहीं है?

आपकी क्वेरी पूरी तरह से कानूनी वाक्यविन्यास है, आप उन स्तंभों के आधार पर आदेश दे सकते हैं जो चयन में मौजूद नहीं हैं।

यदि आपको कानूनी आदेश के बारे में पूर्ण विनिर्देशों की आवश्यकता है, तो SQL मानक 2003 में इसमें कथनों की एक लंबी सूची है कि आदेश में क्या होना चाहिए और क्या नहीं होना चाहिए, (02-फाउंडेशन, पृष्ठ 415, खंड 7.13 <क्वेरी अभिव्यक्ति>, उप भाग 28)। यह पुष्टि करता है कि आपकी क्वेरी कानूनी सिंटैक्स है।

मुझे लगता है कि आपका भ्रम समूह में मौजूद नहीं कॉलम द्वारा चयन, और/या ऑर्डर करने से उत्पन्न हो सकता है, या अलग-अलग उपयोग करते समय चयन में नहीं कॉलम द्वारा ऑर्डर कर सकता है।

दोनों में एक ही मूलभूत समस्या है, और मेरी जानकारी में केवल MySQL ही ऐसा है जो दोनों में से किसी को भी अनुमति देता है।

समस्या यह है कि समूह द्वारा या विशिष्ट का उपयोग करते समय, किसी भी कॉलम में शामिल नहीं होने की आवश्यकता नहीं होती है, इसलिए इससे कोई फर्क नहीं पड़ता कि उनके पास पंक्तियों में कई अलग-अलग मान हैं क्योंकि उनकी कभी आवश्यकता नहीं होती है। इस साधारण डेटा सेट की कल्पना करें:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |
3   |    B    |    Y     |

अगर आप लिखते हैं:

SELECT  DISTINCT Column1
FROM    T;

आपको मिलेगा

 Column1 
---------
     A   
     B   

अगर आप ORDER BY Column2 . जोड़ें , दो कॉलम2 में से आप A को X या Z के आधार पर ऑर्डर करने के लिए किसका उपयोग करेंगे? यह निर्धारित नहीं है कि कॉलम 2 के लिए मान कैसे चुनें।

समूह में नहीं कॉलम चुनने पर भी यही बात लागू होती है। चीजों को सरल बनाने के लिए पिछली तालिका की पहली दो पंक्तियों की कल्पना करें:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |

MySQL में आप लिख सकते हैं

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1;

यह वास्तव में SQL मानक को तोड़ता है, लेकिन यह MySQL में काम करता है, हालांकि समस्या यह है कि यह गैर-नियतात्मक है, परिणाम:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |

. से कम या ज्यादा सही नहीं है
ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

तो आप जो कह रहे हैं वह मुझे Column1 . के प्रत्येक विशिष्ट मान के लिए एक पंक्ति देना है , जो दोनों परिणाम सेट संतुष्ट करते हैं, तो आप कैसे जानते हैं कि आपको कौन सा परिणाम मिलेगा? ठीक है आप नहीं, यह एक काफी लोकप्रिय गलत धारणा है जिसे आप जोड़ सकते हैं और ORDER BY कर सकते हैं परिणामों को प्रभावित करने के लिए खंड, उदाहरण के लिए निम्नलिखित प्रश्न:

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1
ORDER BY ID DESC;

सुनिश्चित करेंगे कि आपको निम्नलिखित परिणाम प्राप्त हों:

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

ORDER BY ID DESC के कारण , हालांकि यह सच नहीं है (जैसा कि यहां दिखाया गया है )।

MySQL दस्तावेज़ राज्य:

इसलिए भले ही आपके पास इसके द्वारा एक आदेश है, तब तक लागू नहीं होता जब तक कि प्रति समूह एक पंक्ति का चयन नहीं किया जाता है, और यह एक पंक्ति गैर-निर्धारक है।

SQL-Standard उन चुनिंदा सूची में कॉलम की अनुमति देता है जो GROUP BY या एक समग्र फ़ंक्शन में शामिल नहीं हैं, हालाँकि ये कॉलम GROUP BY में एक कॉलम पर कार्यात्मक रूप से निर्भर होने चाहिए। SQL-2003-Standard (5WD-02-Foundation-2003-09 - पेज 346) से - http ://www.wiscorp.com/sql_2003_standard.zip

उदाहरण के लिए, नमूना तालिका में आईडी प्राथमिक कुंजी है, इसलिए हम जानते हैं कि यह तालिका में अद्वितीय है, इसलिए निम्न क्वेरी SQL मानक के अनुरूप है और MySQL में चलेगी और वर्तमान में कई DBMS में विफल हो जाएगी (Postgresql लिखने के समय) मानक को सही ढंग से लागू करने के बारे में मुझे पता है कि निकटतम डीबीएमएस है - यहां उदाहरण ):

SELECT  ID, Column1, Column2
FROM    T
GROUP BY ID;

चूंकि आईडी प्रत्येक पंक्ति के लिए अद्वितीय है, इसलिए Column1 . का केवल एक मान हो सकता है प्रत्येक आईडी के लिए, Column2 . का एक मान प्रत्येक पंक्ति के लिए क्या लौटाया जाए, इस बारे में कोई अस्पष्टता नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AJAX पोस्ट घातक त्रुटि कॉलम रिक्त नहीं हो सकता

  2. PHP ऑब्जेक्ट प्रॉपर्टी में ब्रैकेट होते हैं

  3. MYSQL काउंट (*) या काउंट (1) में क्या बेहतर है?

  4. पीएचपी एसक्यूएल:एक एचटीएमएल फॉर्म से डेटा को एकाधिक डेटाबेस में कैसे सहेजना है या डेटा को एक डेटाबेस से दूसरे डेटाबेस में स्वचालित रूप से कैसे कॉपी करना है

  5. केवल चर को संदर्भ द्वारा पारित किया जाना चाहिए ... लाइन 13 पर विफल