না বনাম উপস্থিত নেই


538

এই প্রশ্নগুলির মধ্যে কোনটি দ্রুত?

বিদ্যমান না:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Northwind..[Order Details] od 
    WHERE p.ProductId = od.ProductId)

বা না:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
    SELECT ProductID 
    FROM Northwind..[Order Details])

ক্যোয়ারি এক্সিকিউশন প্ল্যান বলছে যে তারা উভয়ই একই কাজ করে। যদি তা হয় তবে কোনটি প্রস্তাবিত ফর্ম?

এটি নর্থউইন্ড ডাটাবেসের উপর ভিত্তি করে।

[সম্পাদনা]

সবেমাত্র এই সহায়ক নিবন্ধটি পাওয়া গেছে: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

আমি মনে করি আমি অস্তিত্বের সাথে থাকব।


3
আপনি কি বাম জোড় ব্যবহার করে পরিকল্পনার চেষ্টা করেছেন যেখানে নাল?
সেবাস

1
না উপস্থিত এবং নাও অভিন্ন নয়। তাদের মধ্যে পার্থক্যের জন্য এই লিঙ্কটি একবার দেখুন: weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
আমেয়া গোখলে

2
আমি ডেটাবেস পৃথক ভাবছি, কিন্তু পোস্টগ্রি বিরুদ্ধে আমার সর্বশেষ বেঞ্চমার্ক, এই NOT IN: QUERY SELECT "A".* FROM "A" WHERE "A"."id" NOT IN (SELECT "B"."Aid" FROM "B" WHERE "B"."Uid" = 2)ফাস্ট এই হিসাবে প্রায় 30 বার NOT EXISTS:SELECT "A".* FROM "A" WHERE (NOT (EXISTS (SELECT 1 FROM "B" WHERE "B"."user_id" = 2 AND "B"."Aid" = "A"."id")))
Phương গান Nguyễn


1
@rcdmk আপনি প্রশ্নগুলির তারিখটি পরীক্ষা করেছেন?
ইলিটরিট

উত্তর:


693

আমি সর্বদা ডিফল্ট NOT EXISTS

মৃত্যুদন্ড পরিকল্পনা মুহূর্তে একই হতে পারে কিন্তু পারেন কলাম ভবিষ্যতে পরিবর্তিত হয় করার অনুমতি যদি NULLগুলি NOT INসংস্করণ আরো কাজ করতে (এমনকি যদি কোন প্রয়োজন হবে NULLগুলি আসলে তথ্য উপস্থিত থাকে) এবং এর শব্দার্থবিদ্যা NOT INযদি NULLগুলি হয় বর্তমান আপনি যেভাবেই চান তা হওয়ার সম্ভাবনা কম।

যখন তন্ন তন্ন Products.ProductIDবা [Order Details].ProductIDঅনুমতি দেয় NULLগুলি NOT INনিম্নলিখিত প্রশ্নের সাথে অনুরূপ বিবেচনা করা হবে।

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId) 

সঠিক পরিকল্পনাটি ভিন্ন হতে পারে তবে আমার উদাহরণের ডেটার জন্য আমি নিম্নলিখিতটি পাই।

NULL না

যুক্তিসঙ্গতভাবে একটি সাধারণ ভুল ধারণা থেকে মনে হয় যে যোগসূত্রের তুলনায় পারস্পরিক সম্পর্কযুক্ত সাব কোয়েরিগুলি সর্বদা "খারাপ" থাকে। তারা অবশ্যই থাকতে পারে যখন তারা কোনও নেস্টেড লুপস পরিকল্পনাকে জোর করে (সাব ক্যোয়ার সারি সারি সারি মূল্যায়ন করে) তবে এই পরিকল্পনায় একটি এন্টি সেমি জয়েন্ট লজিকাল অপারেটর অন্তর্ভুক্ত রয়েছে। এন্টি আধা যোগদানগুলি নেস্টেড লুপগুলিতে সীমাবদ্ধ নয় তবে হ্যাশ বা মার্জ ব্যবহার করতে পারে (এই উদাহরণ হিসাবে) এতেও যোগ দেয়।

/*Not valid syntax but better reflects the plan*/ 
SELECT p.ProductID,
       p.ProductName
FROM   Products p
       LEFT ANTI SEMI JOIN [Order Details] od
         ON p.ProductId = od.ProductId 

যদি [Order Details].ProductIDহয় NULL-able ক্যোয়ারী তখন হয়ে

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId)
       AND NOT EXISTS (SELECT *
                       FROM   [Order Details]
                       WHERE  ProductId IS NULL) 

এর কারণ হ'ল সঠিক শব্দার্থবিজ্ঞান যদি [Order Details]কোনও NULL ProductIdএস থাকে তবে কোনও ফলাফল না দেওয়া। পরিকল্পনায় যুক্ত হওয়া এটি যাচাই করতে অতিরিক্ত অ্যান্টি-সেমি যোগ এবং সারি গণনা স্পুল দেখুন।

একটি নাল

Products.ProductIDএছাড়াও যদি NULLক্যোয়ারী-যোগ্য হয়ে ওঠে তবে তা হয়ে যায়

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId)
       AND NOT EXISTS (SELECT *
                       FROM   [Order Details]
                       WHERE  ProductId IS NULL)
       AND NOT EXISTS (SELECT *
                       FROM   (SELECT TOP 1 *
                               FROM   [Order Details]) S
                       WHERE  p.ProductID IS NULL) 

যে এক কারণ কারণ একটি নয় NULL Products.ProductIdফলাফলে ফিরে করা উচিত নয় ব্যতীত যদি NOT INসাব ক্যোয়ারী (ie সব সময়ে কোন ফলাফল শূণ্য ছিল [Order Details]টেবিল খালি)। কোন ক্ষেত্রে এটি করা উচিত। আমার নমুনা ডেটার পরিকল্পনায় এটি নীচে হিসাবে আরও একটি এন্টি সেমি যোগ করে প্রয়োগ করা হয়।

দু'জনেই শুভ

এর প্রভাব ইতিমধ্যে বাকলির লিঙ্কযুক্ত ব্লগ পোস্টে দেখানো হয়েছে । উদাহরণস্বরূপ সেখানে যৌক্তিক পাঠের সংখ্যা প্রায় 400 থেকে 500,000 পর্যন্ত বৃদ্ধি পায়।

অতিরিক্তভাবে যে কোনও একক NULLসারি গণনা শূন্যে হ্রাস করতে পারে তা কার্ডিনালিটির অনুমানকে খুব কঠিন করে তোলে। যদি এসকিউএল সার্ভার অনুমান করে যে এটি ঘটবে তবে বাস্তবে NULLডেটাতে কোনও সারি নেই তবে বাকী মৃত্যুদণ্ড কার্যকর করার পরিকল্পনাটি বিপর্যয়করভাবে আরও খারাপ হতে পারে, যদি এটি ব্যয়বহুল সাবটির পুনরাবৃত্তি কার্যকর করার জন্য অনুপযুক্ত নেস্টযুক্ত লুপগুলি সহ উদাহরণস্বরূপ গাছ

এই শুধুমাত্র সম্ভব ফাঁসি পরিকল্পনা নয় NOT INএকটি উপর NULL-able কলাম তবে। এই নিবন্ধটিAdventureWorks2008 ডাটাবেসের বিরুদ্ধে একটি প্রশ্নের জন্য অন্য একটি দেখায়

জন্য NOT INএকটি উপর NOT NULLকলাম বা NOT EXISTSহয় একটি nullable বা অ nullable কলাম বিরুদ্ধে নিম্নোক্ত পরিকল্পনা দেয়।

বিদ্যমান না

কলামটি পরিবর্তনযোগ্য- NULLসক্ষম করার NOT INপরিকল্পনার মতো দেখতে এখন মনে হচ্ছে

নট ইন - নাল

এটি পরিকল্পনায় একটি অতিরিক্ত অভ্যন্তরীণ জোড় অপারেটর যুক্ত করে। এই যন্ত্রপাতিটি এখানে ব্যাখ্যা করা হয়েছে । পূর্ববর্তী একক সংযুক্ত সূচককে Sales.SalesOrderDetail.ProductID = <correlated_product_id>বাইরের সারিতে দুটি সেককে রূপান্তর করার জন্য এটি সমস্ত কিছুই । অতিরিক্ত একটি চালু আছে WHERE Sales.SalesOrderDetail.ProductID IS NULL

যেহেতু এটি একটি বিরোধী সেমি জোনের অধীনে রয়েছে যদি সে কোনও সারি প্রদান করে তবে দ্বিতীয় সন্ধানটি ঘটে না। তবে যদি Sales.SalesOrderDetailকোনও NULL ProductIDএস থাকে না তবে এটি প্রয়োজনীয় সিক অপারেশন দ্বিগুণ করে দেবে।


4
আমি কি জিজ্ঞাসা করতে পারি যে আপনি প্রোফাইলিং গ্রাফটি কীভাবে দেখানো হয়েছে?
xis

5
@ xis এগুলি এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার-এ কার্যকর করা পরিকল্পনা plans আপনি এসএসএমএসে প্রয়োগের পরিকল্পনাগুলি গ্রাফিকভাবে দেখতে পারেন।
মার্টিন স্মিথ

আমি একমাত্র কারণে এটি প্রশংসা করি যে: NOT EXISTSআমি যেভাবে কাজ করার প্রত্যাশা করি সেভাবে NOT INকাজ করে (যা এটি কার্যকর করে না)।
লেভিনিনজা

নন অস্টিস্টস সহ, আমি সিলেক্ট 1 যেমন নট অস্টিস্টস (যে কোনও কিছু থেকে 1 টি নির্বাচন করুন) ব্যবহার করার চেষ্টা করি যাতে ডাটাবেসটি আসলে ডিস্ক থেকে কলামগুলি ফেরত না দেয়। এটি আপনার ক্ষেত্রে কোনও পার্থক্য তৈরি করে কিনা তা নির্ধারণের জন্য ব্যাখ্যা ব্যবহার করা সম্ভবত একটি ভাল ধারণা।
ময়ূর প্যাটেল

4
@ ময়ূর এসকিউএল সার্ভারে এর প্রয়োজন নেই। stackoverflow.com/questions/1597442/…
মার্টিন স্মিথ

84

এছাড়াও সচেতন থাকুন যে শূন্য করার বিষয়টি যখন আসে তখন নোট IN উপস্থিতির সমতুল্য নয়।

এই পোস্টটি এটি খুব ভাল ব্যাখ্যা করে

http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/

যখন সাবকিউরিটি এমনকি একটি নাল ফেরায়, কোনও IN সারি মিলবে না।

নাট ইন অপারেশনটি আসলে কী বোঝায় তার বিশদটি দেখে এর কারণ খুঁজে পাওয়া যাবে।

ধরা যাক, উদাহরণস্বরূপ উদ্দেশ্যে টেবিলে 4 টি সারি রয়েছে, টি নামক আইডি নামে একটি কলাম রয়েছে যার মান 1..4 রয়েছে

WHERE SomeValue NOT IN (SELECT AVal FROM t)

সমতুল্য

WHERE SomeValue != (SELECT AVal FROM t WHERE ID=1)
AND SomeValue != (SELECT AVal FROM t WHERE ID=2)
AND SomeValue != (SELECT AVal FROM t WHERE ID=3)
AND SomeValue != (SELECT AVal FROM t WHERE ID=4)

আরও বলা যাক যে আভালটি নাল যেখানে আইডি = ৪ তাই অতএব! = তুলনাটি অজানা প্রত্যাবর্তন করে। এবং এর জন্য যৌক্তিক সত্য সারণীটি জানায় যে অজানা এবং সত্য হ'ল অজ্ঞাত, অজানা এবং মিথ্যাটি মিথ্যা। ফলাফলটির সত্যতা নির্ধারণের জন্য অজানা দিয়ে AND করা যাবে এমন কোনও মান নেই

অতএব, যদি এই উপকণার কোনও সারি NULL ফেরত দেয় তবে সম্পূর্ণ অপারেটরটি ফলস বা ন্যূনাল উভয়কেই মূল্যায়ন করবে এবং কোনও রেকর্ড ফিরিয়ে দেওয়া হবে না


24

যদি কার্যনির্বাহক পরিকল্পনাকারী বলেন যে তারা একই, তারা একই। যে কোনও একটি ব্যবহার করুন আপনার উদ্দেশ্যটিকে আরও সুস্পষ্ট করে তুলবে - এক্ষেত্রে দ্বিতীয়।


3
এক্সিকিউশন প্ল্যানারের সময় একই হতে পারে তবে মৃত্যুদণ্ডের ফলাফল পৃথক হতে পারে তাই পার্থক্য রয়েছে। আপনার ডেটাসেটে যদি শূন্য থাকে তবে অপ্রত্যাশিত ফলাফল আনবে না (বাকলির উত্তর দেখুন)। ডিফল্ট হিসাবে অস্তিত্ব নেই ব্যবহার করার জন্য সেরা।
ন্যানোনার্ড

15

আসলে, আমি বিশ্বাস করি এটি সবচেয়ে দ্রুত হবে:

SELECT ProductID, ProductName 
    FROM Northwind..Products p  
          outer join Northwind..[Order Details] od on p.ProductId = od.ProductId)
WHERE od.ProductId is null

2
অপ্টিমাইজার যখন এটি কাজ করছে তখন দ্রুততম নাও হতে পারে তবে তা যখন না হয় অবশ্যই দ্রুততর হয়।
ক্যাড রক্স

2
তিনি এই পোস্টের জন্যও তার জিজ্ঞাসাটি সহজতর করতে পারেন
কিপ করুন

1
বাম বাহিরের যোগসূত্রটি প্রায়শই subquery চেয়ে দ্রুত হয় faster
এইচএলজিইএম

7
@ এইচএলজিইএম অসমত। আমার অভিজ্ঞতায় LOJ- র ক্ষেত্রে সবচেয়ে ভাল কেসটি হ'ল তারা একই এবং এসকিউএল সার্ভার LOJ কে একটি এন্টি সেমি জোনে রূপান্তর করে। সবচেয়ে খারাপ ক্ষেত্রে এসকিউএল সার্ভার সর্বমোট বামে যোগ দেয় এবং NUL গুলি ফিল্টার করে যার পরে আরও অকার্যকর হতে পারে। এই নিবন্ধটির নীচে এর উদাহরণ
মার্টিন স্মিথ

12

আমার কাছে একটি টেবিল রয়েছে যার প্রায় 120,000 রেকর্ড রয়েছে এবং কেবলমাত্র চারটি সারণীতে 1500, 4000, 40000, 200 সহ চারটি সারণীতে অস্তিত্ব নেই (কেবলমাত্র একটি ভার্চর কলামের সাথে মিলেছে) কেবলমাত্র তাদের বেছে নেওয়া দরকার the সম্পর্কিত Varcharকলামে।

NOT INপ্রায় 10 মিনিট সময় NOT EXISTSনিয়েছিল, 4 সেকেন্ড সময় নিয়েছিল।

আমার একটি পুনরাবৃত্তি ক্যোয়ারী রয়েছে যার কিছু অব্যবহৃত অংশ থাকতে পারে যা 10 মিনিটের জন্য অবদান রাখতে পারে, তবে অন্য বিকল্পটি 4 সেকেন্ড নিয়ে ব্যাখ্যা করে, আমার NOT EXISTSকাছে কমপক্ষে এটি আরও ভাল বা কমপক্ষে যা সঠিক INএবং EXISTSএকরকম নয় এবং সর্বদা মূল্যবান কোড সহ এগিয়ে যাওয়ার আগে চেক করুন।


8

আপনার নির্দিষ্ট উদাহরণে সেগুলি একই, কারণ আপনি যা করতে চেষ্টা করছেন তা অপ্টিমাইজারটি নির্ধারণ করেছে যে দুটি উদাহরণেই এটি একই। তবে এটি সম্ভব যে অপ্রয়োজনীয় উদাহরণগুলিতে অপ্টিমাইজার এটি নাও করতে পারে এবং সেক্ষেত্রে উপলক্ষ্যে একজনকে অপরটির চেয়ে পছন্দ করার কারণ রয়েছে।

NOT INআপনি যদি আপনার বাহ্যিক নির্বাচনের একাধিক সারি পরীক্ষা করে থাকেন তবে অগ্রাধিকার দেওয়া উচিত। বিবৃতিটির অভ্যন্তরীণ সাবকোয়ারিটি NOT INকার্যকর করার শুরুতে মূল্যায়ন করা যেতে পারে এবং NOT EXISTSবিবৃতিতে প্রয়োজনীয় হিসাবে প্রয়োজন অনুযায়ী প্রতিবারের সাব-সাবলেটটি পুনরায় চালানোর পরিবর্তে অস্থায়ী টেবিলটি বাহ্যিক নির্বাচনের প্রতিটি মানের বিপরীতে পরীক্ষা করা যায় ।

যদি সাবকিউরিটি অবশ্যই বাহ্যিক নির্বাচনের সাথে সম্পর্কিত NOT EXISTSহতে পারে তবে তার চেয়ে বেশি পছন্দনীয় হতে পারে, যেহেতু অপ্টিমাইজার একটি সরলকরণ আবিষ্কার করতে পারে যা একই ফাংশনটি সম্পাদন করতে কোনও অস্থায়ী টেবিল তৈরির প্রতিরোধ করে।


6

আমি ব্যবহার করছিলাম

SELECT * from TABLE1 WHERE Col1 NOT IN (SELECT Col1 FROM TABLE2)

এবং দেখেছি যে এটি ভুল ফলাফল দিচ্ছে (ভুল করে আমার অর্থ কোনও ফল নেই)। যেমন টেবিল 2.কম 1 এ একটি শূন্য ছিল।

কোয়েরিতে পরিবর্তন করার সময়

SELECT * from TABLE1 T1 WHERE NOT EXISTS (SELECT Col1 FROM TABLE2 T2 WHERE T1.Col1 = T2.Col2)

আমাকে সঠিক ফলাফল দিয়েছে।

তার পর থেকে আমি যেখানেই নেই অস্তিত্ব ব্যবহার করা শুরু করেছি।


5

এগুলি খুব অনুরূপ তবে বাস্তবে এক নয়।

দক্ষতার দিক থেকে, আমি বাম জোড়টি নাল স্টেটমেন্টটি আরও দক্ষ দেখিয়েছি (যখন সারিগুলির একটি প্রাচুর্যটি নির্বাচন করতে হবে)


2

অপ্টিমাইজার যদি সেগুলি একই বলে তবে মানবিক উপাদানটি বিবেচনা করুন। আমি অস্তিত্ব না দেখতে পছন্দ করি :)


1

এটি একটি খুব ভাল প্রশ্ন, তাই আমি এই বিষয়টি নিয়ে আমার ব্লগে একটি খুব বিস্তারিত নিবন্ধ লেখার সিদ্ধান্ত নিয়েছি ।

ডাটাবেস টেবিল মডেল

আসুন ধরে নেওয়া যাক আমাদের আমাদের ডাটাবেসে নিম্নলিখিত দুটি সারণী রয়েছে যা একের সাথে একাধিক টেবিলের সম্পর্ক তৈরি করে।

এসকিউএল বিদ্যমান সারণী

studentটেবিল পিতা বা মাতা, এবংstudent_grade শিশু টেবিল যেহেতু এটি একটি student_id পররাষ্ট্র কী কলাম ছাত্র টেবিলে আইডি প্রাথমিক কী কলাম উল্লেখ হয়েছে।

student tableনিম্নলিখিত দুটি রেকর্ড রয়েছে:

| id | first_name | last_name | admission_score |
|----|------------|-----------|-----------------|
| 1  | Alice      | Smith     | 8.95            |
| 2  | Bob        | Johnson   | 8.75            |

এবং, student_gradeটেবিলটি শিক্ষার্থীদের প্রাপ্ত গ্রেডগুলি সংরক্ষণ করে:

| id | class_name | grade | student_id |
|----|------------|-------|------------|
| 1  | Math       | 10    | 1          |
| 2  | Math       | 9.5   | 1          |
| 3  | Math       | 9.75  | 1          |
| 4  | Science    | 9.5   | 1          |
| 5  | Science    | 9     | 1          |
| 6  | Science    | 9.25  | 1          |
| 7  | Math       | 8.5   | 2          |
| 8  | Math       | 9.5   | 2          |
| 9  | Math       | 9     | 2          |
| 10 | Science    | 10    | 2          |
| 11 | Science    | 9.4   | 2          |

এসকিউএল উপস্থিত রয়েছে

ধরা যাক আমরা ম্যাথ ক্লাসে 10 গ্রেড প্রাপ্ত সকল শিক্ষার্থী পেতে চাই।

আমরা যদি কেবলমাত্র শিক্ষার্থী শনাক্তকরণে আগ্রহী, তবে আমরা এই জাতীয় একটি কোয়েরি চালাতে পারি:

SELECT
    student_grade.student_id
FROM
    student_grade
WHERE
    student_grade.grade = 10 AND
    student_grade.class_name = 'Math'
ORDER BY
    student_grade.student_id

তবে, অ্যাপ্লিকেশনটি studentকেবল সনাক্তকারী নয়, একটির পুরো নামটি প্রদর্শন করতে আগ্রহী , সুতরাং আমাদের studentপাশাপাশি টেবিল থেকেও তথ্য প্রয়োজন ।

studentগণিতে একটি 10 ​​গ্রেড রয়েছে এমন রেকর্ডগুলি ফিল্টার করার জন্য , আমরা এইগুলির মতো বিদ্যমান এসকিউএল অপারেটরটি ব্যবহার করতে পারি:

SELECT
    id, first_name, last_name
FROM
    student
WHERE EXISTS (
    SELECT 1
    FROM
        student_grade
    WHERE
        student_grade.student_id = student.id AND
        student_grade.grade = 10 AND
        student_grade.class_name = 'Math'
)
ORDER BY id

উপরের ক্যোয়ারীটি চালানোর সময়, আমরা দেখতে পাচ্ছি যে কেবলমাত্র অ্যালিস সারিটি নির্বাচিত হয়েছে:

| id | first_name | last_name |
|----|------------|-----------|
| 1  | Alice      | Smith     |

বাহ্যিক ক্যোয়ারী studentআমাদের ক্লায়েন্টটিতে ফিরে আসতে আগ্রহী সারি কলামগুলি নির্বাচন করে । যাইহোক, WHERE ধারাটি একটি সম্পর্কিত অভ্যন্তরীণ subquery সহ উপস্থিতি অপারেটরটি ব্যবহার করছে।

সাবকিউরিটি অন্তত একটি রেকর্ড প্রত্যাবর্তন করে এবং কোনও সারি নির্বাচন না করা হলে মিথ্যাটি উপস্থিত থাকলে উপস্থিতি অপারেটর সত্য বলে প্রত্যাবর্তন করে। ডাটাবেস ইঞ্জিনটিকে সাবকোরিটি পুরোপুরি চালাতে হবে না। যদি একটি একক রেকর্ডটি মিলে যায় তবে উপস্থিতি অপারেটরটি সত্য ফিরে আসে এবং সম্পর্কিত অন্যান্য ক্যোয়ারী সারিটি নির্বাচিত হয়।

অভ্যন্তরীণ সাবকোয়ারিটি পারস্পরিক সম্পর্কযুক্ত কারণ student_gradeটেবিলের ছাত্র_আইডি কলামটি বহিরাগত শিক্ষার্থী সারণীর আইডি কলামের সাথে মেলে।

এসকিউএল উপস্থিত নেই

আসুন আমরা বিবেচনা করি যে আমরা 9 ​​টির চেয়ে কম গ্রেড নেই এমন সমস্ত শিক্ষার্থী নির্বাচন করতে চাই। এর জন্য আমরা নট অস্টিস্টস ব্যবহার করতে পারি, যা উপস্থিতি অপারেটরের যুক্তিকে উপেক্ষা করে।

অতএব, অন্তর্নিহিত সাবকিউরিটি যদি কোনও রেকর্ড না ফেরায় তবে অস্তিত্ব নেই অপারেটর সত্য বলে প্রত্যাবর্তন করে। তবে, যদি একটি একক রেকর্ডটি অভ্যন্তরীণ সাবকোয়্যারির সাথে মিলে যায় তবে উপস্থিত নেই অপারেটরটি মিথ্যা প্রত্যাবর্তন করবে এবং সাবকিউরি এক্সিকিউশন থামানো যাবে।

9 টিরও কম মানের সাথে কোনও শিক্ষার্থী_গ্রেডের সাথে সম্পর্কিত নয় এমন সমস্ত শিক্ষার্থীর রেকর্ডের সাথে মেলে, আমরা নিম্নলিখিত এসকিউএল কোয়েরিটি চালাতে পারি:

SELECT
    id, first_name, last_name
FROM
    student
WHERE NOT EXISTS (
    SELECT 1
    FROM
        student_grade
    WHERE
        student_grade.student_id = student.id AND
        student_grade.grade < 9
)
ORDER BY id

উপরের ক্যোয়ারীটি চালানোর সময়, আমরা দেখতে পাচ্ছি যে কেবলমাত্র অ্যালিস রেকর্ডটি মিলেছে:

| id | first_name | last_name |
|----|------------|-----------|
| 1  | Alice      | Smith     |

সুতরাং, এসকিউএল উপস্থিতি এবং না থাকা অপারেটরগুলি ব্যবহার করার সুবিধাটি হ'ল যতক্ষণ না কোনও মিলের রেকর্ড পাওয়া যায় ততক্ষণ অভ্যন্তরীণ সাবকোয়ারি এক্সিকিউশনটি থামানো যেতে পারে।


-1

এটা নির্ভর করে..

SELECT x.col
FROM big_table x
WHERE x.key IN( SELECT key FROM really_big_table );

অপেক্ষাকৃত মন্থর হবে না যদি তারা কী হয় কি দেখতে ক্যোয়ারী চেকের সীমা আকার অনেক নয়। বিদ্যমান এই ক্ষেত্রে বাঞ্ছনীয় হবে।

তবে, ডিবিএমএসের অপ্টিমাইজারের উপর নির্ভর করে এটি আলাদা হতে পারে না।

উদাহরণস্বরূপ যখন উপস্থিতি আরও ভাল

SELECT x.col
FROM big_table x
WHERE EXISTS( SELECT key FROM really_big_table WHERE key = x.key);
  AND id = very_limiting_criteria

1
INএবং EXISTS এসকিউএল সার্ভারে একই পরিকল্পনা পান । প্রশ্ন যাই হোক NOT INবনাম সম্পর্কে NOT EXISTS
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.