MariaDB में, EXCEPT
ऑपरेटर बाईं इनपुट क्वेरी से पंक्तियाँ लौटाता है जो सही इनपुट क्वेरी द्वारा आउटपुट नहीं होती हैं।
इसे लगाने का दूसरा तरीका यह है कि यह बाईं ओर से सभी पंक्तियों को लौटाता है SELECT
परिणाम सेट छोड़कर पंक्तियाँ जो दाईं ओर हैं SELECT
परिणाम सेट।
सिंटैक्स
आधिकारिक वाक्य रचना इस प्रकार है:
SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
उपरोक्त में INTERSECT
. भी शामिल है और UNION
सिंटैक्स में ऑपरेटर, जैसा कि उन ऑपरेटरों पर समान सिंटैक्स लागू होता है।
मारियाडीबी 10.4.0 से, कोष्ठकों का उपयोग पूर्वता निर्दिष्ट करने के लिए किया जा सकता है।
उदाहरण
मान लीजिए कि हमारे पास निम्नलिखित टेबल हैं:
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 | +-----------+-------------+
हम EXCEPT
. का उपयोग कर सकते हैं जो शिक्षक भी छात्र नहीं हैं, उन्हें लौटाने के लिए ऑपरेटर:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
इसलिए हमें केवल वही मान मिलते हैं जो Teachers
. में दिखाई देते हैं तालिका जो Students
. में भी दिखाई नहीं देती है टेबल।
डिफ़ॉल्ट रूप से, यह अलग-अलग पंक्तियाँ देता है, इसलिए Cathy
. के लिए केवल एक पंक्ति दी जाती है , भले ही उस नाम के दो शिक्षक हों। हम इस व्यवहार को बदल सकते हैं - इस पर और बाद में।
हम इसे बदल भी सकते हैं और Students
. को डाल सकते हैं बाईं ओर तालिका और Teachers
दाईं ओर।
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
परिणाम:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
EXCEPT
. का उपयोग किए बिना समान परिणाम प्राप्त करना संभव है ऑपरेटर। उदाहरण के लिए, हम इसके लिए अपना पहला उदाहरण फिर से लिख सकते हैं:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
परिणाम:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
ध्यान रहे, EXCEPT
ऑपरेटर काफी हद तक कोड को सरल बनाने में मदद करता है।
डुप्लिकेट शामिल करें
डिफ़ॉल्ट रूप से, EXCEPT
ऑपरेटर परोक्ष रूप से एक DISTINCT
लागू करता है कार्यवाही। दूसरे शब्दों में, यह डिफ़ॉल्ट रूप से केवल विशिष्ट मान देता है।
MariaDB 10.5.0 से पहले, निहित DISTINCT
हमारा एकमात्र विकल्प था - हम ALL
निर्दिष्ट करने में असमर्थ थे . हालाँकि, MariaDB 10.5.0 ने EXCEPT ALL
. को पेश किया और EXCEPT DISTINCT
वाक्य - विन्यास।
इसका मतलब है कि अब हम इस तरह की क्वेरी कर सकते हैं:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
इस बार हमें अपने पहले उदाहरण में मिली दो पंक्तियों के बजाय चार पंक्तियाँ मिलीं।
हम देख सकते हैं कि हमारे पहले उदाहरण में दोनों कैथियों को केवल एक की तरह लौटाया गया था।
बिल के लिए के रूप में? Teachers
. में दो विधेयक हैं तालिका, लेकिन यहां केवल एक ही लौटाया जाता है। ऐसा शायद इसलिए है क्योंकि Students
. में एक बिल है तालिका, जो हमारे परिणामों में से एक बिल को बाहर कर देगी।
और यहां एक उदाहरण दिया गया है जो स्पष्ट रूप से DISTINCT
. का उपयोग करता है ऑपरेटर:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
परिणाम:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
जैसा कि अपेक्षित था, हमें वही परिणाम मिलता है जो हमें मिलेगा यदि हम DISTINCT
को हटा दें ऑपरेटर।
मारियाडीबी 10.6.1 में, MINUS
EXCEPT
. के पर्याय के रूप में पेश किया गया था . इसलिए, हम MINUS
. का उपयोग कर सकते हैं इसके बजाय EXCEPT
मारियाडीबी 10.6.1 और बाद में।