কখনো কখনো আমাদের একই ধরনের ডেটা একাধিক টেবিল বা একাধিক শর্ত থেকে আলাদা আলাদা SELECT করে আনতে হয়, এবং শেষে সেই সব ফলাফল একটি মাত্র ফলাফল সেট হিসেবে দেখতে চাই। SQLite-তে এই কাজটি করার জন্য UNION এবং UNION ALL অপারেটর ব্যবহার করা হয়। UNION দুটি বা ততোধিক SELECT স্টেটমেন্টের আউটপুটকে উল্লম্বভাবে (একটির নিচে আরেকটি) জুড়ে দেয়। আজকের পর্বে আমরা UNION-এর নিয়মকানুন, ডুপ্লিকেট সরানোর কৌশল এবং ব্যবহারিক উদাহরণ বিস্তারিত শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
- আমাদের পরিচিত
COMPANYএবংDEPARTMENTটেবিল ব্যবহার করব। তবে এবারDEPARTMENT-এ আরও কিছু রেকর্ড যোগ করতে হবে, যাতে UNION-এর ফল বোঝা যায়।union_demo.dbনামে ডাটাবেস তৈরি করি।
টার্মিনালে ডাটাবেস তৈরি:
bash
sqlite3 union_demo.db
sql
-- COMPANY টেবিল (আগের মতো) 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); -- DEPARTMENT টেবিল (বর্ধিত, প্রতিটি কর্মীর জন্য একটি করে বিভাগ) CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL ); INSERT INTO DEPARTMENT VALUES (1, 'IT Billing', 1); INSERT INTO DEPARTMENT VALUES (2, 'Engineering', 2); INSERT INTO DEPARTMENT VALUES (3, 'Finance', 7); INSERT INTO DEPARTMENT VALUES (4, 'Engineering', 3); INSERT INTO DEPARTMENT VALUES (5, 'Finance', 4); INSERT INTO DEPARTMENT VALUES (6, 'Engineering', 5); INSERT INTO DEPARTMENT VALUES (7, 'Finance', 6);
এখন COMPANY-তে ৭ জন কর্মী এবং DEPARTMENT-এ তাদের প্রত্যেকের জন্য একটি বিভাগ নির্ধারিত আছে (সবাই মিলেছে, ফলে INNER JOIN ও LEFT JOIN একই ফল দেবে ৭টি সারি)। UNION দেখানোর জন্য আমরা INNER JOIN ও LEFT JOIN কৃত্রিমভাবে আলাদা করে আবার মিলিয়ে দেখব, কিন্তু মূল বিষয় হলো দুটি SELECT-এর একত্রীকরণ।
- আউটপুট ফরম্যাট:
.header on,.mode column।
১. UNION-এর সিনট্যাক্স ও শর্ত
UNION অপারেটর ব্যবহার করতে হলে নিচের শর্তগুলো মেনে চলতে হবে:
- প্রতিটি SELECT স্টেটমেন্টে সমান সংখ্যক কলাম থাকতে হবে।
- কলামগুলোর ডেটা টাইপ মিলতে হবে (বা তুলনীয় হতে হবে)।
- কলামগুলোর ক্রম একই হতে হবে।
- প্রতিটি SELECT-এর কলামের দৈর্ঘ্য সমান না হলেও চলবে।
সিনট্যাক্স:
sql
SELECT column1, column2, ... FROM table1 [WHERE condition] UNION SELECT column1, column2, ... FROM table2 [WHERE condition];
UNION স্বয়ংক্রিয়ভাবে ডুপ্লিকেট সারি সরিয়ে দেয়। অর্থাৎ, একই সারি একাধিকবার এলে ফলাফলে শুধু একবার আসবে।
২. UNION উদাহরণ – ডুপ্লিকেট ছাড়া মেশানো
ধরা যাক আমরা প্রথমে INNER JOIN দিয়ে কর্মী ও তাদের বিভাগ বের করলাম। তারপর আবার LEFT OUTER JOIN দিয়েও একই তথ্য বের করলাম। বর্তমান ডেটায় সব কর্মীর বিভাগ আছে, তাই দুটি SELECT-ই একই ৭টি সারি দেবে। UNION ব্যবহার করলে ডুপ্লিকেট সরিয়ে ৭টি সারি ফিরবে।
sql
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID UNION SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
ফলাফল:
text
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Allen Engineering 3 Teddy Engineering 4 Mark Finance 5 David Engineering 6 Kim Finance 7 James Finance
যদি LEFT JOIN-এ কোনো NULL থাকত, সেগুলোও ডুপ্লিকেট বাদ দিয়ে আসত। মূল বিষয়: UNION ডুপ্লিকেট দূর করে।
৩. UNION ALL – ডুপ্লিকেটসহ সব রেকর্ড
কখনো কখনো আমরা চাই ডুপ্লিকেট রাখতেও। তখন UNION ALL ব্যবহার করতে হবে। এটি কোনো ডুপ্লিকেট সরায় না; ঠিক যত সারি আসে, ততই জোড়া দেয়।
সিনট্যাক্স:
sql
SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2;
উদাহরণ: উপরের একই কোয়েরি UNION ALL-এর মাধ্যমে চালালে ১৪টি সারি আসবে (প্রথম SELECT-এর ৭ + দ্বিতীয় SELECT-এর ৭)।
sql
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID UNION ALL SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
ফলাফল: প্রতিটি সারি দুইবার করে আসবে (মোট ১৪টি)।
ব্যবহার: যখন আপনি নিশ্চিত যে কোনো ডুপ্লিকেট নেই, অথবা ডুপ্লিকেট রেখে মোট গণনা করতে চান, তখন UNION ALL ব্যবহার করুন। এটি UNION-এর চেয়ে দ্রুত, কারণ ডুপ্লিকেট চেক করতে হয় না।
৪. বাস্তব দৃশ্যপট: ভিন্ন শর্তে ডেটা একত্রিত
ধরা যাক, আমরা চাই এমন একটি তালিকা যেখানে কিছু কর্মীর বেতন ৬০,০০০-এর বেশি এবং কিছু কর্মীর বয়স ২৫-এর কম – কিন্তু একই ফলাফলে দেখতে চাই।
sql
SELECT NAME, SALARY, 'High Earner' AS Category FROM COMPANY WHERE SALARY > 60000 UNION SELECT NAME, SALARY, 'Young' FROM COMPANY WHERE AGE < 25;
এখানে প্রথম SELECT কলামগুলোতে একটি এক্সট্রা ক্যাটাগরি কলাম দিচ্ছে, দ্বিতীয় SELECT-ও তাই। কলাম সংখ্যা ও ক্রম মিলছে (NAME, SALARY, Category)।
ফলাফল:
text
NAME SALARY Category ---------- ---------- ---------- Mark 65000.0 High Earner David 85000.0 High Earner Teddy 20000.0 Young Kim 45000.0 Young James 10000.0 Young
(Mark এবং David উভয়ই High Earner; তরুণদের মধ্যে Teddy, Kim, James আছে। কেউ একাধিক শর্তে পড়লে UNION তাকে একবারই দেখাবে।)
৫. UNION বনাম JOIN পার্থক্য
অনেকেই UNION ও JOIN গুলিয়ে ফেলেন। সহজ নিয়ম:
- JOIN টেবিলের কলাম পাশাপাশি (অনুভূমিকভাবে) যোগ করে।
- UNION সারি নিচের দিকে (উল্লম্বভাবে) যোগ করে।
উদাহরণ: দুটি টেবিলের ডেটা একটির নিচে আরেকটি বসাতে UNION; আর সম্পর্কিত কলাম একই সারিতে আনতে JOIN।
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
আমাদের ডাটাবেস ফাইল union_demo.db। UNION কোনো বাড়তি ফাইল তৈরি করে না। কোনো বিশেষ প্যাকেজের প্রয়োজন নেই।
text
project-folder/ └── union_demo.db
৭. গুরুত্বপূর্ণ টিপস
- ORDER BY: UNION-এর শেষে ORDER BY ব্যবহার করা যায়, কিন্তু তা সম্পূর্ণ ফলাফলের উপর কাজ করবে। প্রতিটি SELECT-এ আলাদা ORDER BY দিতে চাইলে সাবকোয়েরি ব্যবহার করতে হবে।
- কলাম নাম: UNION-এর চূড়ান্ত কলামের নাম প্রথম SELECT থেকে নেওয়া হয়। তাই প্রথম SELECT-এ অর্থবহ অ্যালিয়াস দিন।
- পারফরম্যান্স: UNION ALL দ্রুত, কারণ এটি ডুপ্লিকেট খোঁজে না। যদি আপনি নিশ্চিত হন যে সারি ইউনিক, তবে UNION ALL-ই ব্যবহার করবেন।
- সব SELECT-এ সমান কলাম: যদি একটি SELECT-এ কম কলাম দিতে হয়, তাহলে NULL বা স্থির মান (যেমন
'N/A') বসিয়ে কলাম সংখ্যা মিলান। - UNION-এ NULL: UNION NULL-কে ডুপ্লিকেট হিসেবে বিবেচনা করে? হ্যাঁ, একাধিক NULL থাকলে UNION কেবল একটি NULL সারি রাখবে, কারণ NULL = NULL সমীকরণ UNION-এর ডুপ্লিকেট চেকের সময় সত্য ধরা হয় (ডুপ্লিকেট হিসেবে গণ্য হয়)।
৮. সম্পূর্ণ অনুশীলন সেশন
টার্মিনালে নিচের কমান্ডগুলো চালান:
sql
.headers on .mode column -- সম্পূর্ণ COMPANY ও DEPARTMENT দেখি SELECT * FROM COMPANY; SELECT * FROM DEPARTMENT; -- UNION দিয়ে INNER এবং LEFT JOIN এর ফল একত্র (ডুপ্লিকেট বাদ) SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID UNION SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; -- UNION ALL দিয়ে একই কাজ (ডুপ্লিকেট সহ) SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID UNION ALL SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; -- বাস্তব উদাহরণ: উচ্চ বেতন ও তরুণ কর্মী এক তালিকায় SELECT NAME, SALARY, 'High' AS Type FROM COMPANY WHERE SALARY > 50000 UNION SELECT NAME, SALARY, 'Young' FROM COMPANY WHERE AGE < 25;
পরবর্তী পর্বে
আমরা শিখব SQLite NULL Values – NULL-এর সঠিক ব্যবহার এবং NULL সম্পর্কিত ফাংশন।
লেখকের কথা: UNION দিয়ে ডেটা ম্যানিপুলেশনের দরজা আরও খুলে যায়। বাংলায় প্রযুক্তি শেখার এই ধারা বজায় রাখতে আপনার শেয়ার, কমেন্ট ও উৎসাহ আমাদের অনুপ্রেরণা। পোস্টটি ভালো লাগলে বন্ধুদের জানাতে ভুলবেন না! সিরিজের সব পর্ব পেতে 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
