किसी समुच्चय से तुलना करने, किसी सेट पर फ़िल्टर करने या अस्तित्व की जाँच करने के लिए एक क्वेरी को दूसरी के भीतर नेस्ट करें।
इस पाठ को Kodokon में खोलेंएक सबक्वेरी वह क्वेरी है जिसे किसी दूसरी क्वेरी के भीतर कोष्ठकों में रखा जाता है। एक ही कथन में यह "औसत से ऊपर के ऑर्डर" या "कम से कम एक ऑर्डर वाले ग्राहक" जैसे प्रश्नों का उत्तर देती है। शुरू करने से पहले इस स्क्रिप्ट को sqliteonline.com या sqlite3 में चलाएँ।
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 में वर्जित है।
SELECT id, customer_id, amount
FROM orders
WHERE amount > (
SELECT AVG(amount) FROM orders
);IN किसी कॉलम की तुलना सबक्वेरी द्वारा लौटाई गई वैल्यू के सेट से करता है। EXISTS यह जाँचता है कि सहसंबंधित (correlated) सबक्वेरी (यह c.id का संदर्भ देती है, जो बाहरी क्वेरी का एक कॉलम है) कम से कम एक पंक्ति लौटाती है या नहीं: जैसे ही पहला मिलान मिलता है, इंजन रुक जाता है।
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
);FROM में, एक सबक्वेरी किसी अस्थायी टेबल की तरह व्यवहार करती है, जिसे डिराइव्ड टेबल (व्युत्पन्न टेबल) कहते हैं, और उसे एक एलियास देना ज़रूरी है। यह दो चरणों में एग्रीगेट करने का पारंपरिक टूल है: पहले प्रति ग्राहक एक कुल, फिर उन कुलों का औसत।
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;