আগে গল্প, তারপর কোড
- ডেটাবেজে ১০ লক্ষ রেকর্ড থাকলে কি সবসময় সবগুলো দেখা দরকার?
- শুধু CSE বিভাগের শিক্ষার্থী দরকার হলে বাকি সবাইকে কীভাবে বাদ দেব?
- ৫০০ টাকার কমে পণ্য দরকার হলে ডেটাবেজকে কীভাবে সেটা বলব?
আমাদের চারপাশে "শর্ত দিয়ে বেছে নেওয়া" প্রতিনিয়ত ঘটছে:
| প্রতিষ্ঠান | কী শর্তে ফিল্টার করে |
|---|---|
| শিক্ষক | শুধু ক্লাস ১০-এর শিক্ষার্থী খোঁজেন |
| হাসপাতাল | শুধু "O+" ব্লাড গ্রুপের রোগী খোঁজে |
| Amazon | শুধু ৳১,০০০ টাকার কমের পণ্য দেখায় |
| শুধু তোমার বন্ধুদের পোস্ট দেখায়, সবার নয় | |
| ব্যাংক | শুধু ৳৫০,০০০-এর বেশি ব্যালেন্স আছে এমন গ্রাহক খোঁজে |
প্রতিটা জায়গায় লক্ষ কোটি রেকর্ডের মধ্যে থেকে একটা শর্ত দিয়ে ঠিক দরকারি অংশটুকু বের করে আনা হচ্ছে। SQL-এ এই কাজটাই করে WHERE ক্লজ।
১০,০০,০০০ রেকর্ড
Department = 'CSE'
মাত্র কয়েকশো
অর্থাৎ, WHERE হলো ডেটাবেজকে দেওয়া একটা নিয়ম — "শুধু এই শর্ত মিললে তবেই দেখাও, নাহলে বাদ দাও"। বাকি ক্লাসে ধাপে ধাপে দেখব কতভাবে এই শর্ত লেখা যায়।
শূন্য থেকে শুরু
WHERE হলো SQL-এর একটি ক্লজ (অংশ), যা SELECT স্টেটমেন্টের সাথে বসে বলে দেয় — "শুধু কোন কোন সারি (row) দেখাতে হবে"। এটা অনেকটা চালুনির (sieve) মতো কাজ করে — পুরো ডেটা চালুনির উপর দিয়ে ফেলা হয়, আর যেগুলো শর্ত মেলে শুধু সেগুলোই নিচে পড়ে।
সব সারি
সত্যি না মিথ্যা যাচাই
ধরে নিই আমাদের একটা Student টেবিল আছে (Student Management System-এর জন্য):
| ID | Name | Department | GPA | AdmissionYear |
|---|---|---|---|---|
| 1 | রাহাত করিম | বাণিজ্য | ৩.২ | ২০২৪ |
| 2 | সাদিয়া আক্তার | CSE | ৩.৯ | ২০২৫ |
| 3 | তানভীর হাসান | EEE | ৩.৭ | ২০২৪ |
| 4 | মিথিলা রহমান | CSE | ৩.৮ | ২০২৫ |
সিনট্যাক্স
একটা একটা করে সব অপারেটর
Student টেবিল ব্যবহার করেই প্রতিটা অপারেটর শিখব।
= (সমান)
| Name | Department |
|---|---|
| সাদিয়া আক্তার | CSE |
| মিথিলা রহমান | CSE |
ব্যাখ্যা: WHERE-এর পরে Department = 'CSE' মানে — শুধু যাদের Department কলামের মান হুবহু 'CSE', তাদেরই আনো।
> (বড়)
| Name | GPA |
|---|---|
| সাদিয়া আক্তার | ৩.৯ |
| মিথিলা রহমান | ৩.৮ |
< (ছোট)
| Name | GPA |
|---|---|
| রাহাত করিম | ৩.২ |
>= (বড় বা সমান)
| Name | GPA |
|---|---|
| সাদিয়া আক্তার | ৩.৯ |
| তানভীর হাসান | ৩.৭ |
| মিথিলা রহমান | ৩.৮ |
<= (ছোট বা সমান)
| Name | GPA |
|---|---|
| রাহাত করিম | ৩.২ |
| তানভীর হাসান | ৩.৭ |
!= এবং <> (সমান নয়)
| Name | Department |
|---|---|
| রাহাত করিম | বাণিজ্য |
| তানভীর হাসান | EEE |
একাধিক শর্ত একসাথে
বাস্তব প্রশ্ন প্রায়ই একটার বেশি শর্ত নিয়ে আসে — "CSE বিভাগ এবং GPA ৩.৫-এর বেশি"। এই কাজের জন্য AND, OR, NOT ব্যবহার হয়।
AND — দুটো শর্তই সত্যি হতে হবে
তবেই আসবে
| Name | Department | GPA |
|---|---|---|
| সাদিয়া আক্তার | CSE | ৩.৯ |
| মিথিলা রহমান | CSE | ৩.৮ |
OR — যেকোনো একটা সত্যি হলেই হবে
| Name | Department |
|---|---|
| সাদিয়া আক্তার | CSE |
| তানভীর হাসান | EEE |
| মিথিলা রহমান | CSE |
NOT — শর্তটাকে উল্টে দেওয়া
| Name | Department |
|---|---|
| রাহাত করিম | বাণিজ্য |
| তানভীর হাসান | EEE |
আরও স্মার্টভাবে শর্ত লেখা
BETWEEN — একটা রেঞ্জের মধ্যে
| Name | GPA |
|---|---|
| সাদিয়া আক্তার | ৩.৯ |
| তানভীর হাসান | ৩.৭ |
| মিথিলা রহমান | ৩.৮ |
ব্যাখ্যা: BETWEEN দুই প্রান্তের মানও (৩.৫ এবং ৩.৯) হিসাবের মধ্যে ধরে নেয়।
IN — তালিকার মধ্যে যেকোনো একটা
ব্যাখ্যা: একই কাজ OR দিয়ে বারবার লিখেও করা যেত, কিন্তু IN দিয়ে লেখা অনেক ছোট ও পরিষ্কার।
NOT IN — তালিকার বাইরে
| Name | Department |
|---|---|
| রাহাত করিম | বাণিজ্য |
LIKE — প্যাটার্ন মিলিয়ে খোঁজা
LIKE ব্যবহার হয় যখন পুরো মান না জেনেও শুধু একটা অংশ দিয়ে খুঁজতে চাই। এর জন্য দুটো বিশেষ চিহ্ন আছে:
| চিহ্ন | অর্থ |
|---|---|
| % | যেকোনো সংখ্যক (শূন্য বা তার বেশি) অক্ষর |
| _ | ঠিক একটা অক্ষর |
| Name |
|---|
| সাদিয়া আক্তার |
IS NULL — খালি মান খোঁজা
ব্যাখ্যা: NULL মানে "কোনো মান নেই" — শূন্য (0) বা ফাঁকা লেখা (' ') থেকে সম্পূর্ণ আলাদা। তাই = দিয়ে নয়, বিশেষভাবে IS NULL দিয়ে খুঁজতে হয়।
IS NOT NULL — যাদের মান আছে
একটি অনলাইন শপিং সিস্টেম
১. ৳১,০০০ টাকার কমের পণ্য
২. শুধু ইলেকট্রনিক্স পণ্য
৩. ৳৫০০ থেকে ৳২,০০০-এর মধ্যে
৪. স্টকে আছে এমন পণ্য
৫. নাম "S" দিয়ে শুরু
৬. নির্দিষ্ট কয়েকটা ব্র্যান্ডের পণ্য
নিজে করে দেখা
ধাপ ১ — Products টেবিল তৈরি
ধাপ ২ — নমুনা ডেটা যোগ
ধাপ ৩ থেকে ৯
| ধাপ | SQL | শেখা যায় |
|---|---|---|
| ৩ | WHERE Price < 1000; | কম্পারিজন অপারেটর |
| ৪ | WHERE Category='ইলেকট্রনিক্স' AND Stock > 0; | AND/OR/NOT |
| ৫ | WHERE Price BETWEEN 500 AND 2000; | BETWEEN |
| ৬ | WHERE Brand IN ('Samsung','Walton'); | IN / NOT IN |
| ৭ | WHERE ProductName LIKE 'S%'; | LIKE |
| ৮ | WHERE Email IS NULL; | IS NULL / IS NOT NULL |
| ৯ | একাধিক শর্ত একসাথে | সব একত্রে |
ধাপ ৯ — সব একসাথে ব্যবহার
| ProductName | Category | Price |
|---|---|---|
| Smart Watch | ইলেকট্রনিক্স | ১৮০০ |
ব্যাখ্যা: তিনটে শর্তই AND দিয়ে জোড়া, তাই একসাথে সবগুলো সত্যি হতে হবে। "Speaker Mini" বাদ পড়েছে কারণ Stock = 0, শর্ত মেলেনি।
- লেখা মানের চারপাশে কোটেশন ভুলে যাওয়া
- = কে == ভাবা
- AND আর OR গুলিয়ে ফেলা
- LIKE-এ % বা _ ভুল জায়গায় বসানো
শুরুতে যেসব ভুল সবাই করে
| ভুল | সমাধান |
|---|---|
| লেখা মানে কোটেশন না দেওয়া | টেক্সট মান সবসময় ' ' এর ভেতর লিখতে হবে, যেমন Department = 'CSE' |
| = এর জায়গায় == | SQL-এ সমান বোঝাতে একটাই = চিহ্ন |
| AND আর OR গুলিয়ে ফেলা | AND মানে "দুটোই লাগবে", OR মানে "যেকোনো একটাই যথেষ্ট" — কাগজে লিখে যাচাই করে নাও |
| LIKE-এর wildcard ভুল ব্যবহার | % মানে যেকোনো লম্বার লেখা, _ মানে ঠিক একটা অক্ষর — গুলিয়ে ফেলো না |
| = NULL লেখা | NULL খুঁজতে সবসময় IS NULL লিখতে হয়, = NULL কখনো কাজ করে না |
| BETWEEN ভুলভাবে ব্যবহার | ছোট মান আগে, বড় মান পরে লিখতে হয় — BETWEEN 2000 AND 500 ভুল |
| অপারেটরের অগ্রাধিকার না বোঝা | AND ও OR একসাথে থাকলে bracket () দিয়ে স্পষ্ট করে দাও কোনটা আগে হিসাব হবে |
প্রফেশনালরা যেভাবে WHERE ব্যবহার করেন
- আগেই ফিল্টার করো — যত আগে সম্ভব অপ্রয়োজনীয় ডেটা বাদ দিলে বাকি প্রসেসিং দ্রুত হয়।
- পড়ার মতো শর্ত লেখো — জটিল শর্তকে একাধিক লাইনে ভেঙে, bracket দিয়ে গুছিয়ে লেখা।
- অকারণে জটিলতা এড়াও — একটা সরল WHERE দিয়ে যা হয়, তা অহেতুক জটিল করার দরকার নেই।
- ইনডেক্স করা কলাম ব্যবহার করো (কনসেপ্ট) — যে কলামে বারবার WHERE দেওয়া হয়, সেটাতে "ইনডেক্স" থাকলে খোঁজা অনেক দ্রুত হয় — বইয়ের সূচিপত্রের মতো।
- ছোট ডেটাসেটে টেস্ট করো — বড় প্রোডাকশন ডেটাবেজে চালানোর আগে ছোট নমুনায় শর্তটা ঠিকমতো কাজ করছে কিনা যাচাই করে নাও।
করে দেখাও, বলে দেখাও
SELECT Name FROM Student WHERE GPA >= 3.7 AND Department = 'CSE'; — কারা ফলাফলে থাকবে?SELECT * FROM Product WHERE Price = '৫০০'; — এখানে সংখ্যার চারপাশে কোটেশন দেওয়া ঠিক হয়েছে কি?এক নজরে সবকিছু
কুইক রিভিশন নোট
| অপারেটর/কীওয়ার্ড | কাজ |
|---|---|
| =, !=, >, <, >=, <= | মান তুলনা করে |
| AND | সব শর্ত সত্যি হতে হয় |
| OR | যেকোনো একটা শর্ত সত্যি হলেই হয় |
| NOT | শর্ত উল্টে দেয় |
| BETWEEN | একটা রেঞ্জের মধ্যে (দুই প্রান্তসহ) |
| IN / NOT IN | তালিকার মধ্যে আছে / নেই |
| LIKE | প্যাটার্ন মিলিয়ে খোঁজে (%, _) |
| IS NULL / IS NOT NULL | খালি মান আছে কি নেই |
মৌখিক (Viva) প্রশ্ন
- WHERE ক্লজ কী কাজ করে?
- AND আর OR-এর মধ্যে পার্থক্য কী?
- BETWEEN কি দুই প্রান্তের মান ধরে রাখে?
- = NULL কেন কাজ করে না?
- LIKE-এ % আর _ এর পার্থক্য কী?
MCQ (উত্তরসহ)
ক্লাসের অনুশীলন
- Student টেবিল থেকে শুধু "EEE" বিভাগের শিক্ষার্থীদের নাম আনো।
- যাদের GPA ৩.৫-এর বেশি এবং ২০২৫ সালে ভর্তি, তাদের দেখাও।
- নাম "ম" দিয়ে শুরু এমন শিক্ষার্থী খুঁজে বের করো।
- CSE অথবা BBA বিভাগের শিক্ষার্থীদের একসাথে দেখাও।
বাড়ির কাজ
- শুধু ঢাকার অর্ডার দেখাও।
- যাদের Amount ৫০০-এর বেশি এবং Status = 'Delivered', তাদের দেখাও।
- যাদের নাম "র" দিয়ে শুরু, তাদের দেখাও।
- যেসব অর্ডারের City এখনো ফাঁকা (NULL), সেগুলো দেখাও।
ইউজার থেকে আউটপুট পর্যন্ত
প্রশ্ন করে
লেখা হয়
প্রতিটা সারি যাচাই
একক শর্ত বনাম একাধিক শর্ত
একক শর্ত
একাধিক শর্ত
পাশাপাশি দেখে তফাত বোঝা
AND বনাম OR
AND
সব শর্ত একসাথে সত্যি হতে হয় — ফলাফল সাধারণত কম আসে।OR
যেকোনো একটা শর্ত সত্যি হলেই হয় — ফলাফল সাধারণত বেশি আসে।IN বনাম BETWEEN
IN
নির্দিষ্ট কয়েকটা আলাদা মানের তালিকা থেকে মেলানোর জন্য — যেমন নির্দিষ্ট কয়েকটা বিভাগ।BETWEEN
একটা ধারাবাহিক রেঞ্জের মধ্যে মেলানোর জন্য — যেমন দাম বা তারিখের সীমা।LIKE বনাম =
LIKE
আংশিক মিল বা প্যাটার্ন খোঁজার জন্য, wildcard (%, _) সহ ব্যবহার হয়।=
হুবহু সম্পূর্ণ মিল দরকার হলে ব্যবহার হয়, wildcard চলে না।IS NULL বনাম = NULL
IS NULL
সঠিক পদ্ধতি — SQL-এ NULL মান শনাক্ত করার একমাত্র উপায়।= NULL
ভুল ব্যবহার — এটা কখনো কোনো ফলাফল দেয় না, কারণ NULL-এর সাথে কোনো তুলনাই "সমান" হয় না।!= বনাম <>
!=
"সমান নয়" বোঝাতে বহুল ব্যবহৃত, প্রায় সব ডেটাবেজেই কাজ করে।<>
একই অর্থ বহন করে, SQL স্ট্যান্ডার্ডের মূল সংস্করণ — দুটোই সমানভাবে গ্রহণযোগ্য।ShopBD — অনলাইন শপিং ডেটাবেজে সব WHERE অপারেশন
আগের ক্লাসের মতোই ShopBD-এর Product টেবিল ব্যবহার করে আজকের শেখা সবগুলো WHERE অপারেশন একসাথে প্রয়োগ করি।
| কাজ | SQL |
|---|---|
| কম্পারিজন — ১০০০-এর কম দাম | WHERE Price < 1000; |
| AND — ইলেকট্রনিক্স + স্টকে আছে | WHERE Category='ইলেকট্রনিক্স' AND Stock>0; |
| OR — দুই ক্যাটাগরির যেকোনোটা | WHERE Category='পোশাক' OR Category='ইলেকট্রনিক্স'; |
| BETWEEN — দামের রেঞ্জ | WHERE Price BETWEEN 800 AND 2000; |
| IN — নির্দিষ্ট ব্র্যান্ড | WHERE Brand IN ('Samsung','Walton'); |
| LIKE — 'S' দিয়ে শুরু নাম | WHERE ProductName LIKE 'S%'; |
| IS NULL — ইমেইল নেই এমন পণ্য | WHERE Email IS NULL; |
| কম্বাইন্ড — সব একসাথে | WHERE Category='ইলেকট্রনিক্স' AND Price<2000 AND Stock>0; |
প্রতিদিন যারা WHERE ব্যবহার করেন
| পেশা | WHERE দিয়ে যা করেন |
|---|---|
| Data Analyst | নির্দিষ্ট সময়কাল, অঞ্চল বা গ্রাহক গোষ্ঠীর ডেটা বেছে নিয়ে রিপোর্ট বানান |
| Data Scientist | মডেল ট্রেনিংয়ের আগে অপ্রাসঙ্গিক বা ভুল ডেটা বাদ দিয়ে ডেটাসেট পরিষ্কার করেন |
| Business Intelligence Analyst | নির্দিষ্ট শর্ত মেলা ডেটা দিয়ে ড্যাশবোর্ড ও KPI রিপোর্ট বানান |
| Database Administrator (DBA) | নির্দিষ্ট শর্তে সমস্যাযুক্ত রেকর্ড খুঁজে বের করে সিস্টেম পরীক্ষা করেন |
যেমন — একজন Data Analyst প্রতিদিন জিজ্ঞেস করতে পারেন: "গত সপ্তাহে কোন কোন অর্ডার ঢাকার বাইরে থেকে এসেছে এবং এখনো ডেলিভার হয়নি?" — এই প্রশ্নের উত্তরও একটা WHERE-ভিত্তিক query।
বড় ডেটাবেজে WHERE কেন গুরুত্বপূর্ণ
যখন টেবিলে হাজার-লক্ষ নয়, বরং কোটি কোটি রেকর্ড থাকে, তখন WHERE কীভাবে লেখা হচ্ছে তা সরাসরি সিস্টেমের গতি ঠিক করে দেয়।
- ফিল্টারিং এফিশিয়েন্সি — যত কম রেকর্ডের উপর হিসাব করতে হয়, ততই দ্রুত ফলাফল আসে। তাই যতটা সম্ভব নির্দিষ্ট শর্ত দেওয়া ভালো।
- ইনডেক্স (কনসেপ্ট মাত্র) — বইয়ের সূচিপত্র যেমন পাতা উল্টে না গিয়েও নির্দিষ্ট বিষয় খুঁজে দেয়, ডেটাবেজের "ইনডেক্স" ঠিক তেমনই — নির্দিষ্ট কলামে ইনডেক্স থাকলে WHERE-এর খোঁজাখুঁজি অনেক দ্রুত হয়।
- কেন ভালো WHERE লেখা গুরুত্বপূর্ণ — ভুল বা অতিরিক্ত জটিল শর্ত পুরো সিস্টেমকে ধীর করে দিতে পারে, বিশেষ করে লাইভ ওয়েবসাইট বা অ্যাপে যেখানে প্রতি সেকেন্ডে হাজারো query চলে।