নির্ভরশীল টেবিল
এখন আমাদের প্রশ্ন একটু জটিল করা যাক. আমাদের কর্মীদের জন্য টাস্ক সহ আমাদের ডাটাবেসে একটি নতুন টাস্ক টেবিল যোগ করা যাক। এবং আসুন দেখি এতে কী কী এন্ট্রি রয়েছে:
SELECT * FROM task
এই ধরনের অনুরোধের ফলাফল:
| আইডি | emploee_id | নাম | শেষ তারিখ |
|---|---|---|---|
| 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 | (খালি) | অফিস পরিষ্কার করুন | (খালি) |
| 7 | 4 | জীবন উপভোগ করুন | (খালি) |
| 8 | 6 | জীবন উপভোগ করুন | (খালি) |
এই টেবিলে মাত্র 4টি কলাম রয়েছে:
- id — অনন্য টাস্ক নম্বর (এবং টেবিলের সারি);
- কর্মচারী_আইডি — কর্মচারী টেবিল থেকে কর্মচারীর আইডি যাকে কাজটি অর্পণ করা হয়েছে;
- নাম - নাম এবং কাজের বিবরণ;
- সময়সীমা - যে সময়টি কাজটি শেষ করতে হবে।
কয়েকটি সূক্ষ্মতার দিকে মনোযোগ দিন। টাস্ক N6-এর কোনো কর্মচারী_আইডি নেই, আমাদের কোনো ক্লিনার নেই। টাস্ক আছে, কিন্তু পারফর্মার নেই। এটা ঘটে।
এছাড়াও, 6-9 টাস্কের একটি নির্দিষ্ট সময়সীমা নেই। এটি ঘটে যখন একটি কাজ নিয়মিত এবং অবিচ্ছিন্নভাবে করা উচিত। উদাহরণস্বরূপ, অফিসটি প্রতিদিন পরিষ্কার করা দরকার, তবে আপনাকে প্রতিদিন জীবন উপভোগ করতে হবে :)
যদি একটি টেবিল অন্য টেবিল থেকে আইডি ব্যবহার করে, তাহলে এই ধরনের টেবিলটিকে নির্ভরশীল বলা হয় ।
একাধিক টেবিলের বিরুদ্ধে প্রশ্ন
এখানে আমরা টাস্ক টেবিলে দেখতে পাচ্ছি যে দুটি কাজ রয়েছে "জীবন উপভোগ করা"। আমরা কিভাবে জানব এই ভাগ্যবান কারা?
এটি করার জন্য, এসকিউএল-এ, আপনি একবারে দুটি টেবিলে একটি প্রশ্ন চালাতে পারেন। সাধারণভাবে, এসকিউএল-এ, আপনি একই সময়ে যেকোনো সংখ্যক টেবিলের জন্য প্রশ্ন করতে পারেন। এই ধরনের অনুরোধের জন্য সাধারণ বিন্যাস হল:
SELECT columns
FROM Table 1, table 2, tableN
গুরুত্বপূর্ণ ! আপনি যদি একই সময়ে বেশ কয়েকটি টেবিলে একটি প্রশ্ন লেখেন, তাহলে ফলস্বরূপ আপনি টেবিলের সারির তথাকথিত কার্টেসিয়ান পণ্যটি পাবেন। প্রথম টেবিল থেকে প্রতিটি সারি দ্বিতীয় টেবিল থেকে প্রতিটি সারিতে আঠালো হবে, এবং তাই।
অর্থাৎ, আপনার যদি প্রথম টেবিলে 5টি সারি এবং দ্বিতীয়টিতে 10টি সারি থাকে, তাহলে আপনার মোট 50টি সারি থাকবে। জাভাতে, এই ক্যোয়ারীটি এইরকম দেখতে হবে:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
আসুন একবারে দুটি টেবিলে আমাদের ক্যোয়ারী লিখি এবং দেখি কি হয়:
SELECT * FROM employee, task
এবং এই প্রশ্নের ফলাফল:
| আইডি | নাম | পেশা | বেতন | বয়স | আইডি | কর্মচারী | _id | নাম | শেষ তারিখ |
|---|---|---|---|---|---|---|---|---|---|
| 1 | ইভানভ ইভান | প্রোগ্রামার | 100000 | 25 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 2 | পেট্রোভ পেট্র | প্রোগ্রামার | 80000 | 23 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 3 | ইভানভ সের্গেই | পরীক্ষক | 40000 | ত্রিশ | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 4 | রাবিনোভিচ মইশা | পরিচালক | 200000 | 35 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 6 | ভাস্কা | বিড়াল | 1000 | 3 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 | |
| 1 | ইভানভ ইভান | প্রোগ্রামার | 100000 | 25 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 | |
| 2 | পেট্রোভ পেট্র | প্রোগ্রামার | 80000 | 23 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 | |
| 3 | ইভানভ সের্গেই | পরীক্ষক | 40000 | ত্রিশ | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 | |
| 4 | রাবিনোভিচ মইশা | পরিচালক | 200000 | 35 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 | |
| 5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 |
আমাদের মোট 48টি রেজাল্ট লাইন আছে, কিন্তু এখানে আমি শুধুমাত্র 11টি দিয়েছি। অন্যথায়, সেখানে পর্যাপ্ত জায়গা থাকবে না।
তিনটি বিষয়ে মনোযোগ দিন:
- একই নামের কলাম: id । এটি কর্মচারী টেবিল থেকে আইডি এবং টাস্ক টেবিল থেকে আইডি ।
- প্রতিটি টেবিলের সারি পুনরাবৃত্তি হয়. বাম কলামে, ID 6 এর পরে আবার ID = 1 আছে।
- আমাদের ননসেন্স সারি রয়েছে যেখানে, উদাহরণস্বরূপ, আইডি (কর্মচারী টেবিল থেকে) 6 এবং একই সারিতে কর্মচারী_আইডি 1।
অর্থহীন লাইন অপসারণ
আমাদের ফলাফল সারণিতে অনেকগুলি সারি রয়েছে , যা দুটি টেবিলের কর্মচারী এবং কার্যের সমস্ত সারিগুলির কার্টেসিয়ান গুণফল ।
যৌক্তিকভাবে, যদি সারি employee_id 3 হয়, তাহলে এটি শুধুমাত্র কর্মচারী টেবিল থেকে সারিতে আটকে থাকা উচিত যেখানে id 3। আসুন WHERE-এর সাথে এই ভুল বোঝাবুঝি দূর করার চেষ্টা করি।
এর মত একটি প্রশ্ন লিখুন:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
এবং এই প্রশ্নের ফলাফল:
| আইডি | নাম | পেশা | বেতন | বয়স | আইডি | emploee_id | নাম | শেষ তারিখ |
|---|---|---|---|---|---|---|---|---|
| 1 | ইভানভ ইভান | প্রোগ্রামার | 100000 | 25 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন | 2022-06-01 |
| 2 | পেট্রোভ পেট্র | প্রোগ্রামার | 80000 | 23 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন | 2022-06-15 |
| 4 | রাবিনোভিচ মইশা | পরিচালক | 200000 | 35 | 7 | 4 | জীবন উপভোগ করুন | (খালি) |
| 5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 3 | 5 | কফি কিনুন | 2022-07-01 |
| 5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 4 | 5 | কফি কিনুন | 2022-08-01 |
| 5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 5 | 5 | কফি কিনবে | 2022-09-01 |
| 6 | ভাস্কা | বিড়াল | 1000 | 3 | 8 | 6 | জীবন উপভোগ করুন | (খালি) |
ভাল খবর হল যে অর্থহীন লাইনগুলি অদৃশ্য হয়ে গেছে: প্রথম কলামের আইডি সর্বদা কর্মীর_আইডির সমান।
দুঃসংবাদটি হল যে কাজগুলি যা কাউকে অর্পণ করা হয়নি, যেমন অফিস পরিষ্কার করা, চলে গেছে। তাদের কর্মচারী_আইডি ছিল NULL, তাই WHERE করার পরে তাদের বাতিল করা হয়েছে।
GO TO FULL VERSION