← Back to MySQL Course | Chapter 11: Subqueries | Lesson 5 of 6

EXISTS और NOT EXISTS

EXISTS बस यह देखने के लिए एक box में झाँकने जैसा है कि अंदर कुछ है या नहीं। यह एक चीज़ मिलते ही yes कहता है, बिना count किए।
Syntax
sql
SELECT columns FROM outer_table AS o
WHERE [NOT] EXISTS (
  SELECT 1 FROM inner_table AS i
  WHERE i.column = o.column
);

EXISTS का Introduction

EXISTS operator test करता है कि current evaluate हो रही outer row के लिए एक subquery कोई rows return करती है या नहीं। अगर subquery को एक match मिले, यह TRUE return करता है। नहीं तो, यह FALSE return करता है, actual row contents को कभी देखे बिना।

उदाहरण: Introduction to EXISTS

sql
CREATE TABLE customers (id INT, name TEXT);
CREATE TABLE orders (id INT, customer_id INT);
INSERT INTO customers VALUES (1, 'Amit'), (2, 'Priya');
INSERT INTO orders VALUES (101, 1);
SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

EXISTS कैसे Evaluate होता है

EXISTS highly efficient है क्योंकि यह short-circuit कैसे करता है। यह subquery में बिल्कुल पहली matching row मिलते ही search करना बंद कर देता है। यह ज़्यादा matches नहीं ढूँढता, COUNT() के उलट जो सब कुछ scan करेगा।

उदाहरण: How EXISTS Evaluates

sql
CREATE TABLE customers (id INT, name TEXT);
CREATE TABLE orders (id INT, customer_id INT);
INSERT INTO customers VALUES (1, 'Amit');
INSERT INTO orders VALUES (101, 1), (102, 1), (103, 1);
-- Stops at the first matching order, doesn't scan all three
SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

NOT EXISTS इस्तेमाल करना

NOT EXISTS EXISTS का opposite है, presence के बजाय absence check करते हुए। यह सिर्फ तभी TRUE return करता है जब subquery zero rows return करे। यह missing items ढूँढने के लिए बढ़िया है, जैसे वे customers जिन्होंने कभी order नहीं किया।

उदाहरण: Using NOT EXISTS

sql
CREATE TABLE customers (id INT, name TEXT);
CREATE TABLE orders (id INT, customer_id INT);
INSERT INTO customers VALUES (1, 'Amit'), (2, 'Priya');
INSERT INTO orders VALUES (101, 1);
SELECT * FROM customers c WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

EXISTS बनाम IN

IN subquery द्वारा return की गई values की एक list search करता है, जबकि EXISTS matching rows की सिर्फ presence check करता है। EXISTS complex correlated datasets के साथ आमतौर पर तेज़ है, क्योंकि यह पूरी list बनाने के बजाय पहले match पर रुक सकता है।

उदाहरण: EXISTS vs IN

sql
CREATE TABLE customers (id INT, region TEXT);
CREATE TABLE orders (id INT, customer_id INT);
INSERT INTO customers VALUES (1, 'North'), (2, 'South');
INSERT INTO orders VALUES (101, 1);
-- IN: builds the whole list first
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE region = 'North');
-- EXISTS: stops at the first match
SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM customers c WHERE c.id = o.customer_id AND c.region = 'North');

Subquery Select Values के साथ EXISTS

inner SELECT list में actual columns EXISTS के लिए मायने नहीं रखते, क्योंकि इसकी सिर्फ इसकी परवाह है कि कोई row वापस आती है या नहीं। आप SELECT 1, SELECT *, या SELECT NULL लिख सकते हैं। दोनों ही तरह result same रहता है।

उदाहरण: EXISTS with Subquery Select Values

sql
CREATE TABLE customers (id INT, name TEXT);
CREATE TABLE orders (id INT, customer_id INT);
INSERT INTO customers VALUES (1, 'Amit');
INSERT INTO orders VALUES (101, 1);
SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
SELECT * FROM customers c WHERE EXISTS (SELECT * FROM orders o WHERE o.customer_id = c.id);
SELECT * FROM customers c WHERE EXISTS (SELECT NULL FROM orders o WHERE o.customer_id = c.id);
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. यह सोचकर SELECT * इस्तेमाल करना कि EXISTS में columns मायने रखते हैं, जबकि सिर्फ यह test होता है कि rows exist करती हैं या नहीं।
  2. EXISTS के अंदर correlation condition भूल जाना, ताकि कोई भी row exist करने पर यह हर row के लिए true हो जाए।
  3. NULL values के साथ NOT EXISTS के बजाय NOT IN इस्तेमाल करना, जो कोई rows return नहीं करता।
🔒

Chapter Quiz — Complete all 6 topics to unlock

0/6 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.