जवाबों:
exists
कीवर्ड कि रास्ते में इस्तेमाल किया जा सकता है, लेकिन वास्तव में इसे से बचने के गिनती के लिए एक रास्ता के रूप में इरादा है:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
यह सबसे उपयोगी है जहां आपके पास if
सशर्त बयान हैं, क्योंकि इससे exists
बहुत तेज हो सकता है count
।
सबसे in
अच्छा उपयोग किया जाता है जहां आपके पास पास करने के लिए एक स्थिर सूची है:
select * from [table]
where [field] in (1, 2, 3)
जब आपके पास एक in
बयान में एक तालिका होती है तो यह एक का उपयोग करने के लिए अधिक समझ में आता है join
, लेकिन ज्यादातर यह बात नहीं होनी चाहिए। क्वेरी ऑप्टिमाइज़र को उसी तरह की योजना वापस करनी चाहिए। कुछ कार्यान्वयन में (ज्यादातर पुराने, जैसे Microsoft SQL सर्वर 2000) in
क्वेरीज़ को हमेशा नेस्टेड जॉइन प्लान मिलेगा , जबकि join
क्वेश्चन नेस्टेड, मर्ज या हैश का उपयोग उचित होगा। अधिक आधुनिक कार्यान्वयन चालाक होते हैं और योजना in
का उपयोग किए जाने पर भी समायोजित कर सकते हैं ।
select * from [table] where [field] in (select [field] from [table2])
के रूप में एक ही परिणाम (और क्वेरी योजना) देता है select * from [table] join [table2] on [table2].[field] = [table].[field]
।
table
, जबकि दूसरा सब कुछ table
और से वापस करता है table2
। कुछ (अधिकतर पुराने) SQL डेटाबेस में in
क्वेरी को नेस्टेड जॉइन के रूप में लागू किया जाएगा, जबकि join
क्वेरी को नेस्टेड, मर्ज, हैशेड, आदि - जो भी सबसे तेज हो।
exists
एक केस स्टेटमेंट के भीतर इस्तेमाल किया जा सकता है, इसलिए वे इस तरह से भी काम कर सकते हैंselect case when exists (select 1 from emp where salary > 1000) then 1 else 0 end as sal_over_1000
EXISTS
आपको बताएगा कि कोई क्वेरी किसी भी परिणाम पर लौटी है या नहीं। उदाहरण के लिए:
SELECT *
FROM Orders o
WHERE EXISTS (
SELECT *
FROM Products p
WHERE p.ProductNumber = o.ProductNumber)
IN
एक मूल्य की तुलना कई से करने के लिए किया जाता है, और इस तरह शाब्दिक मूल्यों का उपयोग कर सकते हैं:
SELECT *
FROM Orders
WHERE ProductNumber IN (1, 10, 100)
आप IN
क्लॉज़ के साथ क्वेरी परिणाम का उपयोग कर सकते हैं , जैसे:
SELECT *
FROM Orders
WHERE ProductNumber IN (
SELECT ProductNumber
FROM Products
WHERE ProductInventoryQuantity > 0)
नियम अनुकूलक के आधार पर :
EXISTS
IN
जब उप-क्वेरी परिणाम बहुत बड़े होते हैं , तो बहुत तेजी से होता है।IN
EXISTS
जब उप-क्वेरी परिणाम बहुत छोटा होता है , तो तेजी से होता है।लागत अनुकूलक के आधार पर :
मैं मान रहा हूं कि आप जानते हैं कि वे क्या करते हैं, और इस तरह से अलग-अलग तरीके से उपयोग किया जाता है, इसलिए मैं आपके प्रश्न को समझने जा रहा हूं: जब EXISTS, या इसके विपरीत में SQL का उपयोग करने के लिए फिर से लिखना एक अच्छा विचार होगा।
क्या यह एक उचित धारणा है?
संपादित करें : मैं जो कारण पूछ रहा हूं, वह यह है कि कई मामलों में आप इसके बजाय एक EXISTS का उपयोग करने के लिए IN पर आधारित SQL फिर से लिख सकते हैं, और इसके विपरीत, और कुछ डेटाबेस इंजन के लिए, क्वेरी ऑप्टिमाइज़र दो अलग तरह से व्यवहार करेगा।
उदाहरण के लिए:
SELECT *
FROM Customers
WHERE EXISTS (
SELECT *
FROM Orders
WHERE Orders.CustomerID = Customers.ID
)
के लिए फिर से लिखा जा सकता है:
SELECT *
FROM Customers
WHERE ID IN (
SELECT CustomerID
FROM Orders
)
या शामिल होने के साथ:
SELECT Customers.*
FROM Customers
INNER JOIN Orders ON Customers.ID = Orders.CustomerID
तो मेरा सवाल अभी भी खड़ा है, क्या मूल पोस्टर सोच रहा है कि IN और EXISTS क्या करता है, और इस प्रकार इसका उपयोग कैसे करना है, या क्या वह wether को एक SQL का उपयोग करके INISISTS का उपयोग करने के लिए, या इसके विपरीत, एक अच्छा विचार होगा?
JOIN
, आपको DISTINCT
EXISTS
IN
जब उपकेंद्र के परिणाम बहुत बड़े होते हैं तो बहुत तेजी से होता है। जब उपकेंद्र के परिणाम बहुत छोटे
IN
होते हैं, EXISTS
तो तेजी से होता है।
CREATE TABLE t1 (id INT, title VARCHAR(20), someIntCol INT)
GO
CREATE TABLE t2 (id INT, t1Id INT, someData VARCHAR(20))
GO
INSERT INTO t1
SELECT 1, 'title 1', 5 UNION ALL
SELECT 2, 'title 2', 5 UNION ALL
SELECT 3, 'title 3', 5 UNION ALL
SELECT 4, 'title 4', 5 UNION ALL
SELECT null, 'title 5', 5 UNION ALL
SELECT null, 'title 6', 5
INSERT INTO t2
SELECT 1, 1, 'data 1' UNION ALL
SELECT 2, 1, 'data 2' UNION ALL
SELECT 3, 2, 'data 3' UNION ALL
SELECT 4, 3, 'data 4' UNION ALL
SELECT 5, 3, 'data 5' UNION ALL
SELECT 6, 3, 'data 6' UNION ALL
SELECT 7, 4, 'data 7' UNION ALL
SELECT 8, null, 'data 8' UNION ALL
SELECT 9, 6, 'data 9' UNION ALL
SELECT 10, 6, 'data 10' UNION ALL
SELECT 11, 8, 'data 11'
प्रश्न 1
SELECT
FROM t1
WHERE not EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id)
प्रश्न २
SELECT t1.*
FROM t1
WHERE t1.id not in (SELECT t2.t1id FROM t2 )
यदि t1
आपकी आईडी में शून्य मान है, तो क्वेरी 1 उन्हें मिल जाएगी, लेकिन क्वेरी 2 कठबोली शून्य मापदंडों को ढूंढती है।
मेरा मतलब है कि IN
अशक्त के साथ किसी भी चीज की तुलना नहीं की जा सकती है, इसलिए इसमें अशक्त के लिए कोई परिणाम नहीं है, लेकिन EXISTS
अशक्त के साथ सब कुछ की तुलना कर सकते हैं।
यदि आप IN
ऑपरेटर का उपयोग कर रहे हैं , तो SQL इंजन आंतरिक क्वेरी से प्राप्त सभी रिकॉर्ड स्कैन करेगा। दूसरी ओर यदि हम उपयोग कर रहे हैं EXISTS
, तो SQL इंजन एक मैच मिलते ही स्कैनिंग प्रक्रिया को रोक देगा।
IN केवल समानता संबंधों (या असमानता का समर्थन करता है जब पहले नहीं )।
यह = किसी भी / = कुछ , उदाहरण के लिए एक पर्याय है
select *
from t1
where x in (select x from t2)
;
EXISTS विभिन्न प्रकार के संबंधों का समर्थन करता है, जिन्हें IN , जैसे का उपयोग करके व्यक्त नहीं किया जा सकता है -
select *
from t1
where exists (select null
from t2
where t2.x=t1.x
and t2.y>t1.y
and t2.z like '℅' || t1.z || '℅'
)
;
EXISTS और IN के बीच कथित रूप से प्रदर्शन और तकनीकी अंतर विशिष्ट विक्रेता के कार्यान्वयन / सीमाओं / बगों के परिणामस्वरूप हो सकता है, लेकिन कई बार वे डेटाबेस इंटर्नल्स की समझ की कमी के कारण बनाए गए मिथकों के अलावा कुछ भी नहीं हैं।
तालिकाओं की परिभाषा, सांख्यिकी सटीकता, डेटाबेस कॉन्फ़िगरेशन और ऑप्टिमाइज़र के संस्करण का निष्पादन योजना पर सभी प्रभाव पड़ता है और इसलिए प्रदर्शन मीट्रिक पर।
Exists
कीवर्ड सही या गलत का मूल्यांकन करता है, लेकिन IN
कीवर्ड इसी उप क्वेरी स्तंभ में सभी मूल्य की तुलना करें। एक और एक कमांड के Select 1
साथ उपयोग किया जा सकता है Exists
। उदाहरण:
SELECT * FROM Temp1 where exists(select 1 from Temp2 where conditions...)
लेकिन IN
इतनी Exists
तेजी से कम कुशल है ।
मुझे लगता है,
EXISTS
जब आपको किसी अन्य सबक्वेरी के साथ क्वेरी के परिणामों का मिलान करने की आवश्यकता होती है। सब # 1 परिणामों को पुनः प्राप्त करने की आवश्यकता है, जहां SubQuery परिणाम मेल खाते हैं। एक तरह की ज्वाइन .. जैसे कि कस्टमर टेबल # 1 का चयन करें जिन्होंने ऑर्डर टेबल # 2 भी रखा हो
यदि किसी विशिष्ट कॉलम का मूल्य IN
एक सूची (1,2,3,4,5) है, तो उन ग्राहकों को पुनः प्राप्त करना है, जो निम्नलिखित zipcodes यानी zip_code मानों में निहित ग्राहकों का चयन करते हैं (....) सूची में।
जब एक दूसरे का उपयोग करने के लिए ... जब आपको लगता है कि यह उचित रूप से पढ़ता है (बेहतर इरादे संचार करता है)।
अंतर यहाँ है:
select *
from abcTable
where exists (select null)
उपरोक्त क्वेरी सभी अभिलेखों को वापस कर देगी, जबकि नीचे एक खाली आएगा।
select *
from abcTable
where abcTable_ID in (select null)
इसे आज़माएं और आउटपुट देखें।
कौन सा तेज़ है यह आंतरिक क्वेरी द्वारा प्राप्त प्रश्नों की संख्या पर निर्भर करता है:
सही या गलत पर मूल्यांकन का मूल्यांकन करें, लेकिन कई मूल्य की तुलना करें। जब आप नहीं जानते कि रिकॉर्ड मौजूद है या नहीं, तो आपको EXIST चुनना चाहिए
कारण यह है कि EXISTS ऑपरेटर "कम से कम पाया गया" सिद्धांत के आधार पर काम करता है। यह सच हो जाता है और कम से कम एक मिलान पंक्ति मिल जाने के बाद स्कैनिंग टेबल बंद हो जाती है।
दूसरी ओर, जब IN ऑपरेटर को एक सबक्वेरी के साथ जोड़ा जाता है, तो MySQL को पहले सबक्वेरी को प्रोसेस करना होगा, और फिर सब क्वेरी को प्रोसेस करने के लिए सबक्वेरी के परिणाम का उपयोग करना होगा।
अंगूठे का सामान्य नियम यह है कि यदि उपकुंजी में बड़ी मात्रा में डेटा होता है, तो EXISTS ऑपरेटर एक बेहतर प्रदर्शन प्रदान करता है।
हालाँकि, IN ऑपरेटर का उपयोग करने वाली क्वेरी तेजी से प्रदर्शन करेगी यदि उप-सेट से लौटाया गया परिणाम बहुत छोटा है।
मेरी समझ यह है कि दोनों को तब तक एक जैसा होना चाहिए जब तक हम NULL मानों के साथ काम नहीं कर रहे हैं।
उसी कारण से जो क्वेरी = NULL vs NULL के लिए मान नहीं लौटाता है। http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
जैसा कि बूलियन बनाम तुलनित्र तर्क के लिए जाता है, एक बूलियन उत्पन्न करने के लिए दोनों मूल्यों की तुलना करने की आवश्यकता होती है और यह है कि यदि कोई शर्त काम करता है।
In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403
यदि एक सबक्वेरी एक से अधिक मान लौटाता है, तो आपको बाहरी क्वेरी निष्पादित करने की आवश्यकता हो सकती है- यदि शर्त में निर्दिष्ट कॉलम के भीतर सबक्वेरी के परिणाम सेट में किसी भी मूल्य से मेल खाता है। इस कार्य को करने के लिए, आपको in
कीवर्ड का उपयोग करने की आवश्यकता है ।
रिकॉर्ड्स का एक सेट मौजूद है या नहीं यह जांचने के लिए आप एक सबक्वेरी का उपयोग कर सकते हैं। इसके लिए, आपको exists
उप-वर्ग के साथ खंड का उपयोग करने की आवश्यकता है । exists
कीवर्ड हमेशा सही या गलत मान।
मेरा मानना है कि इसका सीधा जवाब है। आप उन लोगों से इसकी जांच क्यों नहीं करते हैं जिन्होंने अपने सिस्टम में उस फ़ंक्शन को विकसित किया है?
यदि आप एक MS SQL डेवलपर हैं, तो इसका जवाब सीधे Microsoft से है।
IN
:
निर्धारित करता है कि क्या एक निर्दिष्ट मूल्य किसी उपश्रेणी या सूची में किसी भी मूल्य से मेल खाता है।
पंक्तियों के अस्तित्व के परीक्षण के लिए एक उपश्रेणी निर्दिष्ट करता है।
मैंने पाया कि EXISTS कीवर्ड का उपयोग करना वास्तव में बहुत धीमा है (यह Microsoft Access में बहुत सही है)। इसके बजाय मैं इस तरह से जुड़ने वाले ऑपरेटर का उपयोग करता हूं: चाहिए-आई-यू-ए-कीवर्ड-मौजूद-इन-एसक्यूएल
यदि आप IN ऑपरेटर का उपयोग कर रहे हैं, तो SQL इंजन आंतरिक क्वेरी से प्राप्त सभी रिकॉर्ड स्कैन करेगा। दूसरी ओर यदि हम EXISTS का उपयोग कर रहे हैं, तो SQL इंजन मैच मिलते ही स्कैनिंग प्रक्रिया को रोक देगा।
IN
और EXISTS
समतुल्य हो सकते हैं और एक दूसरे में बदल सकते हैं।
JOIN
प्रतिस्थापन के रूप में उपयोग कर सकते हैंIN
।