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

MySQL एकाधिक उपश्रेणियाँ बनाम संपूर्ण प्रश्न

चूँकि ये तीनों समुच्चय एक ही तालिका से समान WHERE के साथ आते हैं शर्तें, आपको उप-चयनों की कोई आवश्यकता नहीं है। सभी तीन समुच्चय एक ही पंक्ति समूह पर काम कर रहे हैं (कोई GROUP BY . नहीं निर्दिष्ट, इसलिए पूरी तालिका के लिए एक पंक्ति), ताकि वे सभी SELECT . में मौजूद हो सकें सीधे सूची।

SELECT
  SUM(number) AS number_sum,
  MAX(number) AS number_max,
  MIN(number) AS number_min
FROM `table`

यदि किसी भी समुच्चय को विभिन्न स्थितियों पर आधारित होने की आवश्यकता है तो आप WHERE . में फ़िल्टर करेंगे क्लॉज, तो आपको अलग-अलग स्थिति के लिए या तो उप-चयन का उपयोग करना होगा, या कार्टेशियन जॉइन करना होगा। यह उप-चयन और निम्न LEFT JOIN विधि समतुल्य होनी चाहिए, केवल एक पंक्ति लौटाने वाले समुच्चय के लिए प्रदर्शन-वार:

SELECT
  /* Unique filtering condition - must be done in a subselect */
  (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum,
  MAX(number) AS number_max,
  MIN(number) AS number_min
FROM `table`

या उपरोक्त क्वेरी के समकक्ष, आप LEFT JOIN एक सबक्वेरी के खिलाफ बिना ON खंड . यह केवल उन स्थितियों में किया जाना चाहिए जब आप जानते हैं कि सबक्वेरी केवल एक पंक्ति लौटाएगी। अन्यथा, आप एक कार्टेशियन उत्पाद के साथ समाप्त हो जाएंगे - जितनी पंक्तियाँ शामिल होने के एक तरफ गुणा द्वारा लौटाई जाती हैं दूसरी तरफ से लौटाई गई पंक्तियों की संख्या।

यह आसान है अगर आपको WHERE . के एक सेट के साथ कुछ कॉलम वापस करने की आवश्यकता है क्लॉज की स्थिति और WHERE . के एक अलग सेट के साथ कुछ कॉलम शर्तें, लेकिन केवल एक JOIN . के हर तरफ से पंक्ति . इस मामले में, यह JOIN करने के लिए तेज़ होना चाहिए करने के बजाय दो समान WHERE . के साथ उप-चयन करता है खंड।

यह तेज़ होना चाहिए....

SELECT
  /* this one has two aggregates sharing a WHERE condition */
  subq.number_sum_filtered,
  subq.number_max_filtered,
  /* ...and two aggregates on the main table with no WHERE clause filtering */
  MAX(`table`.number) AS number_max,
  MIN(`table`.number) AS number_min
FROM
  `table`
  LEFT JOIN (
    SELECT 
       SUM(number) AS number_sum_filtered,
       MAX(number) AS number_max_filtered
    FROM `table`
    WHERE `somecolumn = `somevalue`
  ) subq /* No ON clause here since there's no common column to join on... */

इससे भी...

SELECT
  /* Two different subselects each over the same filtered set */
  (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered,
  (SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered,
  MAX(`table`.number) AS number_max,
  MIN(`table`.number) AS number_min
FROM
  `table`



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP में इनपुट और आउटपुट की सफाई की पवित्र कब्र?

  2. mysql क्वेरी में सही ढंग से बचने वाले डैश (-)

  3. URL से मूल्य कैसे प्राप्त करें

  4. mysql DB का बैकअप नहीं बनाया जा रहा है

  5. केवल एक तिथि का उपयोग करके DATETIME कॉलम से कैसे चयन करें?