अपने पिछले लेख में, मैंने सेट ऑपरेटरों की मूल बातें, उनके प्रकार और उनके उपयोग के लिए पूर्वापेक्षाएँ बताई थीं। मैंने यूनियन और यूनियन सभी ऑपरेटरों, उनके उपयोग और मतभेदों के बारे में भी बात की।
इस लेख में, हम निम्नलिखित सीखने जा रहे हैं:
- छोड़कर और इंटरसेक्ट ऑपरेटरों।
- इंटरसेक्ट और इनर जॉइन के बीच अंतर।
- एक उदाहरण के साथ INTERSECT और EXCEPT की विस्तृत व्याख्या।
EXCEPT और INTERSECT ऑपरेटरों को SQL Server 2005 में पेश किया गया था। दोनों सेट ऑपरेटर हैं जिनका उपयोग दो प्रश्नों द्वारा उत्पन्न परिणाम सेट को संयोजित करने और वांछित आउटपुट को पुनः प्राप्त करने के लिए किया जाता है।
इंटरसेक्ट ऑपरेटर क्या है
इंटरसेक्ट का उपयोग कई प्रश्नों या तालिकाओं से प्राप्त सभी डेटा सेटों के लिए सामान्य रिकॉर्ड प्राप्त करने के लिए किया जाता है। इसका एक दृश्य यहां दिया गया है:
INTERSECT ऑपरेटर का सिंटैक्स इस प्रकार है:
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4..FROM TABLE1 INTERSECT SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4..FROM TABLE2
EXCEPT ऑपरेटर क्या है
EXCEPT का उपयोग उन अभिलेखों को पुनः प्राप्त करने के लिए किया जाता है जो एक क्वेरी में पाए जाते हैं लेकिन किसी अन्य क्वेरी में नहीं। दूसरे शब्दों में, यह ऐसे रिकॉर्ड देता है जो एक परिणाम सेट के लिए अद्वितीय होते हैं। यह विज़ुअलाइज़ेशन जैसा दिखता है:
EXCEPT ऑपरेटर का सिंटैक्स इस प्रकार है:
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4..FROM TABLE1 EXCEPT SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4..FROM TABLE2
आइए यह दिखाने के लिए एक डेमो सेटअप बनाएं कि इन ऑपरेटरों का उपयोग कैसे किया जा सकता है।
डेमो सेटअप
INTERSECT और EXCEPT को प्रदर्शित करने के लिए, मैंने कर्मचारी . नामक दो तालिकाएँ बनाईं और प्रशिक्षु ।
इन तालिकाओं को बनाने के लिए निम्न क्वेरी निष्पादित करें:
CREATE TABLE [DBO].[EMPLOYEE] ( [NAME] [NVARCHAR](250) NOT NULL, [BUSINESSENTITYID] [INT] NOT NULL, [NATIONALIDNUMBER] [NVARCHAR](15) NOT NULL, [LOGINID] [NVARCHAR](256) NOT NULL, [BIRTHDATE] [DATE] NOT NULL, [MARITALSTATUS] [NCHAR](1) NOT NULL, [GENDER] [NCHAR](1) NOT NULL ) ON [PRIMARY] CREATE TABLE [DBO].[TRAINEE] ( [NAME] [NVARCHAR](250) NOT NULL, [BUSINESSENTITYID] [INT] NOT NULL, [NATIONALIDNUMBER] [NVARCHAR](15) NOT NULL, [BIRTHDATE] [DATE] NOT NULL, [GENDER] [NCHAR](1) NOT NULL ) ON [PRIMARY]
अब, कर्मचारी . में कुछ डमी डेटा डालें निम्न क्वेरी निष्पादित करके तालिका:
INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'KEN SÁNCHEZ', 1, N'295847284', N'ADVENTURE-WORKS\KEN0', CAST(N'1969-01-29' AS DATE), N'S', N'M') GO INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'TERRI DUFFY', 2, N'245797967', N'ADVENTURE-WORKS\TERRI0', CAST(N'1971-08-01' AS DATE), N'S', N'F') GO INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'ROBERTO TAMBURELLO', 3, N'509647174', N'ADVENTURE-WORKS\ROBERTO0', CAST(N'1974-11-12' AS DATE), N'M', N'M') GO INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'ROB WALTERS', 4, N'112457891', N'ADVENTURE-WORKS\ROB0', CAST(N'1974-12-23' AS DATE), N'S', N'M') GO INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'GAIL ERICKSON', 5, N'695256908', N'ADVENTURE-WORKS\GAIL0', CAST(N'1952-09-27' AS DATE), N'M', N'F') GO INSERT [DBO].[EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) VALUES (N'JOSSEF GOLDBERG', 6, N'998320692', N'ADVENTURE-WORKS\JOSSEF0', CAST(N'1959-03-11' AS DATE), N'M', N'M')
इसके बाद, हम प्रशिक्षु . के लिए भी यही काम करेंगे तालिका:
INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'JOHN WOOD', 18, N'222969461', CAST(N'1978-03-06' AS DATE), N'M') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'MARY DEMPSEY', 19, N'52541318', CAST(N'1978-01-29' AS DATE), N'F') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'WANIDA BENSHOOF', 20, N'323403273', CAST(N'1975-03-17' AS DATE), N'F') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'KEN SÁNCHEZ', 1, N'295847284', CAST(N'1969-01-29' AS DATE), N'M') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'TERRI DUFFY', 2, N'245797967', CAST(N'1971-08-01' AS DATE), N'F') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'ROBERTO TAMBURELLO', 3, N'509647174', CAST(N'1974-11-12' AS DATE), N'M') GO
अब, आइए उन कर्मचारियों की सूची को पुनः प्राप्त करने के लिए INTERSECT का उपयोग करें जो दोनों तालिकाओं के लिए सामान्य हैं। ऐसा करने के लिए, निम्न क्वेरी चलाएँ:
SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM EMPLOYEE INTERSECT SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM TRAINEE
इस क्वेरी का आउटपुट इस प्रकार होना चाहिए:
जैसा कि आप ऊपर दिए गए स्क्रीनशॉट में देख सकते हैं, क्वेरी ने केवल वही रिकॉर्ड दिए हैं जो दोनों तालिकाओं के लिए समान हैं।
इनर जॉइन बनाम इंटरसेक्ट
ज्यादातर मामलों में, इंटरसेक्ट और इनर जॉइन एक ही आउटपुट लौटाते हैं, लेकिन कुछ अपवाद हैं। एक सरल उदाहरण हमें इसे समझने में मदद करेगा।
आइए ट्रेनी टेबल में कुछ डुप्लीकेट रिकॉर्ड जोड़ें। निम्नलिखित क्वेरी निष्पादित करें:
INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'TERRI DUFFY', 2, N'245797967', CAST(N'1971-08-01' AS DATE), N'F') GO INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (N'ROBERTO TAMBURELLO', 3, N'509647174', CAST(N'1974-11-12' AS DATE), N'M') GO
अब, हम INTERSECT का उपयोग करके वांछित आउटपुट उत्पन्न करने का प्रयास करेंगे।
SELECT NAME,BUSINESSENTITYID,NATIONALIDNUMBER,BIRTHDATE,GENDER FROM EMPLOYEE INTERSECT SELECT NAME,BUSINESSENTITYID,NATIONALIDNUMBER,BIRTHDATE,GENDER FROM TRAINEE
यह वह आउटपुट है जो हमें मिलता है:
अब, आइए इनर जॉइन का उपयोग करके देखें।
SELECT A.NAME, A.BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER FROM EMPLOYEE A INNER JOIN TRAINEE B ON A.NAME = B.NAME
इस मामले में हमें जो आउटपुट मिलता है वह इस प्रकार है:
अब, जैसा कि आप ऊपर स्क्रीनशॉट में देख सकते हैं, INNER JOIN उन रिकॉर्ड्स को पुनः प्राप्त करता है जो दोनों तालिकाओं के लिए सामान्य हैं। यह सही तालिका से सभी रिकॉर्ड्स को पॉप्युलेट करता है। इसलिए, आप डुप्लिकेट रिकॉर्ड देख सकते हैं।
अब, INNER JOIN क्वेरी में DISTINCT कीवर्ड जोड़ें और देखें कि यह क्या करता है:
SELECT DISTINCT A.NAME, A.BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER FROM EMPLOYEE A INNER JOIN TRAINEE B ON A.NAME = B.NAME
आउटपुट इस तरह दिखना चाहिए:
जैसा कि आप ऊपर स्क्रीनशॉट में देख सकते हैं, डुप्लिकेट रिकॉर्ड हटा दिए गए हैं।
इंटरसेक्ट और इनर जॉइन NULL मानों को अलग तरह से मानते हैं। INNER JOIN के लिए, दो NULL मान भिन्न हैं, इसलिए संभावना है कि यह दो तालिकाओं में शामिल होने के दौरान उन्हें छोड़ देगा।
दूसरी ओर, INTERSECT दो NULL मानों को समान मानता है, इसलिए जिन रिकॉर्ड्स में NULL मान हैं, उन्हें समाप्त नहीं किया जाएगा। इसे बेहतर ढंग से समझने के लिए, आइए एक उदाहरण देखें।
सबसे पहले, प्रशिक्षु . में कुछ NULL मान जोड़ें और कर्मचारी निम्नलिखित क्वेरी निष्पादित करके तालिकाएँ:
INSERT [DBO].[TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) VALUES (NULL, 3, N'509647174', CAST(N'1974-11-12' AS DATE), N'M') GO INSERT [DBO].[Employee] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER],[LOGINID], [BIRTHDATE],[MARITALSTATUS], [GENDER]) VALUES (NULL, 3, N'509647174','ADVENTURE-WORKS\TERRI0', CAST(N'1974-11-12' AS DATE), N'M',N'M') GO
अब आइए इंटरसेक्ट और इनर जॉइन का उपयोग करके दो तालिकाओं के लिए सामान्य रिकॉर्ड प्राप्त करने का प्रयास करें। आपको निम्न क्वेरी निष्पादित करने की आवश्यकता होगी:
/*QUERY WITH INTERSECT*/ SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM EMPLOYEE INTERSECT SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM TRAINEE /*QUERY WITH INNER JOIN*/ SELECT A.NAME, A.BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER FROM EMPLOYEE A INNER JOIN TRAINEE B ON A.NAME = B.NAME
परिणामस्वरूप हमें यही आउटपुट मिलना चाहिए:
जैसा कि आप ऊपर देख सकते हैं, INTERSECT द्वारा उत्पन्न परिणाम सेट में NULL मान होते हैं, जबकि INNER JOIN उन रिकॉर्ड्स को छोड़ देते हैं जिनमें NULL मान होते हैं।
ऑपरेटर को छोड़कर
EXCEPT ऑपरेटर को कार्रवाई में प्रदर्शित करने के लिए, आइए एक उपयोग के मामले को देखें। उदाहरण के लिए, मैं कर्मचारी तालिका से महिला कर्मचारियों का विवरण भरना चाहता हूं। निम्नलिखित क्वेरी हमें ऐसा करने में मदद करेगी:
SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM EMPLOYEE WHERE GENDER = 'F' EXCEPT SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM EMPLOYEE WHERE GENDER = 'M'
यह वह आउटपुट है जो हमें मिलता है:
जैसा कि आप ऊपर देख सकते हैं, क्वेरी ने केवल महिला कर्मचारियों के विवरण भरे हैं।
आप उप-क्वेरी का उपयोग करके परिणाम सेट को भी पॉप्युलेट कर सकते हैं:
SELECT NAME, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GENDER FROM EMPLOYEE AS M WHERE GENDER = 'F' AND GENDER NOT IN (SELECT GENDER FROM EMPLOYEE AS F WHERE GENDER = 'M')
अंतर्विभाजक और छोड़कर की सीमाएं
- हम COMPUTE और COMPUTE BY क्लॉज के साथ वितरित विभाजित दृश्य परिभाषाओं में EXCEPT और INTERSECT का उपयोग नहीं कर सकते हैं।
- EXCEPT और INTERSECT का उपयोग केवल-फ़ास्ट फ़ॉरवर्ड और स्थिर कर्सर में किया जा सकता है।
- EXCEPT और INTERSECT का उपयोग वितरित प्रश्नों में किया जा सकता है, लेकिन केवल स्थानीय सर्वर पर ही निष्पादित किया जा सकता है। आप उन्हें किसी दूरस्थ सर्वर पर नहीं चला सकते।
सारांश
इस लेख में, मैंने कवर किया है:
- छोड़कर और इंटरसेक्ट ऑपरेटर।
- इंटरसेक्ट और इनर जॉइन के बीच अंतर।
- एक उदाहरण के साथ इंटरसेक्ट और एक्सेप्ट ऑपरेटरों का विस्तृत विवरण।