A ქვეშეკითხვა არის query, რომელიც ჩასმულია სხვა query-ში — გამოიყენება WHERE, FROM, SELECT, ან EXISTS-თან. ის საშუალებას გაძლევთ გამოიყენოთ ერთი query-ის შედეგი სხვაში, რაც ხელმისაწვდომელს ხდის რთულ ფილტრაციას და გამოთვლებს.
A ქვეშეკითხვა არის query, რომელიც ჩასმულია სხვა query-ში — გამოიყენება WHERE, FROM, SELECT, ან EXISTS-თან. ის საშუალებას გაძლევთ გამოიყენოთ ერთი query-ის შედეგი სხვაში, რაც ხელმისაწვდომელს ხდის რთულ ფილტრაციას და გამოთვლებს.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
ქვეშეკითხვა WHERE-ში უზრუნველყოფს მნიშვნელობებს ფილტრაციისთვის — სიას (IN-თან) ან ერთეულ მნიშვნელობას (შედარების ოპერატორებთან).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
დაკავშირებული ქვეშეკითხვა მიმართავს გარე query-ს — ის გაეშვება ერთხელ გარე მწკრივის თითოეულისთვის (შესაძლოა უფრო ნელი). დაუკავშირებელი ქვეშეკითხვა გაეშვება ერთხელ.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS შემოწმებს, აბრუნებს თუ არა ქვეშეკითხვამ რომელიმე მწკრივს — ხშირად უფრო ეფექტიანია IN-ზე არსებობის შემოწმებისთვის (შეიძლება გაჩერდეს პირველი შესატყვისზე).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
ქვეშეკითხვები არის SQL-ის მნიშვნელოვანი ტექნიკა რთული query-სთვის — ერთი query-ის შედეგის გამოყენება სხვაში ხელმისაწვდომელს ხდის ფილტრაციას და გამოთვლებს, რომელთა გამოხატვა მარტივი query-ებით შეუძლებელია, ამიტომ მათი გაგება ღირებული არის რეალური query-ების წერისთვის.
სხვადსხვა ფორმების ცოდნა — ქვეშეკითხვები WHERE-ში (ფილტრაცია სიით IN-თან ან ერთეულ მნიშვნელობით შედარებებთან), დაკავშირებული ქვეშეკითხვები (გამოთვლიან გარე query-ს, გაეშვება მწკრივის მიხედვით), EXISTS (ეფექტური არსებობის შემოწმება), და ქვეშეკითხვები FROM-ში (მიღებული ცხრილები) — მოიცავს საერთო შაბლონებს რთული ლოგიკის გამოსახატავად.
დაკავშირებული და დაუკავშირებელი ქვეშეკითხვების განსხვავების გაგება მნიშვნელოვანია შესრულების თვალსაზრისით (დაკავშირებული ქვეშეკითხვები გაეშვება ერთხელ გარე მწკრივის თითოეულისთვის და შეიძლება ნელი იყოს).
თანაბრად ღირებული არის ურთიერთობის ცოდნა JOIN-ებთან და CTE-ებთან: ბევრი ქვეშეკითხვა შეიძლება გადაიწეროს JOIN-ების სახით (ხშირად უფრო ეფექტიანი და მკითხველი) ან CTE-ების სახით (მეტი სიმარტივე რთული შემთხვევებისთვის), ამიტომ გაგება, რა დროს გამოიყენოთ თითოეული — ქვეშეკითხვები ფილტრაციის/აგრეგაციის სიცხადის জন্য, JOIN-ები მონაცემთა შესაერთებლად — პრაქტიკული უნარი არის.
ვინაიდან რეალური query-ებს ხშირად სჭირდებათ ჩასმა (ფილტრაცია აგრეგირებული შედეგებით, არსებობის შემოწმება, შედარება გამოთვლილ მნიშვნელობებთან), და ვინაიდან ქვეშეკითხვების, მათი შესრულების მახასიათებლების (განსაკუთრებით დაკავშირებული) და მათი ურთიერთობის გაგება JOIN-ებთან/CTE-ებთან მნიშვნელოვანია ეფექტიანი, რთული query-ების წერისთვის, ქვეშეკითხვების დაუფლება ღირებული, ხშირად გამოყენებული ცოდნა არის SQL-ის ფუნდამენტური მიღმა და საინტერვიუო თემა, რომელიც აჩვენებს რთული მონაცემთა მოთხოვნილების გამოხატვის უნარს.