বাইরের যোগদানের কারণ
যাইহোক, আপনার কি মনে আছে যখন আমরা আমাদের স্প্রেডশীটগুলিকে একত্রিত করেছিলাম এবং আমাদের অফিস পরিষ্কার করার কাজগুলি অদৃশ্য হয়ে গিয়েছিল কারণ এখনও কোনও ক্লিনার ছিল না?
আপনি যদি এই মত একটি প্রশ্ন চালান:
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 | জীবন উপভোগ করুন | (খালি) |
"ক্লিয়ার অফিস" টাস্কটি অদৃশ্য হয়ে যায় যদি আমরা কর্মীর টেবিলের সাথে কর্মীর টেবিলে কর্মীর_আইডি দ্বারা যোগদান করার চেষ্টা করি।
এই সমস্যা সমাধানের জন্য, JOIN অপারেটরে বিভিন্ন মডিফায়ার যোগ করা হয়েছে যা এই ধরনের অনাথ সারিগুলিকে অন্য টেবিলে জোড়া ছাড়াই সংরক্ষণ করার অনুমতি দেয়।
আমি আপনাকে JOIN অপারেটরের ক্লাসিক ফর্মের কথা মনে করিয়ে দিই:
table 1 JOIN table 2 ON
condition
আমরা SQL সার্ভারকে বলতে পারি যে বাম টেবিলের (টেবিল1) সমস্ত ডেটা যুক্ত করা টেবিলে উপস্থিত রয়েছে তা নিশ্চিত করতে। সঠিক ছকে তাদের জন্য জুড়ি না থাকলেও। এটি করার জন্য, আপনাকে কেবল লিখতে হবে:
table 1 LEFT JOIN table 2 ON condition
আপনি যদি চান যে যোগ করা টেবিলে ডান টেবিল থেকে সমস্ত সারি থাকে , তাহলে আপনাকে লিখতে হবে:
table 1 RIGHT JOIN table 2 ON
condition
আসুন একটি প্রশ্ন লিখি যা সমস্ত কাজ এবং কর্মচারীদের একত্রিত করবে যাতে নির্বাহক ছাড়া কাজগুলি হারিয়ে না যায়। এটি করার জন্য, একটি প্রশ্ন লিখুন:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
এবং এই প্রশ্নের ফলাফল:
আইডি | নাম | পেশা | বেতন | বয়স | তারিখ যোগ দিতে | আইডি | emploee_id | নাম |
---|---|---|---|---|---|---|---|---|
1 | ইভানভ ইভান | প্রোগ্রামার | 100000 | 25 | 2012-06-30 | 1 | 1 | ফ্রন্টএন্ডে একটি বাগ ঠিক করুন |
2 | পেট্রোভ পেট্র | প্রোগ্রামার | 80000 | 23 | 2013-08-12 | 2 | 2 | ব্যাকএন্ডে একটি বাগ ঠিক করুন |
4 | রাবিনোভিচ মইশা | পরিচালক | 200000 | 35 | 2015-05-12 | 7 | 4 | জীবন উপভোগ করুন |
5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 2015-10-10 | 3 | 5 | কফি কিনুন |
5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 2015-10-10 | 4 | 5 | কফি কিনুন |
5 | কিরিয়েনকো আনাস্তাসিয়া | অফিস ব্যবস্থাপক | 40000 | 25 | 2015-10-10 | 5 | 5 | কফি কিনুন |
6 | ভাস্কা | বিড়াল | 1000 | 3 | 2018-11-11 | 8 | 6 | জীবন উপভোগ করুন |
(খালি) | (খালি) | (খালি) | (খালি) | (খালি) | (খালি) | 6 | (খালি) | অফিস পরিষ্কার করুন |
আমাদের টেবিলে আরেকটি সারি যোগ করা হয়েছে, এবং মজার বিষয় হল, এতে প্রচুর NULL মান রয়েছে। কর্মচারী টেবিল থেকে নেওয়া সমস্ত ডেটা NULL হিসাবে প্রদর্শিত হয়, যেহেতু "ক্লিন অফিস" কাজের জন্য কর্মচারী টেবিল থেকে কোনও নির্বাহক ছিল না।
যোগ দিন প্রকার
মোট 4 ধরনের JOIN আছে। সেগুলি নীচের সারণীতে উপস্থাপন করা হয়েছে:
সংক্ষিপ্ত এন্ট্রি | দীর্ঘ প্রবেশ | ব্যাখ্যা | |
---|---|---|---|
1 | যোগ দিন | ভেতরের যোগ দিতে | শুধুমাত্র রেকর্ড যেগুলি সারণি A এবং B তে রয়েছে |
2 | বাম যোগদান | বাম বাইরে যোগদান | টেবিল A থেকে একটি জোড়া ছাড়া সমস্ত সারি হতে হবে |
3 | ডান যোগদান | ডান বাইরে যোগদান | টেবিল B থেকে একটি জোড়া ছাড়া সমস্ত সারি হতে হবে |
4 | বাইরের যোগদান | সম্পূর্ণ বাইরে যোগদান | টেবিল A এবং B থেকে বেস জোড়ার সমস্ত সারি হতে হবে |
সরলতার জন্য, যদি আমরা টেবিলগুলিকে সেট হিসাবে উপস্থাপন করি, তাহলে JOIN একটি ছবি হিসাবে প্রদর্শিত হতে পারে:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
সেট ইন্টারসেকশন মানে হল যে একটি টেবিলের জন্য অন্য টেবিল থেকে একটি সংশ্লিষ্ট রেকর্ড আছে যা এটি উল্লেখ করে।
সাক্ষাৎকার থেকে প্রশ্ন
কখনও কখনও নবীন প্রোগ্রামারদের একটি সাক্ষাত্কারে একটি খুব সাধারণ প্রশ্ন দিয়ে বোমাবাজি করা হয়। আমাদের টেবিল দেওয়া, এটি নিম্নরূপ প্রণয়ন করা যেতে পারে:
"একটি প্রশ্ন লিখুন যা সমস্ত কর্মচারীদের একটি তালিকা প্রদর্শন করবে যাদের জন্য কোন কাজ নেই ।" প্রথমে, আসুন এই প্রশ্নটি একটু রিফ্রেস করার চেষ্টা করি: "একটি প্রশ্ন লিখুন যা কর্মচারী টেবিলের সমস্ত কর্মচারীর একটি তালিকা প্রদর্শন করবে যার জন্য টাস্ক টেবিলে কোন কাজ নেই। " আমাদের এই সেটটি পেতে হবে:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
এই সমস্যাটি সমাধান করার অনেক উপায় আছে, কিন্তু আমি সবচেয়ে সহজটি দিয়ে শুরু করব: প্রথমে, আপনি একটি বাম যোগদানের মাধ্যমে আমাদের টেবিলে যোগ দিতে পারেন, এবং তারপরে যেখানে অনুপস্থিত ডেটা NULL দিয়ে প্যাড করা হয়েছিল সেই সমস্ত সারিগুলি বাদ দিতে WHERE ব্যবহার করুন৷
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
এবং এই প্রশ্নের ফলাফল:
আইডি | নাম | পেশা | বেতন | বয়স | তারিখ যোগ দিতে | আইডি | emploee_id | নাম |
---|---|---|---|---|---|---|---|---|
3 | ইভানভ সের্গেই | পরীক্ষক | 40000 | ত্রিশ | 2014-01-01 | (খালি) | (খালি) | (খালি) |
এই সমাধানের একমাত্র অসুবিধা হল এখানে টেবিলের সারিগুলিতে NULL রয়েছে এবং শর্ত অনুসারে আমাদের কর্মীদের একটি তালিকা প্রদর্শন করতে হবে।
এটি করার জন্য, আপনাকে হয় SELECT এ কর্মচারী টেবিলের প্রয়োজনীয় কলামগুলি তালিকাভুক্ত করতে হবে, অথবা আপনার যদি সেগুলি প্রদর্শন করার প্রয়োজন হয় তবে আপনি নিম্নলিখিত নির্মাণ লিখতে পারেন:
SELECT e.* FROM employee e, task t
সম্পূর্ণ অনুরোধ এই মত দেখাবে:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
এই প্রশ্নের ফলাফল:
আইডি | নাম | পেশা | বেতন | বয়স | তারিখ যোগ দিতে |
---|---|---|---|---|---|
3 | ইভানভ সের্গেই | পরীক্ষক | 40000 | ত্রিশ | 2014-01-01 |
হোমওয়ার্কের জন্য বাকি পদ্ধতিগুলি আপনার হাতে ছেড়ে দেওয়া হয়েছে। আমি আপনাকে তাদের খুঁজে পাওয়ার আনন্দ থেকে বঞ্চিত করতে চাই না।