ডাটাবেসে প্রায়ই একই ধরনের ডেটা বারবার আসে – যেমন একই নামের একাধিক কর্মী, একই শহরের ঠিকানা, কিংবা একই বেতনের রেকর্ড। যখন আমরা শুধু জানতে চাই “কোন কোন নাম আছে” বা “কোন কোন শহর থেকে কর্মীরা এসেছে”, তখন পুনরাবৃত্তি না দেখিয়ে শুধু একটি করে মান দেখানোই যথেষ্ট। SQLite-তে এই কাজটি করে DISTINCT কীওয়ার্ড। এটি SELECT স্টেটমেন্টের পরপরই বসে এবং ফলাফল থেকে ডুপ্লিকেট সারি সরিয়ে শুধুমাত্র ইউনিক সমন্বয় ফেরত দেয়। আজকের পর্বে আমরা DISTINCT-এর সিনট্যাক্স, ব্যবহারিক উদাহরণ, একাধিক কলামে এর আচরণ, এবং GROUP BY-এর সাথে পার্থক্য বিস্তারিতভাবে শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
company.dbডাটাবেসেCOMPANYটেবিল (যেখানে ডুপ্লিকেট নাম আছে)। না থাকলে নিচের স্ক্রিপ্ট চালিয়ে তৈরি করুন:
bash
sqlite3 company.db
sql
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00); INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00); INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00); INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00); INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00); INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00); INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00); INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00); INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00); INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
- আউটপুট সুন্দর করতে:
.header onএবং.mode column।
১. DISTINCT-এর সিনট্যাক্স
sql
SELECT DISTINCT column1, column2, ... FROM table_name WHERE condition;
- DISTINCT কীওয়ার্ডটি
SELECT-এর ঠিক পরে বসে। - এরপর এক বা একাধিক কলামের নাম দেওয়া যায়। DISTINCT প্রতিটি সারির সমন্বয় (row combination) বিবেচনা করে। যদি একাধিক কলাম দেওয়া হয়, তবে সেই কলামগুলোর মানের পুরো সেটটি ইউনিক কিনা দেখবে।
WHEREশর্ত থাকলে আগে ফিল্টার হবে, তারপর DISTINCT কাজ করবে।
২. একক কলামে DISTINCT-এর উদাহরণ
প্রথমে দেখি ডুপ্লিকেট অবস্থা কেমন:
sql
SELECT NAME FROM COMPANY;
ফলাফল:
text
NAME ---------- Paul Allen Teddy Mark David Kim James Paul James James
Paul ও James একাধিকবার এসেছে।
এখন DISTINCT ব্যবহার করি:
sql
SELECT DISTINCT NAME FROM COMPANY;
ফলাফল:
text
NAME ---------- Paul Allen Teddy Mark David Kim James
প্রতিটি নাম মাত্র একবার দেখাচ্ছে।
৩. একাধিক কলামে DISTINCT
যখন একাধিক কলাম নির্দিষ্ট করি, তখন DISTINCT সেই কলামগুলোর কম্বিনেশন দেখবে। যদি দুটি সারির সবগুলো কলামের মান হুবহু মিলে যায়, তবেই সেটি ডুপ্লিকেট হিসেবে গণ্য হবে এবং একটি সরিয়ে দেওয়া হবে।
sql
SELECT DISTINCT NAME, AGE FROM COMPANY;
এখন (Paul, 32) এবং (Paul, 24) ভিন্ন, তাই দুটোই থাকবে। কিন্তু (James, 24) একটি রেকর্ড, আবার কোনো (James, 24) ডুপ্লিকেট নেই, তাই এটিও থাকবে। মোট সারির সংখ্যা হবে 10টির কম, কারণ একই (NAME, AGE) জুটি থাকলে ডুপ্লিকেট সরবে। আমাদের ডেটায় এমন কোনো ডুপ্লিকেট জুটি নেই, তাই আউটপুট 10টি সারিই আসবে। যদি একই নামের ও বয়সের দুটি রেকর্ড থাকত, তবে একটি বাদ যেত।
উদাহরণ: ধরুন, দুটি ('James', 45) রেকর্ড থাকত, তবে DISTINCT NAME, AGE করলে একটি সরিয়ে ফেলত।
৪. DISTINCT-এর সাথে WHERE ও ORDER BY
DISTINCT অন্যান্য ক্লজের সাথে একত্রে কাজ করে।
- WHERE দিয়ে ফিল্টার করে তারপর DISTINCT:
sql
SELECT DISTINCT ADDRESS FROM COMPANY WHERE AGE > 25;
এটি AGE > 25 এমন সব রেকর্ডের মধ্যে থেকে অনন্য ঠিকানা বের করবে।
- ORDER BY দিয়ে সাজানো:
sql
SELECT DISTINCT NAME FROM COMPANY ORDER BY NAME DESC;
নামগুলো উল্টো ক্রমে আসবে: Teddy, Paul, Mark, Kim, James, David, Allen.
৫. DISTINCT ও GROUP BY-এর পার্থক্য
অনেকেই DISTINCT-কে GROUP BY-এর বিকল্প ভাবেন। উভয়ই ডুপ্লিকেট দূর করতে পারে, কিন্তু পার্থক্য আছে:
- DISTINCT শুধুমাত্র ইউনিক সারি বের করে, কোনো অ্যাগ্রিগেট ফাংশন (SUM, COUNT) দেয় না।
- GROUP BY গ্রুপ তৈরি করে এবং তার উপর অ্যাগ্রিগেট ফাংশন প্রয়োগ করা যায়। সাধারণ ইউনিক মান পেতে
GROUP BY columnলিখলেও একই ফলাফল আসে, তবে GROUP BY-তে অ্যাগ্রিগেটের সুযোগ থাকে।
sql
SELECT NAME FROM COMPANY GROUP BY NAME; -- DISTINCT-এর মতোই ইউনিক নাম দেবে
কিন্তু যদি আপনি প্রতিটি নামের সাথে কতবার এসেছে তা চান, তবে GROUP BY + COUNT লাগবে, DISTINCT তা পারে না।
তুলনা:
| বৈশিষ্ট্য | DISTINCT | GROUP BY |
|---|---|---|
| ডুপ্লিকেট অপসারণ | হ্যাঁ | হ্যাঁ |
| অ্যাগ্রিগেট ফাংশন | না | হ্যাঁ |
| ফলাফল | শুধুমাত্র কলামের অনন্য মান | গ্রুপ ভিত্তিক ডেটা (অ্যাগ্রিগেট সহ) |
| ব্যবহারের ক্ষেত্র | দ্রুত ইউনিক তালিকা | বিশ্লেষণমূলক রিপোর্ট |
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
এই অনুশীলনের জন্য শুধুমাত্র company.db ফাইলটি প্রয়োজন। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না। DISTINCT সম্পূর্ণরূপে SQLite-এর মৌলিক SQL সাপোর্টের অংশ।
৭. গুরুত্বপূর্ণ টিপস
- পারফরম্যান্স: DISTINCT বড় টেবিলে ধীরগতি সৃষ্টি করতে পারে, কারণ এটি সমস্ত সারি কম্পেয়ার করে। দরকার হলে ইনডেক্স ব্যবহার করুন।
- NULL এর সাথে DISTINCT: DISTINCT একাধিক NULL-কে একই মান হিসেবে গণ্য করে, তাই NULL একটি মাত্র সারিতে আসবে।
- DISTINCT-এর অবস্থান: শুধু SELECT এর পরে।
SELECT DISTINCTছাড়া অন্য কোনো স্টেটমেন্টে (যেমন UPDATE, DELETE) DISTINCT ব্যবহার করা যায় না। - DISTINCTROW: SQLite
DISTINCTROWকীওয়ার্ড সমর্থন করে, যাDISTINCT-এর মতোই, কিন্তুDISTINCTব্যবহার করাই স্ট্যান্ডার্ড।
৮. সম্পূর্ণ অনুশীলন সেশন
টার্মিনালে নিচের কমান্ডগুলো চালিয়ে দেখুন:
sql
.headers on .mode column -- ইউনিক নাম SELECT DISTINCT NAME FROM COMPANY; -- ইউনিক শহর SELECT DISTINCT ADDRESS FROM COMPANY; -- নাম ও বয়সের ইউনিক জুটি SELECT DISTINCT NAME, AGE FROM COMPANY; -- যাদের বেতন 20000-এর বেশি, তাদের ইউনিক নাম SELECT DISTINCT NAME FROM COMPANY WHERE SALARY > 20000; -- ইউনিক বেতনের তালিকা, বড় থেকে ছোট SELECT DISTINCT SALARY FROM COMPANY ORDER BY SALARY DESC;
পরবর্তী পর্বে
আমরা SQLite PRAGMA স্টেটমেন্ট নিয়ে শিখব – ডাটাবেসের বিভিন্ন সেটিংস ও মেটাডেটা কিভাবে দেখা ও পরিবর্তন করা যায়।
লেখকের কথা: DISTINCT ছোট্ট কিন্তু অত্যন্ত দরকারি একটি ফিচার। বাংলায় প্রযুক্তি শেখার এই ধারা অব্যাহত রাখতে আপনার শেয়ার ও উৎসাহ আমাদের পাথেয়। পোস্টটি ভালো লাগলে বন্ধুদের সাথে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com ব্লগে সাবস্ক্রাইব করতে ভুলবেন না। আপনার প্রশ্ন বা মন্তব্য জানাতে কমেন্ট করুন – আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
