এটি একটি খুব ভাল প্রশ্ন, তাই আমি এই বিষয়টি নিয়ে আমার ব্লগে একটি খুব বিস্তারিত নিবন্ধ লেখার সিদ্ধান্ত নিয়েছি ।
ডাটাবেস টেবিল মডেল
আসুন ধরে নেওয়া যাক আমাদের আমাদের ডাটাবেসে নিম্নলিখিত দুটি সারণী রয়েছে যা একের সাথে একাধিক টেবিলের সম্পর্ক তৈরি করে।
student
টেবিল পিতা বা মাতা, এবংstudent_grade
শিশু টেবিল যেহেতু এটি একটি student_id পররাষ্ট্র কী কলাম ছাত্র টেবিলে আইডি প্রাথমিক কী কলাম উল্লেখ হয়েছে।
student table
নিম্নলিখিত দুটি রেকর্ড রয়েছে:
| id | first_name | last_name | admission_score |
|----|------------|-----------|-----------------|
| 1 | Alice | Smith | 8.95 |
| 2 | Bob | Johnson | 8.75 |
এবং, student_grade
টেবিলটি শিক্ষার্থীদের প্রাপ্ত গ্রেডগুলি সংরক্ষণ করে:
| id | class_name | grade | student_id |
|----|------------|-------|------------|
| 1 | Math | 10 | 1 |
| 2 | Math | 9.5 | 1 |
| 3 | Math | 9.75 | 1 |
| 4 | Science | 9.5 | 1 |
| 5 | Science | 9 | 1 |
| 6 | Science | 9.25 | 1 |
| 7 | Math | 8.5 | 2 |
| 8 | Math | 9.5 | 2 |
| 9 | Math | 9 | 2 |
| 10 | Science | 10 | 2 |
| 11 | Science | 9.4 | 2 |
এসকিউএল উপস্থিত রয়েছে
ধরা যাক আমরা ম্যাথ ক্লাসে 10 গ্রেড প্রাপ্ত সকল শিক্ষার্থী পেতে চাই।
আমরা যদি কেবলমাত্র শিক্ষার্থী শনাক্তকরণে আগ্রহী, তবে আমরা এই জাতীয় একটি কোয়েরি চালাতে পারি:
SELECT
student_grade.student_id
FROM
student_grade
WHERE
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
ORDER BY
student_grade.student_id
তবে, অ্যাপ্লিকেশনটি student
কেবল সনাক্তকারী নয়, একটির পুরো নামটি প্রদর্শন করতে আগ্রহী , সুতরাং আমাদের student
পাশাপাশি টেবিল থেকেও তথ্য প্রয়োজন ।
student
গণিতে একটি 10 গ্রেড রয়েছে এমন রেকর্ডগুলি ফিল্টার করার জন্য , আমরা এইগুলির মতো বিদ্যমান এসকিউএল অপারেটরটি ব্যবহার করতে পারি:
SELECT
id, first_name, last_name
FROM
student
WHERE EXISTS (
SELECT 1
FROM
student_grade
WHERE
student_grade.student_id = student.id AND
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
)
ORDER BY id
উপরের ক্যোয়ারীটি চালানোর সময়, আমরা দেখতে পাচ্ছি যে কেবলমাত্র অ্যালিস সারিটি নির্বাচিত হয়েছে:
| id | first_name | last_name |
|----|------------|-----------|
| 1 | Alice | Smith |
বাহ্যিক ক্যোয়ারী student
আমাদের ক্লায়েন্টটিতে ফিরে আসতে আগ্রহী সারি কলামগুলি নির্বাচন করে । যাইহোক, WHERE ধারাটি একটি সম্পর্কিত অভ্যন্তরীণ subquery সহ উপস্থিতি অপারেটরটি ব্যবহার করছে।
সাবকিউরিটি অন্তত একটি রেকর্ড প্রত্যাবর্তন করে এবং কোনও সারি নির্বাচন না করা হলে মিথ্যাটি উপস্থিত থাকলে উপস্থিতি অপারেটর সত্য বলে প্রত্যাবর্তন করে। ডাটাবেস ইঞ্জিনটিকে সাবকোরিটি পুরোপুরি চালাতে হবে না। যদি একটি একক রেকর্ডটি মিলে যায় তবে উপস্থিতি অপারেটরটি সত্য ফিরে আসে এবং সম্পর্কিত অন্যান্য ক্যোয়ারী সারিটি নির্বাচিত হয়।
অভ্যন্তরীণ সাবকোয়ারিটি পারস্পরিক সম্পর্কযুক্ত কারণ student_grade
টেবিলের ছাত্র_আইডি কলামটি বহিরাগত শিক্ষার্থী সারণীর আইডি কলামের সাথে মেলে।
এসকিউএল উপস্থিত নেই
আসুন আমরা বিবেচনা করি যে আমরা 9 টির চেয়ে কম গ্রেড নেই এমন সমস্ত শিক্ষার্থী নির্বাচন করতে চাই। এর জন্য আমরা নট অস্টিস্টস ব্যবহার করতে পারি, যা উপস্থিতি অপারেটরের যুক্তিকে উপেক্ষা করে।
অতএব, অন্তর্নিহিত সাবকিউরিটি যদি কোনও রেকর্ড না ফেরায় তবে অস্তিত্ব নেই অপারেটর সত্য বলে প্রত্যাবর্তন করে। তবে, যদি একটি একক রেকর্ডটি অভ্যন্তরীণ সাবকোয়্যারির সাথে মিলে যায় তবে উপস্থিত নেই অপারেটরটি মিথ্যা প্রত্যাবর্তন করবে এবং সাবকিউরি এক্সিকিউশন থামানো যাবে।
9 টিরও কম মানের সাথে কোনও শিক্ষার্থী_গ্রেডের সাথে সম্পর্কিত নয় এমন সমস্ত শিক্ষার্থীর রেকর্ডের সাথে মেলে, আমরা নিম্নলিখিত এসকিউএল কোয়েরিটি চালাতে পারি:
SELECT
id, first_name, last_name
FROM
student
WHERE NOT EXISTS (
SELECT 1
FROM
student_grade
WHERE
student_grade.student_id = student.id AND
student_grade.grade < 9
)
ORDER BY id
উপরের ক্যোয়ারীটি চালানোর সময়, আমরা দেখতে পাচ্ছি যে কেবলমাত্র অ্যালিস রেকর্ডটি মিলেছে:
| id | first_name | last_name |
|----|------------|-----------|
| 1 | Alice | Smith |
সুতরাং, এসকিউএল উপস্থিতি এবং না থাকা অপারেটরগুলি ব্যবহার করার সুবিধাটি হ'ল যতক্ষণ না কোনও মিলের রেকর্ড পাওয়া যায় ততক্ষণ অভ্যন্তরীণ সাবকোয়ারি এক্সিকিউশনটি থামানো যেতে পারে।