ফিল্টারিং, অপারেটর এবং ফাংশন
আগের অধ্যায়ে আমরা শিখেছি কীভাবে ডেটা আনতে হয় (SELECT)। কিন্তু সব ডেটা তো আমাদের দরকার নেই। ফেসবুকে লগইন করলে কি সবার মেসেজ দেখেন? না, শুধু আপনারগুলো দেখেন। এই যে নির্দিষ্ট লজিক বা শর্ত দিয়ে ডেটা ছেঁকে আনা—একে বলা হয় Filtering।
এই অধ্যায়ে আমরা শিখব কীভাবে নিখুঁতভাবে কুয়েরি ফিল্টার করতে হয় এবং MySQL-এর বিল্ট-ইন ফাংশন দিয়ে ডেটাকে সাজাতে হয়। এটিই Query Optimization এর প্রথম ধাপ।
৩.১ Comparison Operators (তুলনামূলক অপারেটর)
সবচেয়ে বেসিক ফিল্টারিং হলো ভ্যালু তুলনা করা।
| Operator | অর্থ | উদাহরণ |
|---|---|---|
| = | সমান | WHERE age = 18 |
| != বা <> | সমান নয় | WHERE status != 'banned' |
| > | বড় | WHERE salary > 50000 |
| >= | বড় অথবা সমান | WHERE score >= 80 |
| < | ছোট | WHERE height < 6 |
| <= | ছোট অথবা সমান | WHERE stock <= 10 |
উদাহরণ:
SELECT * FROM users WHERE age >= 18;
৩.২ Logical Operators: AND, OR, NOT
একাধিক শর্ত একসাথে জড়ার জন্য লজিক্যাল অপারেটর লাগে।
১. AND (সব শর্ত সত্য হতে হবে):
একজন ইউজার তখনই লগইন করতে পারবে যখন তার ইমেইল এবং পাসওয়ার্ড দুটোই মিলবে।
SELECT * FROM users WHERE email = 'test@mail.com' AND password = '123';
২. OR (যেকোনো একটি সত্য হলেই হবে):
ইউজার ঢাকা অথবা চট্টগ্রামের হলেই হবে।
SELECT * FROM users WHERE city = 'Dhaka' OR city = 'Chittagong';
৩. NOT (উল্টো বা বিপরীত):
যাদের স্ট্যাটাস inactive নয় (তার মানে active বা pending হতে পারে)।
SELECT * FROM users WHERE NOT status = 'inactive';
⚠️ Senior Alert (Operator Precedence):
AND এর পাওয়ার OR এর চেয়ে বেশি।
-- ভুল:
SELECT * FROM products WHERE cat = 'A' OR cat = 'B' AND price > 100;
-- (এখানে MySQL ভাববে: ক্যাটাগরি B এবং দাম ১০০ এর বেশি, অথবা ক্যাটাগরি A। ক্যাটাগরি A এর দাম যা খুশি হতে পারে!)
-- সঠিক (ব্র্যাকেট ব্যবহার করুন):
SELECT * FROM products WHERE (cat = 'A' OR cat = 'B') AND price > 100;
৩.৩ BETWEEN — রেঞ্জ কুয়েরি
নির্দিষ্ট সীমার মধ্যে ডেটা খুঁজতে BETWEEN ব্যবহার হয়। এটি ইনক্লুসিভ (শুরু ও শেষের ভ্যালুসহ কাউন্ট করে)।
দামের রেঞ্জ:
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
(এর মানে: price >= 100 AND price <= 500)
তারিখের রেঞ্জ (Reporting এর জন্য সেরা):
SELECT * FROM orders WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31';
৩.৪ IN — মাল্টিপল ম্যাচ (Alternative to OR)
যখন অনেকগুলো স্পেসিফিক ভ্যালুর সাথে ম্যাচ করতে হয়, তখন OR এর বদলে IN ব্যবহার করা স্মার্ট এবং ফাস্ট।
Best Practice:
SELECT * FROM users WHERE city IN ('Dhaka', 'Rajshahi', 'Khulna');
কেন এটি ভালো?
- কোড ক্লিন থাকে।
- IN অপারেটরটি MySQL এর ইন্টারনাল অপটিমাইজারে সর্ট করে বাইনারি সার্চ চালাতে পারে, যা অনেকগুলো OR এর চেয়ে দ্রুত কাজ করে।
৩.৫ LIKE — প্যাটার্ন বা আংশিক সার্চ
এক্সাক্ট ম্যাচ না করে যদি নামের অংশ দিয়ে খুঁজতে চান, তখন LIKE ব্যবহার হয়। এখানে দুটি ওয়াইল্ডকার্ড (Wildcard) আছে:
- % : যেকোনো সংখ্যক ক্যারেক্টার।
- _ : ঠিক একটি ক্যারেক্টার।
| Pattern | অর্থ | উদাহরণ |
|---|---|---|
| 'Rahim%' | Rahim দিয়ে শুরু | Rahim, RahimUddin |
| '%Islam' | Islam দিয়ে শেষ | Nazrul Islam, Saiful Islam |
| '%shop%' | মাঝখানে shop আছে | My Shop BD, ShopNow |
| '_a%' | দ্বিতীয় অক্ষর 'a' | Rakib, Sakib |
⚠️ Senior Performance Warning:
- LIKE 'S%' ✅ Fast: ইনডেক্স ব্যবহার করতে পারে (Range Scan)।
- LIKE '%S' ❌ Slow: ইনডেক্স কাজ করে না, পুরো টেবিল স্ক্যান করে (Full Table Scan)।
৩.৬ REGEXP — রেগুলার এক্সপ্রেশন (Pro Level Search)
যখন LIKE দিয়ে কাজ হয় না এবং খুব জটিল প্যাটার্ন দরকার হয়, তখন REGEXP ব্যবহার হয়।
উদাহরণ:
১. নাম A অথবা S দিয়ে শুরু:
SELECT * FROM users WHERE name REGEXP '^[AS]';
২. ইমেইলের মধ্যে কোনো সংখ্যা আছে কি না:
SELECT * FROM users WHERE email REGEXP '[0-9]';
৩. নাম ঠিক ৫ অক্ষরের:
SELECT * FROM users WHERE name REGEXP '^.....$';
⚠️ সতর্কতা: REGEXP খুব পাওয়ারফুল কিন্তু রিসোর্স হেভি। সাধারণ সার্চের জন্য এটি ব্যবহার করবেন না। LIKE বা = দিয়ে কাজ চললে সেটাই ব্যবহার করুন।
৩.৭ NULL হ্যান্ডলিং (Common Junior Mistake)
💡 মনে রাখবেন: SQL-এ NULL মানে "শূন্য" বা "ফাঁকা স্ট্রিং" নয়। NULL মানে হলো "Unknown" বা "নাই"।
❌ ভুল পদ্ধতি:
WHERE phone = NULL -- এটি কখনো কাজ করবে না
✅ সঠিক পদ্ধতি:
-- যাদের ফোন নম্বর নেই
SELECT * FROM users WHERE phone IS NULL;
-- যাদের ফোন নম্বর আছে
SELECT * FROM users WHERE phone IS NOT NULL;
৩.৮ String Functions (API ডেভেলপমেন্টে লাগে)
ডেটাবেস থেকেই ডেটা সাজিয়ে আনলে ব্যাকএন্ড কোডে লুপ চালিয়ে প্রসেস করার দরকার হয় না।
CONCAT (জোড়া লাগানো):
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
UPPER & LOWER (ছোট/বড় হাতের লেখা):
SELECT UPPER(name) FROM users; -- সব বড় হাতের হয়ে যাবে
LENGTH (দৈর্ঘ্য মাপা):
SELECT name, LENGTH(name) FROM users;
REPLACE (স্ট্রিং পাল্টানো):
SELECT REPLACE(email, '@gmail.com', '') FROM users; -- শুধু ইউজারনেম দেখাবে
৩.৯ Date Functions (রিপোর্টিং হিরো)
NOW(): বর্তমান তারিখ ও সময়।
CURDATE(): শুধু বর্তমান তারিখ।
DATE(): datetime কলাম থেকে সময় বাদ দিয়ে শুধু তারিখ বের করা।
SELECT DATE(created_at) FROM orders;
DATE_ADD (ভবিষ্যতের ডেট):
৭ দিন পর সাবস্ক্রিপশন শেষ হবে?
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
DATEDIFF (পার্থক্য বের করা):
অফার আর কতদিন বাকি?
-- রিটার্ন করবে কত দিন বাকি আছে
SELECT DATEDIFF('2025-12-31', NOW());
৩.১০ Numeric Functions
ROUND: দশমিকের পর সংখ্যা ফিক্স করা।
SELECT ROUND(price, 2) FROM products; -- 10.567 -> 10.57
CEIL & FLOOR:
- CEIL(10.1) -> 11 (উপরের পূর্ণসংখ্যা)
- FLOOR(10.9) -> 10 (নিচের পূর্ণসংখ্যা)
ABS: নেগেটিভ ভ্যালুকে পজিটিভ করা।
৩.১১ Real-World Examples (Senior Level Logic)
এখন সব ফাংশন মিলিয়ে কিছু রিয়েল সিনারিও দেখি।
১. গত ৩০ দিনের সব অর্ডার বের করো:
SELECT * FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);
ব্যাখ্যা: DATE_SUB আজকের তারিখ থেকে ৩০ দিন পিছিয়ে যায়। তারপর আমরা চেক করি created_at তার চেয়ে বড় কি না।
২. বাংলাদেশ কিন্তু ঢাকা বাদে বাকি ইউজার:
SELECT * FROM users
WHERE country = 'Bangladesh'
AND city NOT IN ('Dhaka');
৩. ১০০০ থেকে ৫০০০ টাকার মধ্যে প্রোডাক্ট (কিন্তু ২ হাজার টাকার গুলো বাদ):
SELECT * FROM products
WHERE price BETWEEN 1000 AND 5000
AND price != 2000;
🎯 অধ্যায় ৩ এর সারাংশ (Summary)
এই অধ্যায়ে আপনি শিখলেন:
- ✓ Logic: AND, OR, NOT এবং ব্র্যাকেটের সঠিক ব্যবহার।
- ✓ Operators: IN এবং BETWEEN দিয়ে ক্লিন কোড লেখা।
- ✓ Search: LIKE (সিম্পল) বনাম REGEXP (কমপ্লেক্স) এবং ইনডেক্সিং টিপস।
- ✓ NULL: IS NULL এর সঠিক ব্যবহার।
- ✓ Functions: স্ট্রিং, ডেট এবং নাম্বার ফাংশন দিয়ে ডেটা প্রসেসিং ডেটাবেস লেভেলের করা।
✨ এখন আপনি শুধু ডেটা আনেন না, বরং ডেটাকে নিজের মতো করে ফিল্টার এবং ফরম্যাট করতে পারেন। পরবর্তী অধ্যায়ে আমরা শিখব Aggregate Functions & GROUP BY—যেখানে আমরা ডেটা দিয়ে রিপোর্ট তৈরি করা শুরু করব।