CodeGym /কোর্স /SQL & Hibernate /সাবকোয়ারি

সাবকোয়ারি

SQL & Hibernate
লেভেল 3 , পাঠ 4
বিদ্যমান

এসকিউএল-এ নেস্টেড প্রশ্ন

এসকিউএল ল্যাঙ্গুয়েজ আপনাকে একটি কোয়েরি অন্য কোয়েরির মধ্যে নেস্ট করতে দেয়। এটি একটি খুব বড় ক্যোয়ারী লেখা সম্ভব করে যা বড় এবং জটিল কিছু করবে, যদিও কোডটির পঠনযোগ্যতা অনেক কমে গেছে।

সাবকোয়েরি দ্বারা কতগুলি মান ফেরত দেওয়া হয় তার উপর নির্ভর করে, যেখানে সেগুলি প্রয়োগ করা যেতে পারে সেগুলি পরিবর্তিত হয়। মোট তিনটি বিকল্প আছে:

  • সাবকোয়েরি একটি একক মান (একটি কলাম এবং একটি সারি) প্রদান করে।
  • সাবকোয়েরি মানগুলির একটি তালিকা প্রদান করে (একটি কলাম সহ একটি টেবিল)।
  • সাবকোয়েরি একটি টেবিল প্রদান করে (অনেক কলাম, যেকোনো সংখ্যক সারি)।

আসুন প্রতিটি ক্ষেত্রে একটি উদাহরণ তাকান.

স্কেলার ফলাফল সহ সাবকুয়েরি

আসুন কর্মচারী টেবিল থেকে আমাদের সমস্ত কর্মচারীদের একটি তালিকা খুঁজে বের করি যাদের বেতন কোম্পানির গড় থেকে বেশি। আমরা কিভাবে এটা করতে পারি?

আমরা কর্মীদের গড় বেতনের সাথে তুলনা করে সহজেই ফিল্টার করতে পারি যদি আমরা এটি আগে থেকে জানি। একই সময়ে, আমরা ইতিমধ্যে একটি প্রশ্ন লিখেছি যা আমাদের কোম্পানির কর্মচারীদের গড় বেতন গণনা করতে দেয়। আসুন এটি মনে রাখা যাক:

SELECT AVG(salary) FROM employee 

তারপর মাইএসকিউএল আমাদের মানটি ফেরত দিয়েছে: 76833.3333

এখন কীভাবে সমস্ত কর্মচারীদের তালিকা খুঁজে পাবেন যাদের বেতন গড়ের উপরে? এটিও খুব সহজ:

 SELECT * FROM employee 
   WHERE salary > 76833.3333 

এই প্রশ্নের ফলাফল হবে:

আইডি নাম পেশা বেতন
1 ইভানভ ইভান প্রোগ্রামার 100000
2 পেট্রোভ পেট্র প্রোগ্রামার 80000
4 রাবিনোভিচ মইশা পরিচালক 200000

এবং এখন আমরা 76833 মানের পরিবর্তে প্রথম অনুরোধটি প্রতিস্থাপন করে উভয় অনুরোধগুলিকে একত্রিত করি:

   SELECT * FROM employee 
   WHERE salary > (SELECT AVG(salary) FROM employee) 

এই প্রশ্নের ফলাফল একই হবে:

আইডি নাম পেশা বেতন
1 ইভানভ ইভান প্রোগ্রামার 100000
2 পেট্রোভ পেট্র প্রোগ্রামার 80000
4 রাবিনোভিচ মইশা পরিচালক 200000

মান তালিকা সহ সাবকোয়েরি

আপনার কি মনে আছে একবার আমাদের একটি টাস্ক ছিল - একটি টেবিল থেকে এমন সমস্ত রেকর্ড খুঁজে বের করা যার জন্য অন্য থেকে কোনও সংশ্লিষ্ট রেকর্ড নেই?

এই ছবিটিও ছিল:

যদি আমি ভুল না করি তবে কাজটি নিম্নরূপ: কর্মচারী টেবিল থেকে সমস্ত কর্মচারীদের একটি তালিকা প্রদর্শন করুন যার জন্য টাস্ক টেবিলে কোন কাজ নেই

আসুন দুটি ধাপে একটি সমাধান খুঁজে বের করা যাক।

প্রথমে, আসুন একটি ক্যোয়ারী লিখি যা টাস্ক টেবিলে টাস্ক আছে এমন সমস্ত কর্মচারীদের আইডি ফেরত দেবে। শুধু দুটি জিনিস মনে রাখবেন:

  • সদৃশ অপসারণ করুন - DISTINCT কীওয়ার্ড ব্যবহার করুন।
  • ফলাফল থেকে NULL মানগুলি সরান।
SELECT DISTINCT employee_id FROM task 
   WHERE employee_id IS NOT NULL

এবং এখানে আমরা এই ধরনের অনুরোধের একটি সুন্দর ফলাফল পেয়েছি:

কর্মচারী আইডি
1
2
5
4
6

আসুন সাময়িকভাবে এটিকে সুবিধার জন্য একটি ক্রম হিসাবে লিখি: 1,2,5,4,6। এখন আসুন একটি দ্বিতীয় প্রশ্ন লিখি - কর্মচারী টেবিলে, যা কর্মচারীদের একটি তালিকা ফিরিয়ে দেবে যাদের আইডি প্রথম তালিকায় নেই:

SELECT * FROM employee  
WHERE id NOT IN (1,2,5,4,6)

এবং এই প্রশ্নের ফলাফল:

আইডি নাম পেশা বেতন বয়স তারিখ যোগ দিতে
3 ইভানভ সের্গেই পরীক্ষক 40000 ত্রিশ 2014-01-01

এবং এখন, আগের উদাহরণের মতো, আপনি আইডি তালিকার পরিবর্তে প্রথম অনুরোধের মূল অংশটি প্রতিস্থাপন করে উভয় অনুরোধকে একত্রিত করতে পারেন।

 SELECT * FROM employee 
   WHERE id NOT IN ( 
      	SELECT DISTINCT employee_id FROM task 
      	WHERE employee_id IS NOT NULL 
   )
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION