ডাটাবেসের কোনো কলামে মাঝেমধ্যে তথ্যের অভাব দেখা দেয়—কর্মীর ঠিকানা এখনো দেওয়া হয়নি, বেতন নির্ধারণ হয়নি, অথবা ফোন নম্বর আপাতত অজানা। এই অজানা বা অনুপস্থিত মানকে SQL-এ NULL বলা হয়। NULL কোনো সংখ্যা (শূন্য) বা ফাঁকা স্ট্রিং (স্পেস) নয়—এটি সম্পূর্ণ আলাদা একটি ধারণা: অজানা। SQLite-তে NULL-এর সাথে তুলনা করা, ফিল্টার করা এবং আপডেট করার বিশেষ পদ্ধতি আছে। আজ আমরা NULL-এর সঠিক ব্যবহার ও এর সাথে যুক্ত সমস্যা ও সমাধান শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
COMPANYটেবিল সম্বলিত একটি ডাটাবেস দরকার। নতুন করেnull_demo.dbবানাই।
টার্মিনাল:
bash
sqlite3 null_demo.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);
- আউটপুট ফরম্যাট:
.header onও.mode column।
১. NULL কী এবং এটি কেন আলাদা
- NULL মানে কোনো মান নেই, তথ্য অনুপস্থিত, অজানা।
- এটি ০ (শূন্য) নয়: শূন্য একটি নির্দিষ্ট সংখ্যা।
- এটি ফাঁকা স্ট্রিং
''নয়: ফাঁকা স্ট্রিং একটি দৈর্ঘ্যহীন টেক্সট, কিন্তু তার অস্তিত্ব আছে।
গুরুত্বপূর্ণ: NULL-এর সাথে যেকোনো তুলনা ( = , != , > , < ) সবসময় UNKNOWN (অজানা) ফল দেয়, যা SQL-এ FALSE হিসেবে গণ্য হয়। তাই WHERE column = NULL কখনো কাজ করে না।
টেবিল তৈরির সময় যদি কোনো কলামে NOT NULL দেওয়া না থাকে, তবে সেটি NULL মান গ্রহণ করতে পারে। আমাদের টেবিলে ADDRESS ও SALARY তে NOT NULL নেই, তাই এ দুটি কলামে NULL রাখা যাবে।
২. NULL মান বসানো (UPDATE)
প্রথমে Kim এবং James-এর ADDRESS ও SALARY-কে NULL করে দিই:
sql
UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL WHERE ID IN (6, 7);
এখন টেবিলের চেহারা:
sql
SELECT * FROM COMPANY;
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 7 James 24
Kim ও James-এর ADDRESS এবং SALARY ফাঁকা দেখা যাচ্ছে—এগুলোই NULL।
৩. IS NULL ও IS NOT NULL দিয়ে ফিল্টার
NULL চেক করতে = বা != নয়, বরং IS NULL এবং IS NOT NULL ব্যবহার করতে হয়।
যাদের বেতন NULL (অর্থাৎ দেওয়া হয়নি):
sql
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NULL;
ফলাফল:
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 6 Kim 22 7 James 24
যাদের বেতন NULL নয় (যাদের বেতন সংরক্ষিত আছে):
sql
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NOT NULL;
ফলাফল:
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0
ভুল পদ্ধতি:
sql
SELECT * FROM COMPANY WHERE SALARY = NULL; -- কোনো সারি আসবে না!
৪. NULL-এর সাথে অন্যান্য অপারেটরের আচরণ
NULL যেকোনো গাণিতিক বা স্ট্রিং অপারেশনে NULL-ই তৈরি করে। যেমন:
sql
SELECT NAME, SALARY + 1000 AS INCREMENTED FROM COMPANY;
যেখানে SALARY NULL, সেখানে INCREMENTED-ও NULL হবে। কারণ অজানা + ১০০০ = অজানা।
তাছাড়া COUNT(*) NULL সহ সব সারি গণনা করে, কিন্তু COUNT(column) শুধু not-null সারি গণনা করে:
sql
SELECT COUNT(*) AS TOTAL_ROWS, COUNT(SALARY) AS SALARY_COUNT FROM COMPANY; -- TOTAL_ROWS = 7, SALARY_COUNT = 5 (কারণ 2টি NULL)
৫. NULL এবং ডিসটিঙ্কট
DISTINCT একাধিক NULL-কে একই মান হিসেবে বিবেচনা করে এবং মাত্র একটি NULL দেখায়:
sql
SELECT DISTINCT SALARY FROM COMPANY;
ফলাফলে একটি মাত্র NULL সারি দেখাবে।
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
ডাটাবেস ফাইল: null_demo.db। NULL কোনো বাড়তি ফাইল বা প্যাকেজ তৈরি করে না।
text
project-folder/ └── null_demo.db
৭. গুরুত্বপূর্ণ টিপস
- সর্বদা IS NULL / IS NOT NULL ব্যবহার করুন:
= NULLকখনো কাজ করে না, এটা সবার আগে মাথায় রাখতে হবে। - টেবিল ডিজাইনে সতর্কতা: যেসব কলামের ডেটা অপরিহার্য, সেখানে অবশ্যই
NOT NULLকনস্ট্রেইন্ট দিন। ঐচ্ছিক তথ্যের জন্যই কেবল NULL অনুমতি দেওয়া উচিত। - ডিফল্ট মান ব্যবহার: যদি সম্ভব হয়, NULL-এর বদলে ডিফল্ট মান (যেমন 0, ‘N/A’) ব্যবহার করা বিবেচনা করুন, তাহলে জটিলতা কমে।
- জয়েনে NULL: LEFT JOIN-এ ডান পাশে মিল না থাকলে কলামগুলো NULL হয়, যা পরে IS NULL দিয়ে ফিল্টার করে “কোথায় মিল নেই” বের করা যায়।
- NULL-এর জন্য ফাংশন: পরবর্তীতে
IFNULL()বাCOALESCE()ফাংশন দিয়ে NULL-কে অন্য কোনো মান দিয়ে প্রতিস্থাপন করা শিখব।
৮. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on .mode column -- প্রাথমিক টেবিল SELECT * FROM COMPANY; -- NULL মান আপডেট (আইডি ৬ ও ৭ এর ADDRESS ও SALARY NULL) UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL WHERE ID IN (6, 7); -- NULL বেতন চেক SELECT NAME FROM COMPANY WHERE SALARY IS NULL; -- NULL নয় এরূপ ঠিকানা চেক SELECT NAME, ADDRESS FROM COMPANY WHERE ADDRESS IS NOT NULL; -- COUNT দিয়ে NULL বনাম নট নাল গণনা SELECT COUNT(*) AS ALL_ROWS, COUNT(SALARY) AS SALARY_NOT_NULL FROM COMPANY; -- NULL-এর সাথে গাণিতিক অপারেশন (বেতন + ৫০০০) SELECT NAME, SALARY, SALARY + 5000 AS NEW_SALARY FROM COMPANY;
পরবর্তী পর্বে
আমরা শিখব SQLite Alias Syntax – কিভাবে টেবিল ও কলামের অস্থায়ী নাম দিয়ে কোয়েরি আরও পঠনযোগ্য করা যায়।
লেখকের কথা: NULL ছোট্ট একটি শব্দ, কিন্তু না বুঝলে বড় বড় ভুল হয়। বাংলায় SQLite শেখার এই যাত্রায় আপনি আমাদের সাথে থাকায় আমরা কৃতজ্ঞ। পোস্টটি ভালো লাগলে শেয়ার করতে ভুলবেন না। আর সম্পূর্ণ সিরিজের আপডেট পেতে 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
