आरंभ करने के लिए:नहीं,
SELECT user_id, MAX(salary) FROM users;
मानक के अनुरूप नहीं है। आप एक समग्र फ़ंक्शन का उपयोग कर रहे हैं (MAX
) बिना GROUP BY
. के खंड। ऐसा करके आप डीबीएमएस को सभी रिकॉर्ड को एक एकल परिणाम पंक्ति में एकत्रित करने के लिए कहते हैं। अब आप इस परिणाम पंक्ति में DBMS को दिखाने के लिए क्या कहते हैं? तालिका में मिला अधिकतम वेतन (MAX(salary)
) और द user_id
. हालांकि, कोई द . नहीं है user_id
; संभवतः कई अलग-अलग user_id
हैं मेज पर। यह SQL मानक का उल्लंघन करता है। MySQL गैर-समेकित user_id
की व्याख्या करने की स्वतंत्रता लेता है जैसा कोई भी user_id
(मनमाने ढंग से चुना गया)।
इसलिए भले ही क्वेरी चलती है, लेकिन आमतौर पर इसका परिणाम वांछित नहीं होता है।
यह प्रश्न:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
दूसरी ओर मानक के अनुरूप है। आइए फिर से देखें कि यह क्वेरी क्या करती है:इस बार एक GROUP BY
. है खंड DBMS को बता रहा है कि आप प्रति user_id
के लिए एक परिणाम पंक्ति चाहते हैं . प्रत्येक user_id
. के लिए आप दिखाना चाहते हैं:द user_id
, द name
, और अधिकतम salary
. ये सभी मान्य भाव हैं; द user_id
user_id
है स्वयं, द नाम एक उपयोगकर्ता नाम है जो user_id
. से जुड़ा है , और अधिकतम salary
उपयोगकर्ता का अधिकतम वेतन है। असंगठित स्तंभ name
इसकी अनुमति है, क्योंकि यह कार्यात्मक रूप से user_id
. द्वारा समूहीकृत पर निर्भर है . हालांकि, कई DBMS इसका समर्थन नहीं करते हैं, क्योंकि यह निर्धारित करना बेहद जटिल हो सकता है कि कोई व्यंजक समूह पर कार्यात्मक रूप से निर्भर है या नहीं।
उपयोगकर्ता रिकॉर्ड को अधिकतम वेतन के साथ कैसे दिखाया जाए, इसके लिए आपको एक सीमित खंड की आवश्यकता है। MySQL LIMIT
प्रदान करता है इसके लिए, जो आपको पहली n पंक्तियाँ प्राप्त कर सकता है। हालांकि यह संबंधों से संबंधित नहीं है।
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
है
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
मानक एसक्यूएल में।
हालांकि, संबंधों से निपटने के लिए, जैसा कि
. में हैSELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
आपको MySQL में एक सबक्वेरी की आवश्यकता है, क्योंकि LIMIT
इसका समर्थन नहीं करता:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);