আগে গল্প, তারপর কোড
- ৫০,০০০ রেকর্ড থাকলে একজনকে কীভাবে খুঁজে বের করা যায়?
- প্রতিবার কি পুরো রেজিস্টার পড়তে হবে?
- Google Search যখন এক সেকেন্ডে লক্ষ কোটি পেজ থেকে উত্তর দেয় — সেটা কীভাবে সম্ভব?
বাস্তব জীবনে এই "খুঁজে বের করার" কাজটা প্রতিদিন হাজারো জায়গায় হচ্ছে:
| প্রতিষ্ঠান | কী খোঁজে | কতজনের মধ্যে থেকে |
|---|---|---|
| শিক্ষক | একজন নির্দিষ্ট শিক্ষার্থীর রেজাল্ট | পুরো ক্লাস/স্কুলের রেকর্ড |
| হাসপাতাল | একজন রোগীর ফাইল | হাজারো রোগীর রেকর্ড |
| Amazon | তোমার অর্ডার হিস্টরি | কোটি কোটি অর্ডার |
| তোমার প্রোফাইল তথ্য | শত কোটি ইউজার | |
| ব্যাংক | একটি অ্যাকাউন্টের ব্যালেন্স | লক্ষ লক্ষ অ্যাকাউন্ট |
এই প্রতিটি জায়গায় তথ্যগুলো একটা ডেটাবেজ-এ (Database) সাজানো থাকে — অনেকটা ডিজিটাল রেজিস্টারের মতো, কিন্তু হাজার গুণ দ্রুত খোঁজা যায়। আর এই "খোঁজার" কাজটা করার জন্য ডেটাবেজের নিজস্ব একটা ভাষা আছে, নাম SQL (Structured Query Language)। আর SQL-এর সবচেয়ে বেশি ব্যবহৃত কমান্ডটাই হলো — SELECT।
৫০,০০০ রেকর্ড
কী খুঁজছি বলো
শুধু যা দরকার
অর্থাৎ, SELECT হলো একটা প্রশ্ন করার নিয়ম। তুমি ডেটাবেজকে জিজ্ঞেস করো — "আমাকে এই তথ্যটা দাও" — আর ডেটাবেজ সাথে সাথে সেটা খুঁজে এনে দেয়। বাকি ক্লাসে আমরা ধাপে ধাপে শিখব কীভাবে এই প্রশ্ন করতে হয়।
শূন্য থেকে শুরু
SELECT হলো SQL-এর একটি কমান্ড যা দিয়ে আমরা ডেটাবেজের একটি টেবিল থেকে তথ্য "বেছে" (select করে) বের করে আনি। ইংরেজি শব্দ SELECT মানেই তো "বেছে নেওয়া" — এখানেও ঠিক তাই, অনেক ডেটার মধ্যে থেকে আমরা যেটুকু দরকার সেটুকু বেছে নিচ্ছি।
ধরে নিই আমাদের একটা Student নামের টেবিল আছে:
| Student_ID | Name | Class | Department | GPA |
|---|---|---|---|---|
| 101 | রাহাত করিম | ৯ | বিজ্ঞান | ৩.৪ |
| 102 | সাদিয়া আক্তার | ৯ | বিজ্ঞান | ৩.৯ |
| 103 | তানভীর হাসান | ৯ | বাণিজ্য | ৩.৭ |
| 104 | মিথিলা রহমান | ৯ | মানবিক | ৩.১ |
দুই ধরনের প্রয়োজন
সব ডেটা দরকার
সব শিক্ষার্থীর সব তথ্য একসাথে দেখতে চাই — রিপোর্ট বানানোর সময় যেমনটা লাগে।নির্দিষ্ট ডেটা দরকার
শুধু নাম আর বিভাগ জানতে চাই — বাকি কিছুর দরকার নেই।দুটোই SELECT দিয়েই সম্ভব — শুধু লেখার ধরন আলাদা হবে। এখন থেকে আমরা একে একে দুটোই শিখব।
তারকা চিহ্ন (*) মানে "সবকিছু"
SQL-এ * চিহ্নের মানে হলো "সব কলাম"। তাই SELECT * লিখলে ডেটাবেজ টেবিলের সবগুলো কলাম ফেরত দেয়।
সিনট্যাক্স
৫ কলাম
সব সারি
| Student_ID | Name | Class | Department | GPA |
|---|---|---|---|---|
| 101 | রাহাত করিম | ৯ | বিজ্ঞান | ৩.৪ |
| 102 | সাদিয়া আক্তার | ৯ | বিজ্ঞান | ৩.৯ |
| 103 | তানভীর হাসান | ৯ | বাণিজ্য | ৩.৭ |
| 104 | মিথিলা রহমান | ৯ | মানবিক | ৩.১ |
যা দরকার শুধু তা-ই আনো
শুধু নাম আর বিভাগ জানতে চাইলে কলামের নাম কমা (,) দিয়ে আলাদা করে লিখতে হয়:
| Name | Department |
|---|---|
| রাহাত করিম | বিজ্ঞান |
| সাদিয়া আক্তার | বিজ্ঞান |
| তানভীর হাসান | বাণিজ্য |
| মিথিলা রহমান | মানবিক |
একাধিক বিজনেস উদাহরণ
| প্রয়োজন | SQL |
|---|---|
| শুধু নাম দেখা | SELECT Name FROM Student; |
| নাম ও GPA দেখা | SELECT Name, GPA FROM Student; |
| কাস্টমারের নাম ও শহর | SELECT Name, City FROM Customer; |
| প্রোডাক্টের নাম ও দাম | SELECT ProductName, Price FROM Product; |
একই জিনিস বারবার কেন আসে?
আমাদের Student টেবিলে অনেক শিক্ষার্থী একই বিভাগে আছে — যেমন অনেকেই "বিজ্ঞান" বিভাগের। তাই যদি আমরা শুধু Department কলাম SELECT করি, তাহলে "বিজ্ঞান" শব্দটা বহুবার রিপিট হয়ে আসবে।
| Department |
|---|
| বিজ্ঞান |
| বিজ্ঞান |
| বাণিজ্য |
| মানবিক |
এখন যদি শুধু জানতে চাই — "স্কুলে মোট কয়টি ভিন্ন বিভাগ আছে?", তাহলে ডুপ্লিকেট বাদ দিতে হবে। এর জন্য DISTINCT কীওয়ার্ড ব্যবহার করি:
| Department |
|---|
| বিজ্ঞান |
| বাণিজ্য |
| মানবিক |
আরও উদাহরণ
- SELECT DISTINCT City FROM Customer; — কাস্টমাররা কোন কোন শহরে থাকে
- SELECT DISTINCT BloodGroup FROM Donor; — কোন কোন ব্লাড গ্রুপ ডেটাবেজে আছে
নির্দিষ্ট শর্তে রেকর্ড বাছাই
এখন পর্যন্ত আমরা সব রেকর্ড দেখেছি। কিন্তু বাস্তবে প্রশ্নগুলো হয় এমন — "শুধু বিজ্ঞান বিভাগের শিক্ষার্থী দেখাও", "GPA ৩.৫-এর বেশি যাদের", "শুধু ঢাকার কাস্টমার"। এই কাজটাই করে WHERE ক্লজ।
সিনট্যাক্স
কম্পারিজন অপারেটর
| অপারেটর | অর্থ | উদাহরণ |
|---|---|---|
| = | সমান | City = 'Dhaka' |
| > | বড় | Age > 20 |
| < | ছোট | Marks < 40 |
| >= | বড় বা সমান | GPA >= 3.5 |
| <= | ছোট বা সমান | Price <= 500 |
| != / <> | সমান নয় | Status != 'Cancelled' |
লজিক্যাল অপারেটর
| অপারেটর | ব্যবহার |
|---|---|
| AND | একাধিক শর্ত একসাথে সত্যি হতে হবে |
| OR | শর্তগুলোর যেকোনো একটি সত্যি হলেই হবে |
| NOT | শর্তটিকে উল্টে দেয় |
উদাহরণ ১ — বিভাগ অনুযায়ী ফিল্টার
| Name | Department |
|---|---|
| রাহাত করিম | বিজ্ঞান |
| সাদিয়া আক্তার | বিজ্ঞান |
ব্যাখ্যা: প্রথম দুই লাইন কোন কলাম, কোন টেবিল বলছে। তৃতীয় লাইনের WHERE শর্ত দিচ্ছে — শুধু যাদের Department কলামের মান 'বিজ্ঞান', তাদেরই আনো।
উদাহরণ ২ — GPA অনুযায়ী
| Name | GPA |
|---|---|
| সাদিয়া আক্তার | ৩.৯ |
| তানভীর হাসান | ৩.৭ |
উদাহরণ ৩ — AND দিয়ে একাধিক শর্ত
| Name | Department | GPA |
|---|---|---|
| সাদিয়া আক্তার | বিজ্ঞান | ৩.৯ |
ব্যাখ্যা: দুটো শর্তই — বিজ্ঞান বিভাগ এবং GPA ৩.৫-এর বেশি — একসাথে সত্যি হতে হবে, তাই মাত্র একজন শিক্ষার্থী মিলেছে।
উদাহরণ ৪ — OR দিয়ে
| Name | Department |
|---|---|
| তানভীর হাসান | বাণিজ্য |
| মিথিলা রহমান | মানবিক |
WHERE City = 'Dhaka' AND Age > 20 — এই শর্তে কারা আসবে? আর যদি AND-এর জায়গায় OR হতো, তাহলে ফলাফল কি বাড়ত না কমত?
ছোট থেকে বড়, বড় থেকে ছোট
রেজিস্টারের রেকর্ডগুলো প্রায়ই একটা নির্দিষ্ট ক্রমে দেখতে চাই — যেমন GPA অনুযায়ী সবচেয়ে ভালো ছাত্র থেকে শুরু করে, বা নাম বর্ণানুক্রমে। এই কাজটা করে ORDER BY।
| কীওয়ার্ড | অর্থ |
|---|---|
| ASC | ছোট থেকে বড় (Ascending) — এটাই ডিফল্ট |
| DESC | বড় থেকে ছোট (Descending) |
উদাহরণ — GPA অনুযায়ী সাজানো (বেশি থেকে কম)
| Name | GPA |
|---|---|
| সাদিয়া আক্তার | ৩.৯ |
| তানভীর হাসান | ৩.৭ |
| রাহাত করিম | ৩.৪ |
| মিথিলা রহমান | ৩.১ |
উদাহরণ — নাম বর্ণানুক্রমে
সব নয়, শুধু উপরের কয়েকটা
প্রায়ই ব্যবসায় সব ডেটা দরকার হয় না — শুধু "টপ ৫" বা "সাম্প্রতিক ২০টা" দরকার হয়। যেমন — সেরা ৫ জন শিক্ষার্থী, সর্বশেষ ২০টা অর্ডার। এর জন্য LIMIT ব্যবহার হয়।
উপরের queryটা প্রথমে GPA অনুযায়ী বড় থেকে ছোট সাজাবে, তারপর প্রথম ৫টা সারি দেখাবে।
| ব্যবসায়িক প্রয়োজন | SQL |
|---|---|
| সেরা ৫ শিক্ষার্থী | ... ORDER BY GPA DESC LIMIT 5; |
| প্রথম ১০ কাস্টমার | SELECT * FROM Customer LIMIT 10; |
| সাম্প্রতিক ২০ অর্ডার | ... ORDER BY OrderDate DESC LIMIT 20; |
একটি বিশ্ববিদ্যালয়ের ডেটা বিশ্লেষণ
১. সব শিক্ষার্থী দেখাও
২. শুধু নাম দেখাও
৩. শুধু CSE বিভাগের শিক্ষার্থী
৪. যাদের GPA ৩.৫০-এর বেশি
৫. কতগুলো ভিন্ন বিভাগ আছে
৬. GPA অনুযায়ী সাজানো
৭. সেরা ৫ শিক্ষার্থী
নিজে করে দেখা
ধরে নিচ্ছি তোমরা এখনো কোনোদিন SQL লেখোনি — তাই প্রতিটা ধাপ একদম শুরু থেকে দেখানো হলো।
ধাপ ১ — টেবিল তৈরি
লাইন-বাই-লাইন: CREATE TABLE মানে নতুন টেবিল বানাও। কোন কলামের নাম কী হবে আর তাতে কী ধরনের ডেটা (সংখ্যা/লেখা/দশমিক) থাকবে, তা বন্ধনীর ভেতর লেখা হয়েছে।
ধাপ ২ — নমুনা ডেটা যোগ করা
ধাপ ৩ থেকে ৯ — একে একে সব কমান্ড চালানো
| ধাপ | SQL | শেখা যায় |
|---|---|---|
| ৩ | SELECT * FROM Student; | সব ডেটা দেখা |
| ৪ | SELECT Name, GPA FROM Student; | নির্দিষ্ট কলাম |
| ৫ | SELECT DISTINCT Department FROM Student; | ডুপ্লিকেট বাদ |
| ৬ | ... WHERE GPA > 3.5; | ফিল্টার করা |
| ৭ | ... ORDER BY GPA DESC; | সাজানো |
| ৮ | ... LIMIT 2; | সীমিত ফলাফল |
| ৯ | WHERE...ORDER BY...LIMIT | সব একসাথে |
ধাপ ৯ — সব ক্লজ একসাথে ব্যবহার
| Name | Department | GPA |
|---|---|---|
| সাদিয়া আক্তার | বিজ্ঞান | ৩.৯ |
- কমান্ডের ক্রম ভুল হওয়া — সঠিক ক্রম সবসময় SELECT → FROM → WHERE → ORDER BY → LIMIT
- লেখা মানের চারপাশে কোটেশন (' ') না দেওয়া —
Department = বিজ্ঞানভুল,Department = 'বিজ্ঞান'ঠিক - প্রতিটা statement-এর শেষে সেমিকোলন (;) ভুলে যাওয়া
শুরুতে যেসব ভুল সবাই করে
| ভুল | সমাধান |
|---|---|
| FROM লিখতে ভুলে যাওয়া | মনে রাখো — SELECT একা অচল, তাকে সবসময় বলতে হয় কোন টেবিল থেকে আনবে (FROM) |
| কলামের নাম বানান ভুল | টেবিল বানানোর সময় যে বানানে কলাম লেখা হয়েছিল, ঠিক সেই বানানই ব্যবহার করো |
| = কে == ভাবা | SQL-এ সমান বোঝাতে একটাই = চিহ্ন, প্রোগ্রামিং-এর মতো == নয় |
| কোটেশন ভুল ব্যবহার | লেখা (text) মান সবসময় ' ' এর ভেতর, কিন্তু সংখ্যার দরকার নেই |
| অকারণে SELECT * | যা দরকার শুধু সেই কলাম নাম লেখো |
| ORDER BY ভুল জায়গায় বসানো | ক্রম মনে রাখো: SELECT → FROM → WHERE → ORDER BY → LIMIT |
| DISTINCT না বুঝে ব্যবহার | DISTINCT পুরো সারিকে ইউনিক করে, শুধু একটা কলামকে নয় — একাধিক কলাম দিলে পুরো কম্বিনেশন ইউনিক হবে |
| WHERE-এ ভুল শর্ত | প্রথমে কাগজে লিখে শর্তটা যাচাই করো, তারপর SQL-এ অনুবাদ করো |
প্রফেশনালরা যেভাবে SELECT ব্যবহার করেন
- শুধু দরকারি কলাম আনো — Data Analyst-রা কখনোই অকারণে সব কলাম টানেন না।
- প্রোডাকশনে SELECT * এড়িয়ে চলো — লাইভ সিস্টেমে এটা পারফরম্যান্স কমিয়ে দেয়।
- পড়ার মতো করে লেখো — প্রতিটা ক্লজ নতুন লাইনে লেখা, বড় হাতের কীওয়ার্ড (SELECT, WHERE) — এতে পরে অন্য কেউ কোড বুঝতে পারে।
- Alias ব্যবহারের প্রাথমিক পরিচয় — SELECT Name AS StudentName FROM Student; — কলামকে সাময়িক নতুন নাম দেওয়া যায়, রিপোর্ট বেশি পরিষ্কার দেখায়।
- আগেই ফিল্টার করো — WHERE দিয়ে যত আগে সম্ভব অপ্রয়োজনীয় ডেটা বাদ দাও, তাতে বাকি কাজ দ্রুত হয়।
- পারফরম্যান্স মাথায় রাখো (কনসেপ্ট) — বড় টেবিলে দ্রুত খোঁজার জন্য ডেটাবেজে "ইনডেক্স" ব্যবহার হয় — অনেকটা বইয়ের সূচিপত্রের মতো, যেটা পরের ক্লাসে বিস্তারিত শেখা যাবে।
করে দেখাও, বলে দেখাও
SELECT Name FROM Student WHERE GPA >= 3.5; — উপরের Student টেবিল থেকে ফলাফলে কারা কারা থাকবে বলো তো?SELECT Name FROM WHERE Department = 'CSE'; — এই queryটায় কী ভুল আছে?এক নজরে সবকিছু
কুইক রিভিশন নোট
| কমান্ড | কাজ |
|---|---|
| SELECT * | সব কলাম আনে |
| SELECT col1, col2 | নির্দিষ্ট কলাম আনে |
| DISTINCT | ডুপ্লিকেট বাদ দেয় |
| WHERE | শর্ত দিয়ে ফিল্টার করে |
| ORDER BY | ফলাফল সাজায় (ASC/DESC) |
| LIMIT | ফলাফলের সংখ্যা সীমিত করে |
মৌখিক (Viva) প্রশ্ন
- SELECT কী কাজ করে?
- SELECT * কেন সবসময় ভালো অভ্যাস না?
- DISTINCT আর সাধারণ SELECT-এর পার্থক্য কী?
- WHERE ক্লজ কোথায় বসে — SELECT-এর আগে না পরে?
- ORDER BY-তে ASC আর DESC-এর পার্থক্য কী?
MCQ (উত্তরসহ)
ক্লাসের অনুশীলন
- Student টেবিল থেকে শুধু "মানবিক" বিভাগের শিক্ষার্থীদের নাম আনো।
- GPA অনুযায়ী ছোট থেকে বড় সাজিয়ে সবাইকে দেখাও।
- প্রথম ৩ জন শিক্ষার্থীর নাম ও GPA আনো।
- কতটি ভিন্ন Class আছে তা বের করো।
বাড়ির কাজ
- সব কাস্টমার দেখাও।
- শুধু ঢাকার কাস্টমার দেখাও।
- যাদের TotalOrder ৫-এর বেশি, তাদের নাম দেখাও, বেশি থেকে কম সাজিয়ে।
- কতগুলো ভিন্ন শহর আছে বের করো।
SELECT কীভাবে ডেটা রিট্রিভালের ভিত্তি হয়ে উঠল
১৯৭০ সালে IBM-এর গবেষক Edgar F. Codd "Relational Model" নামে একটা ধারণা প্রকাশ করেন — ডেটাকে সারি ও কলামের টেবিলে সাজানোর পদ্ধতি। এর ভিত্তিতে তৈরি হয় SQL (প্রথমে নাম ছিল SEQUEL), যেখানে ডেটা আনার মূল কমান্ড হিসেবে বেছে নেওয়া হয় SELECT।
SELECT এতটা গুরুত্বপূর্ণ হয়ে ওঠার কারণ সহজ — যেকোনো সফটওয়্যার, ওয়েবসাইট বা অ্যাপের পেছনে সবচেয়ে বেশিবার যে কাজটা হয়, তা হলো "ডেটা দেখানো"। তুমি Facebook খুললে, ব্যাংকের অ্যাপে লগইন করলে, বা Google-এ কিছু সার্চ করলে — প্রতিটার পেছনেই লক্ষ লক্ষ বার SELECT চলে। তাই আজ প্রায় ৫০ বছর পরেও SELECT-ই থেকে গেছে ডেটা রিট্রিভালের ভিত্তি — কারণ এর ধারণাটা (শর্ত দিয়ে দরকারি ডেটা বেছে আনা) এখনো সবচেয়ে কার্যকর ও সরল সমাধান।
ইউজার থেকে আউটপুট পর্যন্ত
প্রশ্ন করে
query লেখা হয়
টেবিল স্ক্যান করে
WHERE শর্ত মেলে
ইউজার দেখে
ফিল্টারিং ও সর্টিং ওয়ার্কফ্লো
ডেটাবেজ ভেতরে ভেতরে একটা নির্দিষ্ট ক্রমে কাজ করে — এই ক্রমটা বুঝলে query লেখা অনেক সহজ হয়ে যায়:
টেবিল বেছে নাও
শর্তে ফিল্টার করো
কলাম বেছে নাও
সাজাও
সংখ্যা সীমিত করো
পাশাপাশি দেখে তফাত বোঝা
SELECT * বনাম নির্দিষ্ট কলাম
SELECT *
সব কলাম আনে, লেখা সহজ কিন্তু বড় টেবিলে ধীরগতির ও অপচয়ী।SELECT col1, col2
শুধু দরকারি কলাম আনে, দ্রুত ও প্রোডাকশনে নিরাপদ।WHERE বনাম HAVING (প্রাথমিক পরিচয়)
WHERE
টেবিলের আসল সারিগুলোকে গ্রুপ করার আগে ফিল্টার করে।HAVING
GROUP BY দিয়ে গ্রুপ করার পরে সেই গ্রুপগুলোকে ফিল্টার করে (এটা আমরা পরের ক্লাসে বিস্তারিত শিখব)।DISTINCT বনাম GROUP BY (প্রাথমিক পরিচয়)
DISTINCT
শুধু ডুপ্লিকেট বাদ দিয়ে ইউনিক মান দেখায়।GROUP BY
ইউনিক মান অনুযায়ী সারিগুলোকে দলবদ্ধ করে, যাতে প্রতিটা দলের উপর হিসাব (যোগফল, গড়) করা যায়।ASC বনাম DESC
ASC
ছোট থেকে বড়। যেমন GPA ১.০ থেকে ৪.০।DESC
বড় থেকে ছোট। যেমন GPA ৪.০ থেকে ১.০।LIMIT বনাম সব রেকর্ড আনা
LIMIT ব্যবহার
নির্দিষ্ট সংখ্যক ফলাফল — যেমন টপ ১০ — দ্রুত ও হালকা।সব রেকর্ড
পূর্ণ বিশ্লেষণের জন্য দরকার, কিন্তু বড় টেবিলে অনেক ধীর হতে পারে।ShopBD — একটি ছোট ই-কমার্স ডেটাবেজ
চলো একটা কাল্পনিক বাংলাদেশি ই-কমার্স কোম্পানি ShopBD-এর জন্য একটা Product টেবিল বানাই এবং তাতে আজকে শেখা সবগুলো SELECT অপারেশন প্রয়োগ করি।
| কাজ | SQL |
|---|---|
| সব প্রোডাক্ট দেখা | SELECT * FROM Product; |
| নাম ও দাম দেখা | SELECT ProductName, Price FROM Product; |
| কতগুলো ক্যাটাগরি আছে | SELECT DISTINCT Category FROM Product; |
| শুধু ইলেকট্রনিক্স পণ্য | SELECT * FROM Product WHERE Category = 'ইলেকট্রনিক্স'; |
| ১০০০ টাকার কমে যা আছে | SELECT * FROM Product WHERE Price < 1000; |
| দাম অনুযায়ী কম থেকে বেশি | SELECT * FROM Product ORDER BY Price ASC; |
| সবচেয়ে দামি ৩টি পণ্য | SELECT * FROM Product ORDER BY Price DESC LIMIT 3; |
| Stock কম (২০-এর নিচে) এমন পণ্য | SELECT ProductName, Stock FROM Product WHERE Stock < 20; |
প্রতিদিন যারা SELECT ব্যবহার করেন
| পেশা | SELECT দিয়ে যা করেন |
|---|---|
| Data Analyst | বিক্রয়, কাস্টমার আচরণ নিয়ে প্রশ্নের উত্তর খুঁজে রিপোর্ট বানান |
| Data Scientist | মডেল তৈরির আগে ডেটাবেজ থেকে প্রয়োজনীয় ডেটাসেট বের করে আনেন |
| Business Intelligence Analyst | ড্যাশবোর্ড ও ম্যানেজমেন্ট রিপোর্টের জন্য দৈনিক/মাসিক সংখ্যা টেনে আনেন |
| Database Administrator (DBA) | সিস্টেমের সমস্যা খুঁজতে ও পারফরম্যান্স পরীক্ষা করতে SELECT ব্যবহার করেন |
একটা সাধারণ দিনে একজন Data Analyst হয়তো জিজ্ঞেস করেন — "গত মাসে কোন প্রোডাক্ট সবচেয়ে বেশি বিক্রি হয়েছে?", "কোন শহরে সবচেয়ে বেশি অর্ডার এসেছে?" — এই প্রতিটা প্রশ্নের উত্তর একটা করে SELECT query।