সাবকোয়েরি একটি টেবিল প্রদান করে

এবং অবশেষে, তৃতীয় বিকল্পটি হল যখন সাবকোয়েরি পুরো টেবিলটি ফেরত দেয়। এটি সবচেয়ে সাধারণ বিকল্প।

খুব প্রায়ই এমন পরিস্থিতি থাকে যখন আমরা একটি নির্দিষ্ট টেবিলকে একটু পরিবর্তন করতে চাই। এবং শুধুমাত্র তখনই যোগ দিন (JOIN ON অপারেটর ব্যবহার করে) অন্যটির সাথে সংশোধন করা টেবিলটি।

আসুন সবচেয়ে সহজ ক্ষেত্রে শুরু করা যাক, যেখানে আমরা একটি JOIN সহ দুটি টেবিলে যোগদান করেছি:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

এবং আপনি সম্ভবত মনে রাখবেন, টাস্ক টেবিলে এমন কিছু কাজ রয়েছে যা কাউকে বরাদ্দ করা হয়নি: employee_id হল NULL

আসুন একটি সংশোধিত টেবিল তৈরি করি , যেখানে আমরা পরিচালককে সমস্ত ঝুলন্ত কাজগুলি অর্পণ করি (তার আইডি = 4)।

এটি করার জন্য, আমরা IFNULL() ফাংশন ব্যবহার করি :

SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 

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

আইডি কর্মচারী আইডি নাম শেষ তারিখ
1 1 ফ্রন্টএন্ডে একটি বাগ ঠিক করুন 2022-06-01
2 2 ব্যাকএন্ডে একটি বাগ ঠিক করুন 2022-06-15
3 5 কফি কিনুন 2022-07-01
4 5 কফি কিনুন 2022-08-01
5 5 কফি কিনুন 2022-09-01
6 4 অফিস পরিষ্কার করুন (খালি)
7 4 জীবন উপভোগ করুন (খালি)
8 6 জীবন উপভোগ করুন (খালি)

সংশোধিত ঘরটি লাল রঙে চিহ্নিত করা হয়েছে।

এখন আমাদের সংশোধিত টেবিলটি ক্যোয়ারীতে প্রতিস্থাপন করা যাক:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

টাস্ক টেবিলের পরিবর্তে ।

এই ধরনের অনুরোধ এই মত কিছু দেখতে হবে:

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
 	FROM task 
) t ON e.id = t.emploee_id

টাস্ক শব্দের পরিবর্তে , আমরা বন্ধনী লিখেছি এবং তাদের মধ্যে অনুরোধের অংশটি রেখেছি।

যাইহোক, নেস্টেড প্রশ্নের জন্য উপনাম টি (উনাম) খুব দরকারী ছিল। একটি নেস্টেড ক্যোয়ারী, একটি টেবিলের বিপরীতে, এর নিজস্ব নাম নেই, তাই উপনামটি স্থানের বাইরে।

এবং এখানে এই ধরনের একটি প্রশ্নের ফলাফল:

আইডি নাম পেশা বেতন বয়স তারিখ যোগ দিতে আইডি কর্মচারী আইডি নাম
1 ইভানভ ইভান প্রোগ্রামার 100000 25 2012-06-30 1 1 ফ্রন্টএন্ডে একটি বাগ ঠিক করুন
2 পেট্রোভ পেট্র প্রোগ্রামার 80000 23 2013-08-12 2 2 ব্যাকএন্ডে একটি বাগ ঠিক করুন
4 রাবিনোভিচ মইশা পরিচালক 200000 35 2015-05-12 6 4 অফিস পরিষ্কার করুন
4 রাবিনোভিচ মইশা পরিচালক 200000 35 2015-05-12 7 4 জীবন উপভোগ করুন
5 কিরিয়েনকো আনাস্তাসিয়া অফিস ব্যবস্থাপক 40000 25 2015-10-10 4 5 কফি কিনুন
5 কিরিয়েনকো আনাস্তাসিয়া অফিস ব্যবস্থাপক 40000 25 2015-10-10 5 5 কফি কিনুন
5 কিরিয়েনকো আনাস্তাসিয়া অফিস ব্যবস্থাপক 40000 25 2015-10-10 3 5 কফি কিনুন
6 ভাস্কা বিড়াল 1000 3 2018-11-11 8 6 জীবন উপভোগ করুন

আমাদের পরিচালকের "অফিস পরিষ্কার করার" কাজ রয়েছে, আমি মনে করি তিনি দ্রুত কাউকে এটি অর্পণ করার জন্য খুঁজে পাবেন :) উইথ অপারেটর ব্যবহার করে

যাইহোক, MySQL এর সংস্করণ 8 দিয়ে শুরু করে, আপনাকে আর আপনার সমস্ত সাবকোয়ারিগুলিকে চূড়ান্ত ক্যোয়ারীতে রাখতে হবে না। তারা আলাদাভাবে সঞ্চালিত করা যেতে পারে। এর জন্য WITH স্টেটমেন্ট ব্যবহার করা হয় ।

এটি আপনাকে একটি ভার্চুয়াল টেবিল (নামযুক্ত ক্যোয়ারী) তৈরি করতে দেয় এবং এর চেহারাটি একটি টেমপ্লেট দ্বারা দেওয়া হয়:

WITH Name AS (request) 

অনেক সময় আপনার সাবকোয়েরিতে নামবিহীন কলাম থাকে, যেমন COUNT(*), যার জন্য আপনি একটি অনন্য নাম বরাদ্দ করেননি। এই ক্ষেত্রে, উইথ স্টেটমেন্টে সাবকোয়েরির জন্য নতুন কলামের নাম নির্দিষ্ট করার বিকল্প রয়েছে।

এর দ্বিতীয় ফর্মটি টেমপ্লেট দ্বারা দেওয়া হয়েছে:

WITH Name(column1, column2, …) AS (request) 

আপনি যত খুশি ভার্চুয়াল টেবিল (নামযুক্ত প্রশ্ন) ব্যবহার করতে পারেন এবং সেগুলিতে একে অপরকে উল্লেখ করতে পারেন। আপনার অনুরোধের সাধারণ ফর্মটি এরকম কিছু থাকবে:

WITH name1 AS (request1),  
       	name2 AS (request2), 
       	name3 AS (request3) 
SELECT * FROM name1 JOIN name2 ON

এখন আমাদের ভীতিকর প্রশ্ন নেওয়া যাক:

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline 
 	FROM task 
) t ON e.id = t.emploee_id  

এবং WITH বিবৃতি ব্যবহার করে এটি পুনরায় লিখুন:

WITH task2(id, employee_id, name, deadline) 
   AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id

অথবা আপনি কলামের নাম ছাড়াই করতে পারেন, কিন্তু তারপর আপনাকে IFNULL() ফাংশনের জন্য একটি উপনাম নির্দিষ্ট করতে হবে:

WITH task2 AS ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 
) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id