Kodokon kodokon.com

सबक्वेरी: WHERE, FROM, IN और EXISTS

किसी समुच्चय से तुलना करने, किसी सेट पर फ़िल्टर करने या अस्तित्व की जाँच करने के लिए एक क्वेरी को दूसरी के भीतर नेस्ट करें।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक सबक्वेरी वह क्वेरी है जिसे किसी दूसरी क्वेरी के भीतर कोष्ठकों में रखा जाता है। एक ही कथन में यह "औसत से ऊपर के ऑर्डर" या "कम से कम एक ऑर्डर वाले ग्राहक" जैसे प्रश्नों का उत्तर देती है। शुरू करने से पहले इस स्क्रिप्ट को sqliteonline.com या sqlite3 में चलाएँ।

SQL
CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  amount REAL NOT NULL
);

INSERT INTO customers (id, name) VALUES
  (1, 'Alice'), (2, 'Karim'),
  (3, 'Mina'), (4, 'Paulo');

INSERT INTO orders (id, customer_id, amount)
VALUES
  (1, 1, 49.90), (2, 1, 15.00),
  (3, 2, 120.50), (4, 2, 80.00),
  (5, 3, 9.90), (6, 1, 200.00);
डेटासेट: चार ग्राहक, छह ऑर्डर।

WHERE में रखी गई एक स्केलर सबक्वेरी को एक ही वैल्यू लौटानी चाहिए: एक पंक्ति, एक कॉलम। इंजन पहले इसकी गणना करता है, फिर इसे किसी अन्य स्थिरांक की तरह उपयोग करता है। आप यह किसी साधारण WHERE amount > AVG(amount) के साथ नहीं कर सकते, जो SQL में वर्जित है।

SQL
SELECT id, customer_id, amount
FROM orders
WHERE amount > (
  SELECT AVG(amount) FROM orders
);
औसत बास्केट (79.22) से ऊपर के ऑर्डर।

IN किसी कॉलम की तुलना सबक्वेरी द्वारा लौटाई गई वैल्यू के सेट से करता है। EXISTS यह जाँचता है कि सहसंबंधित (correlated) सबक्वेरी (यह c.id का संदर्भ देती है, जो बाहरी क्वेरी का एक कॉलम है) कम से कम एक पंक्ति लौटाती है या नहीं: जैसे ही पहला मिलान मिलता है, इंजन रुक जाता है।

SQL
SELECT name FROM customers
WHERE id IN (
  SELECT customer_id FROM orders
  WHERE amount > 100
);

SELECT c.name FROM customers AS c
WHERE EXISTS (
  SELECT 1 FROM orders AS o
  WHERE o.customer_id = c.id
);
IN: अधिक खर्च करने वाले। EXISTS: सक्रिय ग्राहक।

FROM में, एक सबक्वेरी किसी अस्थायी टेबल की तरह व्यवहार करती है, जिसे डिराइव्ड टेबल (व्युत्पन्न टेबल) कहते हैं, और उसे एक एलियास देना ज़रूरी है। यह दो चरणों में एग्रीगेट करने का पारंपरिक टूल है: पहले प्रति ग्राहक एक कुल, फिर उन कुलों का औसत।

SQL
SELECT ROUND(AVG(t.total), 2) AS avg_basket
FROM (
  SELECT customer_id, SUM(amount) AS total
  FROM orders
  GROUP BY customer_id
) AS t;
प्रति सक्रिय ग्राहक औसत कुल बास्केट: 158.43।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. amount > (...) में उपयोग की गई सबक्वेरी को कितनी वैल्यू लौटानी चाहिए?
    • ठीक एक
    • बाहरी टेबल की प्रति पंक्ति एक
    • जितनी वह चाहे उतनी
  2. IN की तुलना में EXISTS का मुख्य लाभ क्या है?
    • यह कई कॉलम लौटा सकता है
    • यह पूरे सेट को बनाए बिना पहली मिली पंक्ति पर रुक जाता है
    • यह बिना सबक्वेरी के काम करता है
  3. FROM में रखी गई सबक्वेरी को हर जगह पोर्टेबल होने के लिए हमेशा क्या रखना चाहिए?
    • एक एलियास, जैसे AS t
    • एक ORDER BY क्लॉज़
    • एक आंतरिक अर्धविराम