MySQL में, UNION
क्लॉज कई प्रश्नों के परिणामों को एक परिणाम सेट में जोड़ता है।
उदाहरण
मान लीजिए कि हमारे पास निम्नलिखित टेबल हैं:
SELECT * FROM Teachers;
SELECT * FROM Students;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | +-----------+-------------+ +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | | 6 | Bill | +-----------+-------------+
हम UNION
डाल सकते हैं उन दोनों के बीच का खंड SELECT
सभी शिक्षकों और छात्रों को वापस करने के लिए बयान:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Bill | | Faye | | Jet | | Spike | | Ein | +-------------+
कॉलम के नाम पहले SELECT
. से लिए गए हैं बयान।
डिफ़ॉल्ट रूप से, UNION
खंड परोक्ष रूप से एक DISTINCT
applies लागू होता है कार्यवाही। दूसरे शब्दों में, यह डिफ़ॉल्ट रूप से केवल विशिष्ट मान देता है। तो उपरोक्त परिणामों में वॉरेन, कैथी और बिल में से केवल एक-एक है। यह इस तथ्य के बावजूद है कि संयुक्त तालिकाओं में वास्तव में दो वॉरेन, दो कैथिस और तीन बिल होते हैं (कैथी नामक दो शिक्षक हैं, एक शिक्षक और वॉरेन नामक एक ग्राहक, और दो को बिल कहा जाता है, साथ ही एक छात्र जिसे बिल कहा जाता है)।
यहां एक उदाहरण दिया गया है जो स्पष्ट रूप से DISTINCT
. का उपयोग करता है खंड:
SELECT TeacherName FROM Teachers
UNION DISTINCT
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Bill | | Faye | | Jet | | Spike | | Ein | +-------------+
तो हमें वही परिणाम मिलता है जो हमें DISTINCT
. के बिना मिला था खंड।
डुप्लिकेट शामिल करें
हम ALL
का उपयोग कर सकते हैं परिणामों में डुप्लीकेट मान शामिल करने के लिए कीवर्ड:
SELECT TeacherName FROM Teachers
UNION ALL
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Cathy | | Bill | | Bill | | Faye | | Jet | | Spike | | Ein | | Warren | | Bill | +-------------+
इस बार हमें आठ के बजाय बारह पंक्तियाँ मिलीं जो हमें अपने पहले उदाहरण में मिली थीं।
हम देख सकते हैं कि दोनों कैथी वापस आ गए और तीनों बिल वापस कर दिए गए।
TABLE
कथन
MySQL 8.0.19 से हम UNION
. का उपयोग कर सकते हैं TABLE
के साथ क्लॉज बयान।
यहां एक उदाहरण दिया गया है:
TABLE Teachers
UNION
TABLE Students;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | +-----------+-------------+
यह निम्न क्वेरी के बराबर है:
SELECT * FROM Teachers
UNION
SELECT * FROM Students;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | +-----------+-------------+
आप देखेंगे कि ये कथन हमारे पहले उदाहरण की तुलना में अधिक पंक्तियाँ लौटाते हैं। ऐसा इसलिए है क्योंकि हम तालिका में सभी स्तंभों का चयन कर रहे हैं, जिसके परिणामस्वरूप गैर-डुप्लिकेट होते हैं जहां पहले एक डुप्लिकेट था। उदाहरण के लिए, बिल नामक दो शिक्षकों को यहां लौटाया जाता है जबकि पहले के उदाहरण में केवल एक को लौटाया गया था। ऐसा इसलिए है क्योंकि TeacherId
कॉलम में अलग-अलग मान होते हैं, इसलिए पंक्तियां डुप्लीकेट नहीं होती हैं।
ORDER BY
का उपयोग करना संघ प्रश्नों में खंड
हम ORDER BY
. का उपयोग कर सकते हैं प्रत्येक SELECT
. में क्लॉज बयान और/या संयुक्त UNION
. पर सवाल।
प्रत्येक में SELECT
कथन
जब हम ORDER BY
. का उपयोग करते हैं व्यक्तिगत में खंड SELECT
एक UNION
. के भीतर बयान क्वेरी, हमें प्रत्येक SELECT
. को संलग्न करने की आवश्यकता है कोष्ठक के अंदर कथन:
(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2);
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 2 | Ben | | 5 | Bill | | 6 | Bill | | 4 | Ein | +-----------+-------------+
ध्यान दें कि जब हम ऐसा करते हैं, तो यह वास्तव में आउटपुट के लिए परिणामों का आदेश नहीं देता है। यह केवल LIMIT
लागू करते समय पुनर्प्राप्त करने के लिए चयनित पंक्तियों के सबसेट को निर्धारित करने के उद्देश्य से परिणामों का आदेश देता है खंड।
इसलिए, ORDER BY
. का उपयोग करके LIMIT
के बिना क्लॉज का आउटपुट पर कोई प्रभाव नहीं पड़ता है।
संपूर्ण UNION
पर प्रश्न
हम ORDER BY
. का भी उपयोग कर सकते हैं पूरी क्वेरी पर क्लॉज, ताकि पूरा आउटपुट एक साथ ऑर्डर किया जा सके।
इस उदाहरण में, हम पिछले उदाहरण को लेते हैं और संयुक्त परिणामों को क्रमित करते हैं:
(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2)
ORDER BY TeacherName DESC;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 4 | Ein | | 5 | Bill | | 6 | Bill | | 2 | Ben | +-----------+-------------+
ORDER BY
. का उपयोग न करने पर भी प्रत्येक SELECT
. के भीतर क्लॉज कथन, प्रत्येक SELECT
कथन अभी भी कोष्ठक में होना चाहिए, और ORDER BY
खंड (या कोई LIMIT
खंड) पिछले एक के बाद होना चाहिए।
(SELECT * FROM Teachers)
UNION
(SELECT * FROM Students)
ORDER BY TeacherName ASC;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 2 | Ben | | 5 | Bill | | 6 | Bill | | 3 | Cathy | | 4 | Cathy | | 4 | Ein | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 1 | Warren | | 5 | Warren | +-----------+-------------+
ध्यान रहे, कोष्ठकों को छोड़ने से वही परिणाम मिलता है, जो कोष्ठकों वाला होता है:
SELECT * FROM Teachers
UNION
SELECT * FROM Students
ORDER BY TeacherName ASC;
परिणाम:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 2 | Ben | | 5 | Bill | | 6 | Bill | | 3 | Cathy | | 4 | Cathy | | 4 | Ein | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 1 | Warren | | 5 | Warren | +-----------+-------------+
ध्यान दें कि यदि सॉर्ट किया जाने वाला कॉलम किसी उपनाम का उपयोग करता है, तो उस कॉलम को उसके उपनाम (कॉलम नाम से नहीं) द्वारा संदर्भित किया जाना चाहिए।
उदाहरण:
(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY t ASC;
परिणाम:
+--------+ | t | +--------+ | Ben | | Bill | | Cathy | | Ein | | Faye | | Jet | | Spike | | Warren | +--------+
यदि हम उपनाम का उपयोग नहीं करते हैं तो यहां क्या होता है:
(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY TeacherName ASC;
परिणाम:
ERROR 1054 (42S22): Unknown column 'TeacherName' in 'order clause'
कॉलमों की संख्या
प्रत्येक SELECT
. द्वारा लौटाए गए स्तंभों की संख्या कथन समान होना चाहिए। इसलिए, हम निम्न कार्य नहीं कर सकते:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
परिणाम:
ERROR 1222 (21000): The used SELECT statements have a different number of columns
डेटा प्रकार
प्रत्येक SELECT
. की संगत स्थिति में सूचीबद्ध चयनित कॉलम कथन में समान डेटा प्रकार होना चाहिए। हालांकि, यदि वे नहीं करते हैं, तो UNION
. में कॉलम के प्रकार और लंबाई परिणाम सभी SELECT
. द्वारा पुनर्प्राप्त मानों को ध्यान में रखते हैं बयान।
यदि हम TeacherName
. को संयोजित करने का प्रयास करते हैं तो यहां क्या होता है? StudentId
. के साथ कॉलम कॉलम:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Bill | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +-------------+
कुछ अन्य RDBMS इस उदाहरण में एक त्रुटि उत्पन्न करेंगे, लेकिन MySQL त्रुटि के बिना आउटपुट उत्पन्न करने का प्रबंधन करता है।