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

मारियाडीबी माइनस ऑपरेटर ने समझाया

MariaDB में, MINUS ऑपरेटर बाईं इनपुट क्वेरी से अलग-अलग पंक्तियाँ देता है जो सही इनपुट क्वेरी द्वारा आउटपुट नहीं होती हैं।

MINUS ऑपरेटर को मारियाडीबी 10.6.1 में EXCEPT . के पर्याय के रूप में पेश किया गया था Oracle के साथ संगतता के प्रयोजनों के लिए ऑपरेटर। इसलिए, हम MINUS . का उपयोग कर सकते हैं और EXCEPT एक दूसरे के स्थान पर (मारियाडीबी 10.6.1 और बाद के संस्करण में)।

हालांकि, मैंने पाया है कि MINUS ऑपरेटर केवल तभी काम करता है जब मेरा sql_mode = "oracle" . हालांकि इसका स्पष्ट रूप से मारियाडीबी के दस्तावेज़ीकरण में उल्लेख नहीं किया गया है, यह MINUS को लागू करने के कार्य में निहित है। मारियाडीबी में ऑपरेटर।

नमूना डेटा

मान लीजिए कि हमारे पास निम्नलिखित टेबल हैं:

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        |
+-----------+-------------+

हम MINUS . का उपयोग कर सकते हैं उन शिक्षकों को वापस करने के लिए ऑपरेटर जो छात्र भी नहीं हैं।

sql_mode सेट करें से Oracle

इससे पहले कि हम MINUS . का प्रयोग शुरू करें ऑपरेटर, चलिए अपना sql_mode सेट करते हैं करने के लिए Oracle :

SET sql_mode = "oracle";

ठीक है, अब हम आगे बढ़ सकते हैं और MINUS . का उपयोग कर सकते हैं ऑपरेटर।

MINUS का उदाहरण

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

परिणाम:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

इसलिए हमें केवल वही मान मिलते हैं जो Teachers . में दिखाई देते हैं तालिका जो Students . में भी दिखाई नहीं देती है टेबल।

डिफ़ॉल्ट रूप से, यह अलग-अलग पंक्तियाँ देता है, इसलिए Cathy . के लिए केवल एक पंक्ति दी जाती है , भले ही उस नाम के दो शिक्षक हों। हम इस व्यवहार को बदल सकते हैं - इस पर और बाद में।

हम इसे बदल भी सकते हैं और Students . को डाल सकते हैं बाईं ओर तालिका और Teachers दाईं ओर।

SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;

परिणाम:

+-------------+
| StudentName |
+-------------+
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

MINUS . का उपयोग किए बिना समान परिणाम प्राप्त करना संभव है (या EXCEPT ) ऑपरेटर। उदाहरण के लिए, हम इसके लिए अपना पहला उदाहरण फिर से लिख सकते हैं:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

परिणाम:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

डुप्लिकेट शामिल करें

डिफ़ॉल्ट रूप से, MINUS ऑपरेटर परोक्ष रूप से एक DISTINCT लागू करता है कार्यवाही। दूसरे शब्दों में, यह डिफ़ॉल्ट रूप से केवल विशिष्ट मान देता है। लेकिन हम MINUS ALL निर्दिष्ट कर सकते हैं परिणाम में डुप्लीकेट शामिल करने के लिए:

SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;

परिणाम:

+-------------+
| TeacherName |
+-------------+
| Cathy       |
| Ben         |
| Cathy       |
| Bill        |
+-------------+

इस बार हमें अपने पहले उदाहरण में मिली दो पंक्तियों के बजाय चार पंक्तियाँ मिलीं।

हम देख सकते हैं कि हमारे पहले उदाहरण में दोनों कैथियों को केवल एक की तरह लौटाया गया था।

बिल के लिए के रूप में? Teachers . में दो विधेयक हैं तालिका, लेकिन यहां केवल एक ही लौटाया जाता है। ऐसा शायद इसलिए है क्योंकि Students . में एक बिल है तालिका, जो हमारे परिणामों में से एक बिल को बाहर कर देगी।

और यहां एक उदाहरण दिया गया है जो स्पष्ट रूप से DISTINCT . का उपयोग करता है ऑपरेटर:

SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;

परिणाम:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

जैसा कि अपेक्षित था, हमें वही परिणाम मिलता है जो हमें मिलेगा यदि हम DISTINCT को हटा दें ऑपरेटर।

Oracle मोड में नहीं है?

यहां बताया गया है कि जब हम MINUS . का उपयोग करने का प्रयास करते हैं तो क्या होता है जब Oracle मोड में न हो।

आइए अपना sql_mode रीसेट करें डिफ़ॉल्ट सेटिंग पर:

SET sql_mode = default;

आइए अब MINUS . का उपयोग करके देखें ऑपरेटर फिर से:

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

परिणाम:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मारियाडीबी उपयोगकर्ता () समझाया गया

  2. MariaDB में किसी संख्या में प्रतिशत चिह्न जोड़ें

  3. मारियाडीबी में एक तिथि से वर्ष वापस करने के लिए 4 कार्य

  4. Laravel:निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है

  5. उच्च उपलब्धता के लिए मारियाडीबी क्लस्टर 10.5 को कैसे तैनात करें