MySQL NOT IN ক্লজ ব্যাখ্যা: সিনট্যাক্স, NULL সমস্যাসমূহ, পারফরম্যান্স ও সেরা অনুশীলন

目次

১. MySQL NOT IN ক্লজ কী? — ডেটা বাদ দেওয়া আরও কার্যকর করা

MySQL-এ ডেটাবেস নিয়ে কাজ করার সময়, এমন অনেক পরিস্থিতি থাকে যেখানে আপনাকে নির্দিষ্ট মান বা শর্ত “বহির্ভূত” করে ডেটা পুনরুদ্ধার করতে হয়। উদাহরণস্বরূপ, আপনি যদি সব ব্যবহারকারীর তালিকা দেখাতে চান তবে যারা আনসাবস্ক্রাইব করেছে তাদের বাদ দিতে চাইতে পারেন, অথবা ব্ল্যাকলিস্টে থাকা আইডিগুলো বাদ দিয়ে ডেটা একত্রিত করতে পারেন। এই ধরনের পরিস্থিতি ব্যবসা ও ডেভেলপমেন্ট পরিবেশে প্রায়ই দেখা যায়। এটাই NOT IN ক্লজকে অত্যন্ত উপযোগী করে তোলে।

NOT IN ক্লজ একটি শক্তিশালী SQL শর্ত যা আপনাকে সহজে শুধুমাত্র সেই ডেটা বের করতে সাহায্য করে যা নির্দিষ্ট মান বা সাবকোয়েরির ফলাফলের সাথে মেলে না। একটি তালিকা ব্যবহার করে সরল বাদ দেওয়া ছাড়াও, ডাইনামিক সাবকোয়েরির সঙ্গে যুক্ত করলে বিভিন্ন ধরনের বাদ দেওয়ার প্যাটার্ন তৈরি করা যায়।

তবে, কীভাবে ব্যবহার করা হয় তার ওপর নির্ভর করে NOT IN-এর কিছু সতর্কতা ও সম্ভাব্য সমস্যাও থাকে। বিশেষ করে, NULL মানের সঙ্গে যুক্ত হলে এর আচরণ, বড় ডেটাবেসে পারফরম্যান্স সমস্যা, এবং NOT EXISTS এর সঙ্গে পার্থক্য—all এই বিষয়গুলো বাস্তবিক স্তরে বুঝতে গুরুত্বপূর্ণ।

এই প্রবন্ধে আমরা MySQL NOT IN ক্লজকে সম্পূর্ণভাবে ব্যাখ্যা করব—মৌলিক থেকে উন্নত ব্যবহার পর্যন্ত—সতর্কতা ও বিকল্প বাদ দেওয়ার পদ্ধতির তুলনা সহ, স্পষ্ট উদাহরণ দিয়ে। আপনি যদি SQL-এ নতুন হন বা নিয়মিত ব্যবহার করেন, এই গাইডটি মূল্যবান অন্তর্দৃষ্টি প্রদান করবে। শেষ পর্যন্ত পড়ে এই জ্ঞানটি ব্যবহার করে আপনার SQL দক্ষতা উন্নত করুন এবং আপনার কাজের প্রবাহকে অপ্টিমাইজ করুন।

২. NOT IN এর মৌলিক সিনট্যাক্স এবং ব্যবহার উদাহরণ

MySQL-এ NOT IN ক্লজ ব্যবহার করা হয় যখন আপনি এমন রেকর্ড পুনরুদ্ধার করতে চান যা একাধিক নির্দিষ্ট মানের কোনটিতেও মেলে না। সিনট্যাক্সটি নিজেই সহজ, তবে বাস্তবিক পরিস্থিতিতে এটি অনেক ক্ষেত্রে উপকারী প্রমাণিত হয়। এখানে আমরা মৌলিক সিনট্যাক্স এবং ব্যবহারিক উদাহরণ উপস্থাপন করছি।

[Basic Syntax]

SELECT column_name FROM table_name WHERE column_name NOT IN (value1, value2, ...);

সরল তালিকা ব্যবহার করে বাদ দেওয়া

উদাহরণস্বরূপ, যদি আপনি এমন ব্যবহারকারীদের পুনরুদ্ধার করতে চান যাদের নাম “Yamada” বা “Sato” নয়, তবে নিম্নলিখিত SQL স্টেটমেন্টটি লিখবেন:

SELECT * FROM users WHERE name NOT IN ('Yamada', 'Sato');

এই কুয়েরি চালালে “Yamada” এবং “Sato” নামের ব্যবহারকারী রেকর্ডগুলো বাদে সব ব্যবহারকারী রেকর্ড পাওয়া যাবে। যেহেতু বাদ দেওয়ার তালিকায় শুধুমাত্র কমা-সেপারেটেড মান দরকার, তাই এটি লিখতে এবং বুঝতে সহজ।

সাবকোয়েরি ব্যবহার করে ডাইনামিক বাদ দেওয়া

NOT IN ক্লজের বন্ধনীর মধ্যে শুধুমাত্র স্থির তালিকা নয়, সাবকোয়েরিও ব্যবহার করা যায়। এটি বিশেষভাবে উপকারী যখন আপনি নির্দিষ্ট শর্ত পূরণ করা ব্যবহারকারী আইডিগুলো বাদ দিতে চান।

SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE is_active = 1);

এই উদাহরণে, blacklist টেবিলে (is_active = 1) সক্রিয় হিসেবে চিহ্নিত ব্যবহারকারী আইডিগুলো বাদ দেওয়া হয়, এবং বাকি ব্যবহারকারীরা users টেবিল থেকে পুনরুদ্ধার করা হয়। NOT IN-কে সাবকোয়েরির সঙ্গে যুক্ত করে আপনি বিভিন্ন ব্যবসায়িক লজিকের প্রয়োজনীয়তা অনুযায়ী নমনীয়ভাবে কাজ করতে পারেন।

একাধিক শর্ত প্রয়োগ করা

যদি আপনাকে একাধিক কলামের ওপর একসাথে বাদ দেওয়ার শর্ত নির্ধারণ করতে হয়, তবে NOT IN মূলত একক কলামের জন্য ডিজাইন করা। তবে, সাবকোয়েরি বা JOIN (JOIN) ব্যবহার করে এটি আরও জটিল শর্ত পরিচালনা করতে পারে। আমরা পরবর্তীতে উন্নত কৌশল অংশে এটি বিশদভাবে ব্যাখ্যা করব।

আপনি দেখতে পাচ্ছেন, NOT IN ক্লজটি অত্যন্ত উপযোগী যখন আপনি নির্দিষ্ট তালিকা বা সাবকোয়েরি ফলাফলে অন্তর্ভুক্ত রেকর্ডগুলো বাদ দিয়ে সব রেকর্ড পুনরুদ্ধার করতে চান। প্রথমে আপনি যে ডেটা বের করতে চান তা কল্পনা করুন, এবং সরল বাদ দেওয়ার তালিকা ও সাবকোয়েরি উভয়ই কার্যকরভাবে ব্যবহার করার অনুশীলন করুন।

৩. NULL মান উপস্থিত থাকলে গুরুত্বপূর্ণ নোটগুলো

NOT IN ক্লজ ব্যবহার করার সময়, একটি সাধারণভাবে উপেক্ষা করা সমস্যাটি হল NULL মানের সঙ্গে এর আচরণ। এটি একটি ক্লাসিক “পিটফল” যা শুধুমাত্র নবীনদের নয়, অভিজ্ঞ SQL ব্যবহারকারীদেরও ভুল করতে পারে।

কারণ হল NOT IN এর মূল্যায়ন লজিক সাধারণ তুলনার থেকে ভিন্ন—এটি NULL মান অন্তর্ভুক্ত হলে ভিন্নভাবে কাজ করে।

NULL অন্তর্ভুক্ত হলে আচরণ

ধরুন আমাদের কাছে নিম্নলিখিত টেবিলগুলি আছে:

-- users table
id | name
---+------
 1 | Sato
 2 | Yamada
 3 | Suzuki
 4 | Tanaka

-- blacklist table
user_id
--------
1
NULL

এখন নিম্নলিখিত SQL বিবৃতি চালানোর কথা ভাবুন:

SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist);

প্রথম নজরে, এটা মনে হতে পারে যে user_id = 1 ব্যতীত (অর্থাৎ, id = 2, 3, 4) সব ব্যবহারকারী ফেরত আসবে। তবে বাস্তবে, কোনো সারি ফেরত আসে না

কেন কোনো সারি ফেরত আসে না?

কারণটি SQL-এর তিন-মূল্য লজিক (TRUE / FALSE / UNKNOWN)-এ নিহিত।
যখন NOT IN তালিকায় NULL অন্তর্ভুক্ত হয়, তুলনার ফলাফল UNKNOWN হয়ে যায়, এবং MySQL সেই সারিগুলি ফলাফল সেটে অন্তর্ভুক্ত করে না

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

সাধারণ সমস্যার দৃশ্যপট

এই সমস্যা প্রায়ই সাবকোয়েরি ব্যবহার করার সময় ঘটে। যদি কোনো ব্ল্যাকলিস্ট বা আনসাবস্ক্রাইব তালিকায় NULL মান থাকে, তবে ডেটা প্রত্যাশিতভাবে পুনরুদ্ধার নাও হতে পারে।

“কোনো ডেটা ফেরত আসে না” বা “রেকর্ডগুলি সঠিকভাবে বাদ দেওয়া হয় না” এর মতো সমস্যাগুলি প্রায়ই লুকানো NULL মানের দিকে ফিরে যায়।

প্রতিকার ও সমাধান

NULL মানের কারণে সৃষ্ট সমস্যাগুলি প্রতিরোধ করতে, আপনাকে NOT IN তালিকা থেকে NULL বাদ দিতে হবে। বিশেষভাবে, সাবকোয়েরির মধ্যে একটি IS NOT NULL শর্ত যোগ করুন।

SELECT * FROM users
WHERE id NOT IN (
  SELECT user_id FROM blacklist WHERE user_id IS NOT NULL
);

এই সমন্বয়ের মাধ্যমে, যদিও ব্ল্যাকলিস্ট টেবিলে NULL মান থাকে, তবুও কুয়েরি সঠিকভাবে সেই ব্যবহারকারীদের পুনরুদ্ধার করবে যারা ব্ল্যাকলিস্টে নেই।

মূল বিষয়গুলো

  • যদি NOT IN তালিকায় NULL থাকে, কুয়েরি শূন্য সারি ফেরত দিতে পারে
  • NOT IN ব্যবহার করার সময় সর্বদা সাবকোয়েরিগুলিকে IS NOT NULL শর্তের সঙ্গে যুক্ত করুন
  • যদি ডেটা অপ্রত্যাশিতভাবে অনুপস্থিত থাকে, প্রথমে লুকানো NULL মানগুলি পরীক্ষা করুন

৪. NOT IN বনাম NOT EXISTS — বিকল্পগুলির তুলনা

MySQL-এ বাদ দেওয়ার শর্ত নির্ধারণ করার সময়, NOT EXISTS হল NOT IN এর আরেকটি সাধারণ বিকল্প। যদিও উভয়ই সমান ফলাফল অর্জন করতে পারে, তবে তাদের আচরণ, NULL হ্যান্ডলিং এবং পারফরম্যান্স বৈশিষ্ট্যে পার্থক্য রয়েছে। এই অংশে, আমরা NOT IN এবং NOT EXISTS তুলনা করব এবং তাদের সংশ্লিষ্ট সুবিধা ও অসুবিধা ব্যাখ্যা করব।

মৌলিক সিনট্যাক্স তুলনা

[Exclusion Using NOT IN]

SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);

[Exclusion Using NOT EXISTS]

SELECT * FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);

উভয় কুয়েরি ব্ল্যাকলিস্টে নিবন্ধিত নয় এমন ব্যবহারকারীদের পুনরুদ্ধার করে।

NULL মানের হ্যান্ডলিং

NOT IN

  • যদি তালিকা বা সাবকোয়েরি ফলাফলে NULL অন্তর্ভুক্ত থাকে, কুয়েরি প্রত্যাশিতভাবে কাজ নাও করতে পারে (এটি শূন্য সারি ফেরত দিতে পারে)
  • একটি স্পষ্ট IS NOT NULL শর্তকে সুরক্ষারূপে প্রয়োজন

NOT EXISTS

  • সাবকোয়েরি ফলাফলে NULL থাকলেও সঠিকভাবে কাজ করে
  • সাধারণত নিরাপদ, কারণ এটি NULL মান দ্বারা প্রভাবিত হয় না

পারফরম্যান্স পার্থক্য

সর্বোত্তম পদ্ধতি ডেটার পরিমাণ এবং টেবিলের গঠন উপর নির্ভর করে, তবে সাধারণত:

  • ছোট ডেটাসেট বা স্থির তালিকার জন্য, NOT IN যথাযথভাবে কাজ করে
  • বড় সাবকোয়েরি বা জটিল শর্তের জন্য, NOT EXISTS অথবা LEFT JOIN প্রায়শই ভাল পারফরম্যান্স প্রদান করে

ব্ল্যাকলিস্ট রেকর্ডের সংখ্যা বাড়ার সঙ্গে সঙ্গে, NOT EXISTS প্রায়শই আরও কার্যকর হয়ে ওঠে। MySQL সংস্করণ এবং ইনডেক্সিংয়ের উপর নির্ভর করে, সঠিক ইনডেক্স থাকলে NOT EXISTS খুব দ্রুত হতে পারে, কারণ এটি প্রতিটি সারির জন্য অস্তিত্ব পরীক্ষা করে।

নির্বাচন করার নির্দেশিকা

  • যদি NULL মান উপস্থিত থাকতে পারেNOT EXISTS ব্যবহার করুন
  • যদি স্থির তালিকা বা সহজ মান বাদ দিতে চানNOT IN যথেষ্ট
  • যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় → EXPLAIN দিয়ে এক্সিকিউশন প্ল্যান পরীক্ষা করুন এবং তদনুযায়ী নির্বাচন করুন (JOIN অথবা NOT EXISTS বিবেচনা করুন)

নমুনা কেস

NOT IN ব্যবহার করে সমস্যাজনক উদাহরণ

-- If blacklist.user_id contains NULL
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist);
-- → May return zero rows

NOT EXISTS ব্যবহার করে নিরাপদ বাদ দেওয়ার উদাহরণ

SELECT * FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);
-- → Correct results regardless of NULL values

সারাংশ

  • NOT IN সহজ কিন্তু NULL মানের প্রতি সংবেদনশীল
  • NOT EXISTS NULL-এর বিরুদ্ধে শক্তিশালী এবং প্রোডাকশন পরিবেশে ব্যাপকভাবে ব্যবহৃত
  • ডেটা বৈশিষ্ট্য এবং প্রয়োজনীয় পারফরম্যান্সের উপর ভিত্তি করে নির্বাচন করুন

৫. পারফরম্যান্স বিবেচনা

SQL-এ বড় ডেটাসেটের সাথে কাজ করার সময়, ক্যোয়ারি পারফরম্যান্স অত্যন্ত গুরুত্বপূর্ণ। শর্তাবলী এবং ডেটা পরিমাণের উপর নির্ভর করে, NOT IN বা NOT EXISTS ব্যবহার করা এক্সিকিউশন গতিতে উল্লেখযোগ্য পার্থক্য সৃষ্টি করতে পারে। এই বিভাগে, আমরা NOT IN ক্লজের পারফরম্যান্স প্রভাবের উপর ফোকাস করব, অপটিমাইজেশন টিপস এবং গুরুত্বপূর্ণ বিবেচনাসহ।

NOT IN-এর পারফরম্যান্স বৈশিষ্ট্য

NOT IN ক্লজ নির্দিষ্ট তালিকা বা সাবক্যোয়ারি ফলাফলের কোনো মানের সাথে মিল না খাওয়া রেকর্ডগুলি পুনরুদ্ধার করে। এটি ছোট তালিকা বা টেবিলের সাথে দক্ষতার সাথে কাজ করে, কিন্তু নিম্নলিখিত পরিস্থিতিতে ধীর হয়ে যেতে পারে:

  • যখন সাবক্যোয়ারি বড় সংখ্যক রো পুনরায় ফেরত দেয়
  • যখন বাদ দেওয়া কলামটি ইনডেক্সড নয়
  • যখন সাবক্যোয়ারি ফলাফলে NULL মান উপস্থিত থাকে

বিশেষ করে, যদি সাবক্যোয়ারিতে দশ হাজার বা লক্ষাধিক রো থাকে এবং কোনো ইনডেক্স সংজ্ঞায়িত না থাকে, তাহলে MySQL সম্পূর্ণ তুলনা সম্পাদন করতে পারে, যা উল্লেখযোগ্য ধীরতার কারণ হয়।

ইনডেক্সিং-এর গুরুত্ব

বাদ দেওয়ার জন্য ব্যবহৃত কলামে (যেমন, user_id) একটি ইনডেক্স যোগ করা MySQL-কে তুলনা এবং ফিল্টারিং আরও দক্ষতার সাথে সম্পাদন করতে সাহায্য করে। সাবক্যোয়ারি বা জয়েনে ব্যবহৃত কলামগুলি যথাযথ হলে ইনডেক্স করা উচিত।

CREATE INDEX idx_blacklist_user_id ON blacklist(user_id);

এভাবে একটি ইনডেক্স যোগ করলে, NOT IN এবং NOT EXISTS ক্যোয়ারির পারফরম্যান্স নাটকীয়ভাবে উন্নত হতে পারে।

পারফরম্যান্স তুলনা: NOT IN বনাম NOT EXISTS

  • ছোট, স্থির তালিকা: NOT IN সাধারণত দ্রুত
  • বড় সাবক্যোয়ারি: NOT EXISTS বা LEFT JOIN প্রায়শই আরও দক্ষ

কারণ MySQL-এর এক্সিকিউশন প্ল্যান (EXPLAIN ফলাফল) ভার্সন এবং টেবিল ডিজাইনের উপর নির্ভর করে পরিবর্তিত হয়, তাই পারফরম্যান্স অপটিমাইজেশন সর্বদা প্রকৃত পরীক্ষা জড়িত করা উচিত

EXPLAIN দিয়ে এক্সিকিউশন প্ল্যান চেক করা

কোন ক্যোয়ারি ভালো পারফর্ম করে তা নির্ধারণ করার জন্য, MySQL-এর EXPLAIN কমান্ড ব্যবহার করুন:

EXPLAIN SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);

এটি আপনাকে দেখায় কোন ইনডেক্সগুলি ব্যবহৃত হচ্ছে এবং কোন টেবিলগুলি সম্পূর্ণ স্ক্যান হচ্ছে কি না—তথ্য যা সরাসরি পারফরম্যান্সকে প্রভাবিত করে।

বড় ডেটাসেটের জন্য অপটিমাইজেশন কৌশল

  • সাবক্যোয়ারি লোড কমাতে মধ্যবর্তী ফলাফলগুলি অস্থায়ী টেবিলে সংরক্ষণ করুন
  • যদি পারফরম্যান্স এখনও অপর্যাপ্ত হয় তাহলে ব্যাচ প্রসেসিং বা ক্যাশিং ব্যবহার করুন
  • LEFT JOIN ... IS NULL ব্যবহার করে পুনর্লিখন করুন (কিছু ক্ষেত্রে এটি গতি উন্নত করে)

মূল পয়েন্ট

  • NOT IN সাবক্যোয়ারি বড় হলে বা ইনডেক্স অনুপস্থিত থাকলে ধীর হয়ে যেতে পারে
  • সঠিক ইনডেক্স ডিজাইন এবং ক্যোয়ারি পর্যালোচনা পারফরম্যান্সকে উল্লেখযোগ্যভাবে উন্নত করতে পারে
  • NOT EXISTS বা LEFT JOIN বিবেচনা করুন, এবং সর্বদা EXPLAIN ব্যবহার করে ফলাফল যাচাই করুন

প্রোডাকশন পরিবেশে, ডেটা স্কেল এবং ব্যবহারের ফ্রিকোয়েন্সির উপর ভিত্তি করে সবচেয়ে উপযুক্ত ক্যোয়ারি নির্বাচন করুন।

৬. সাধারণ ব্যবহারের ক্ষেত্র এবং উন্নত কৌশল

NOT IN ক্লজ শুধুমাত্র সহজ বাদ দেওয়ার জন্য সীমাবদ্ধ নয়। উন্নত কৌশলের সাথে, আপনি আরও নমনীয় ডেটা নিষ্কাশন সম্পাদন করতে পারেন। এখানে আমরা সাধারণভাবে ব্যবহৃত প্যাটার্ন এবং ব্যবহারিক কৌশল পরিচয় করব।

একাধিক কলাম বাদ দেওয়া (কম্পোজিট কী বাদ দেওয়া)

যদিও NOT IN সাধারণত একক কলামের জন্য ব্যবহৃত হয়, তবে একাধিক কলামের সমন্বয় বাদ দেওয়ার প্রয়োজন হয় এমন ক্ষেত্র রয়েছে। এমন পরিস্থিতিতে, NOT EXISTS বা LEFT JOIN আরও উপযুক্ত।

[উদাহরণ: orders টেবিল থেকে customer_id এবং product_id এর নির্দিষ্ট সংমিশ্রণ বাদ দেওয়া]

SELECT * FROM orders o
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b
  WHERE b.customer_id = o.customer_id
    AND b.product_id = o.product_id
);

এটি ব্ল্যাকলিস্টে নিবন্ধিত সমস্ত “customer_id × product_id” সংমিশ্রণ বাদ দেয়।

আংশিক মিল বাদ দেওয়া (NOT LIKE ব্যবহার করে)

যেহেতু NOT IN শুধুমাত্র সঠিক মিলের সাথে কাজ করে, নির্দিষ্ট স্ট্রিং প্যাটার্ন বাদ দিতে NOT LIKE ব্যবহার করুন। উদাহরণস্বরূপ, এমন ব্যবহারকারীদের বাদ দিতে যাদের ইমেইল ঠিকানা “test@” দিয়ে শুরু হয়:

SELECT * FROM users WHERE email NOT LIKE 'test@%';

একসাথে একাধিক প্যাটার্ন বাদ দিতে, শর্তগুলোকে AND দিয়ে যুক্ত করুন:

SELECT * FROM users
WHERE email NOT LIKE 'test@%'
  AND email NOT LIKE 'sample@%';

বড় বাদ দেওয়ার তালিকা পরিচালনা

NOT IN এর মধ্যে শত বা হাজার মান সরাসরি তালিকাভুক্ত করা পাঠযোগ্যতা কমায় এবং পারফরম্যান্সকে ক্ষতিগ্রস্ত করতে পারে।

এমন ক্ষেত্রে, বাদ দেওয়ার তালিকাটি পরিষ্কারভাবে পরিচালনা করতে একটি নিবেদিত টেবিল বা সাবকোয়েরি ব্যবহার করুন:

-- Example: Store exclusion list in blacklist table
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);

সমষ্টিগত ফাংশনের সাথে সংযুক্ত করা

আপনি সমষ্টিগত শর্তযুক্ত সাবকোয়েরির সাথে NOT IN ব্যবহারও করতে পারেন।

[উদাহরণ: এই মাসে অর্ডার না করা গ্রাহকদের পুনরুদ্ধার]

SELECT * FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE order_date >= '2025-06-01'
    AND order_date < '2025-07-01'
);

সাবকোয়েরির পরিবর্তে JOIN ব্যবহার করা

কিছু ক্ষেত্রে, আপনি LEFT JOIN এবং IS NULL একসাথে ব্যবহার করে একই ফলাফল পেতে পারেন।

পারফরম্যান্স এবং পাঠযোগ্যতার ভিত্তিতে সবচেয়ে উপযুক্ত পদ্ধতি নির্বাচন করুন।

SELECT u.*
FROM users u
LEFT JOIN blacklist b ON u.id = b.user_id
WHERE b.user_id IS NULL;

সাবকোয়েরির পারফরম্যান্স অনিশ্চিত হলে বা ইনডেক্স কার্যকর হলে এই পদ্ধতি বিশেষভাবে উপকারী।

মূল বিষয়বস্তু

  • NOT EXISTS অথবা JOIN ব্যবহার করুন বহু-কলাম বাদ দেওয়ার জন্য
  • আংশিক স্ট্রিং বাদ দেওয়ার জন্য NOT LIKE ব্যবহার করুন
  • টেবিল বা সাবকোয়েরি ব্যবহার করে বড় বাদ দেওয়ার তালিকা পরিচালনা করুন
  • JOIN + IS NULL পারফরম্যান্সও বাড়াতে পারে

৭. প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)

MySQL NOT IN ক্লজ সম্পর্কিত কিছু প্রায়শই জিজ্ঞাসিত প্রশ্ন এবং সাধারণ সমস্যাগুলি এখানে দেওয়া হল। উত্তরগুলো বাস্তবিক সমস্যাগুলোর উপর কেন্দ্রীভূত, যা বাস্তব পরিস্থিতিতে প্রায়ই অনুসন্ধান করা হয়।

প্রশ্ন১. NOT IN এবং IN এর মধ্যে পার্থক্য কী?

A.
IN নির্দিষ্ট তালিকায় কোনো মানের সাথে মিলে এমন ডেটা পুনরুদ্ধার করে, যেখানে NOT IN তালিকায় কোনো মানের সাথে না মিলে এমন ডেটা পুনরুদ্ধার করে। তাদের সিনট্যাক্স প্রায় একই, তবে নির্দিষ্ট মান বাদ দিতে চাইলে NOT IN ব্যবহার করা উচিত।

প্রশ্ন২. NOT IN ব্যবহার করার সময় যদি NULL মান থাকে তাহলে কী হয়?

A.
যদি তালিকা বা সাবকোয়েরিতে NULL মান অন্তর্ভুক্ত থাকে, তবে NOT IN শূন্য সারি ফেরত দিতে পারে অথবা অপ্রত্যাশিত ফলাফল তৈরি করতে পারে। নিরাপদে NULL বাদ দিতে IS NOT NULL ব্যবহার করা সর্বোত্তম।

প্রশ্ন৩. NOT IN এবং NOT EXISTS এর মধ্যে কীভাবে নির্বাচন করব?

A.

  • যদি NULL মান সম্ভব হয় অথবা সাবকোয়েরি জড়িত থাকে, NOT EXISTS বেশি নির্ভরযোগ্য।
  • স্থির তালিকা বা সহজ বাদ দেওয়ার জন্য, NOT IN যথেষ্ট।
  • পারফরম্যান্স এক্সিকিউশন প্ল্যান এবং ডেটার পরিমাণের উপর নির্ভর করে পরিবর্তিত হতে পারে, তাই আপনার নির্দিষ্ট পরিস্থিতির ভিত্তিতে নির্বাচন করুন।

প্রশ্ন৪. কখনও কখনও NOT IN ব্যবহার করা কুয়েরি ধীর হয়। আমি কী করতে পারি?

A.

  • বাদ দেওয়ার শর্তে ব্যবহৃত কলামে একটি ইনডেক্স যোগ করুন
  • সাবকোয়েরি ফলাফলের আকার কমান অথবা ডেটা একটি অস্থায়ী টেবিলে সংগঠিত করুন
  • কুয়েরি পুনরায় লিখে NOT EXISTS অথবা LEFT JOIN ... IS NULL ব্যবহার করার কথা বিবেচনা করুন
  • এক্সিকিউশন প্ল্যান বিশ্লেষণ এবং বটলনেক চিহ্নিত করতে EXPLAIN ব্যবহার করুন

প্রশ্ন৫. কীভাবে একাধিক কলামের ভিত্তিতে বাদ দিতে পারি?

A.
যেহেতু NOT IN একক-কলাম ব্যবহারের জন্য নকশা করা হয়েছে, তাই একাধিক কলামের সমন্বিত বর্জনের প্রয়োজন হলে NOT EXISTS অথবা LEFT JOIN ব্যবহার করুন। সাবকোয়েরির মধ্যে একাধিক কলাম শর্ত একত্রিত করুন।

প্রশ্ন ৬. সাবকোয়েরি যখন অনেক সারি ফেরত দেয় তখন আমাকে কী বিষয়ে সতর্ক থাকতে হবে?

A.
যখন একটি সাবকোয়েরি বড় সংখ্যক সারি ফেরত দেয়, তখন NOT IN পারফরম্যান্স হ্রাসের শিকার হতে পারে। ইনডেক্সিং, অস্থায়ী টেবিল ব্যবহার করুন, অথবা কুয়েরি পুনর্গঠন করুন যাতে সাবকোয়েরি সম্ভবপরভাবে ছোট থাকে।

প্রশ্ন ৭. যদি আমি প্রত্যাশিত ফলাফল না পাই, তবে আমি কী পরীক্ষা করা উচিত?

A.

  • নিশ্চিত করুন যে কোনো NULL মান অনিচ্ছাকৃতভাবে অন্তর্ভুক্ত হয়নি
  • সাবকোয়েরি আলাদাভাবে চালিয়ে তার ফলাফল নিশ্চিত করুন
  • WHERE শর্ত বা JOIN লজিকের ভুল আছে কিনা পরীক্ষা করুন
  • প্রয়োজনে MySQL সংস্করণ-নির্দিষ্ট আচরণ এবং অফিসিয়াল ডকুমেন্টেশন পর্যালোচনা করুন

৮. উপসংহার

MySQL NOT IN ক্লজটি নির্দিষ্ট শর্ত পূরণ না করা ডেটা দক্ষতার সাথে পুনরুদ্ধার করার জন্য একটি অত্যন্ত উপযোগী গঠন। সহজ বর্জন তালিকা থেকে সাবকোয়েরি ব্যবহার করে নমনীয় ফিল্টারিং পর্যন্ত, এটি বহু ব্যবহারিক পরিস্থিতিতে প্রয়োগ করা যায়।

তবে, বাস্তব ব্যবহারে কিছু গুরুত্বপূর্ণ বিষয় বিবেচনা করা প্রয়োজন, যেমন NULL মানের পরিচালনা এবং বড় ডেটাসেটের ক্ষেত্রে পারফরম্যান্স হ্রাস। NULL মানের কারণে অপ্রত্যাশিত শূন্য-ফলাফল কুয়েরি বা বড় সাবকোয়েরির ফলে ধীর এক্সিকিউশন ইত্যাদি সমস্যাগুলি নবীন ও অভিজ্ঞ ডেভেলপার উভয়েরই মনোযোগ প্রয়োজন।

NOT EXISTS এবং LEFT JOIN ... IS NULL এর মতো বিকল্প পদ্ধতিগুলি বুঝে আপনি আরও নিরাপদ ও কার্যকরী SQL কুয়েরি লিখতে পারবেন। আপনার লক্ষ্য ও ডেটার পরিমাণের ভিত্তিতে সর্বদা সবচেয়ে উপযুক্ত পদ্ধতি নির্বাচন করুন।

মূল বিষয়বস্তু

  • NOT IN সহজ বর্জন শর্তের জন্য কার্যকর
  • সর্বদা NULL মান থেকে রক্ষা করুন (IS NOT NULL ব্যবহারকে অভ্যাস করুন)
  • পারফরম্যান্স যদি উদ্বেগের বিষয় হয়, ইনডেক্সিং কৌশল বিবেচনা করুন অথবা NOT EXISTS এবং JOIN বিকল্প ব্যবহার করুন
  • সর্বদা এক্সিকিউশন প্ল্যান (EXPLAIN) ব্যবহার করে কার্যকারিতা যাচাই করুন

SQL “পিটফল” এড়িয়ে চলুন এবং এই প্রবন্ধে আলোচিত ধারণাগুলি আপনার দৈনন্দিন কাজ ও শিক্ষায় প্রয়োগ করে বুদ্ধিমত্তাপূর্ণ ডেটা এক্সট্র্যাকশন অনুশীলন করুন।