মডিউল পাঠ (4/4)
অন্যের ভিতরে একটি প্রশ্ন: সাবকোয়ারি
আপনি শিখেছেন কিভাবে নিষ্কাশন, ফিল্টার, গ্রুপ, যোগদান এবং রূপান্তর করতে হয়। সেখানে একটি শেষ মৌলিক ধারণা: অন্যের ভিতরে একটি প্রশ্ন রাখা। এগুলো হলো সাবকোয়ারি বলা হয় এবং সেগুলি হল সেই ধাপ যা আপনাকে প্রশ্নের উত্তর দিতে দেয় যেমন "কে গড়ের উপরে আয় করে?" বা "কোন বিভাগে কেউ আছে একটি প্রকল্পে বরাদ্দ করা হয়েছে?".
মৌলিক সিনট্যাক্স
একটি সাবকোয়েরি হল একটি SELECT বন্ধনীতে মোড়ানো, একটি একক জায়গায় ব্যবহৃত
মান বা অন্য প্রশ্নের মানগুলির একটি তালিকা:
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);ইঞ্জিনটি প্রথমে সাবকোয়েরি চালায় — SELECT AVG(salary) FROM employees
একটি সংখ্যা ফেরত দেয় — এবং তারপর সেই সংখ্যাটি বাইরের WHERE এ ব্যবহার করে
যেন আপনি এটি হাতে লিখেছিলেন। এটি অবিকল সুবিধা: আপনি করবেন
আগে থেকে গড় জানতে হবে না, এসকিউএল আপনার জন্য এটি গণনা করে।
তিনটি সবচেয়ে সাধারণ "প্রকার"
1. সাবকোয়েরি একটি একক মান প্রদান করে
উপরের উদাহরণ: সাবকোয়েরি এক সারি, এক কলাম তৈরি করে (যাকে বলা হয়
স্ক্যালার)। আপনি এটি =, >, < ইত্যাদির সাথে ব্যবহার করেন।
-- Employee with the highest salary:
SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);2. সাবকোয়েরি একটি তালিকা প্রদান করে
সাবকোয়েরি এক কলাম, অনেক সারি তৈরি করে। আপনি এটি দিয়ে ব্যবহার করুন
IN (...):
-- Departments that have at least one employee:
SELECT name
FROM departments
WHERE id IN (SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL);3. একটি "টেবিল" হিসাবে সাবকোয়েরি (FROM)
একটি সাবকোয়েরি FROM এ একটি টেবিলের স্থানও নিতে পারে৷ এটা দরকারী
প্রাক-গণনা সমষ্টি এবং তারপর ফিল্টার বা যোগদান করুন:
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM departments AS d
JOIN (SELECT department_id, AVG(salary) AS stipendio_medio
FROM employees
GROUP BY department_id) AS medie
ON d.id = medie.department_id
WHERE medie.stipendio_medio > 40000;সাবকোয়ারি বা যোগ দিন? কখন কোনটি ব্যবহার করবেন
প্রায়শই একই ফলাফল একটি JOIN বা একটি সাবকোয়েরির মাধ্যমে পাওয়া যেতে পারে।
অঙ্গুষ্ঠের নিয়ম:
- অন্য একটি বৈশিষ্ট্যের উপর ভিত্তি করে একটি টেবিলের সারি ফিল্টার করতে
("কর্মচারি যাদের বিভাগ..."),
IN (subquery)খুবই পাঠযোগ্য। - ফলাফলে একাধিক টেবিল থেকে কলাম একত্রিত করতে,
JOINব্যবহার করুন। - একটি সমষ্টি গণনা করতে এবং এটিকে থ্রেশহোল্ড হিসাবে ব্যবহার করতে ("উপরে গড়"), স্কেলার সাবকোয়েরি প্রাকৃতিক পছন্দ।
অনুশীলনে আপনি উভয়ই দেখতে পাবেন: এসকিউএল ইঞ্জিন প্রায়শই তাদের একইভাবে অপ্টিমাইজ করে উপায় সবচেয়ে ভাল পড়া ফর্ম চয়ন করুন.
চেষ্টা করে দেখুন
কোম্পানির গড় থেকে কঠোরভাবে বেশি উপার্জনকারী কর্মচারীদের প্রথম নাম (first_name), পদবী (last_name) এবং বেতন (বেতন) খুঁজুন। তিনটি কলাম।
ইঙ্গিত দেখান
প্রতিস্থাপন? সাবকোয়েরি সহ কর্মচারীদের থেকে এভিজি (বেতন) নির্বাচন করুন — এটি থ্রেশহোল্ড হিসাবে ব্যবহার করার জন্য একটি একক সংখ্যা প্রদান করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
এমন বিভাগের নাম (departments.name) তালিকাভুক্ত করুন যেখানে কমপক্ষে একজন কর্মচারী রয়েছে যার বেতন 50000-এর বেশি। IN-এর সাথে একটি সাবকুয়েরি ব্যবহার করুন। বর্ণানুক্রমিকভাবে অর্ডার করুন।
ইঙ্গিত দেখান
অভ্যন্তরীণ সাবকোয়েরি যে বিভাগের কর্মচারীদের বেতন > 50000 আছে তাদের আইডি প্রদান করে। তারপর বাইরের কোয়েরিতে WHERE id IN (...)।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ