একটি View (ভিউ) হলো ডাটাবেসে সংরক্ষিত একটি নামধারী SQL কোয়েরি, যা দেখতে অনেকটা টেবিলের মতোই কিন্তু প্রকৃতপক্ষে এটি একটি ভার্চুয়াল টেবিল। ভিউ নিজে কোনো ডেটা সংরক্ষণ করে না; বরং যখনই আপনি ভিউটি জিজ্ঞাসা করেন, এটি তার পেছনে থাকা SQL স্টেটমেন্টটি চালিয়ে ফলাফল উপস্থাপন করে। ভিউ ব্যবহারের কয়েকটি বড় সুবিধা হলো:
- জটিল কোয়েরিকে সহজ করা।
- নির্দিষ্ট ইউজারকে পুরো টেবিল না দেখিয়ে সীমিত ডেটা দেখানো (নিরাপত্তা)।
- বিভিন্ন টেবিল থেকে ডেটা সংক্ষেপে উপস্থাপন করা (রিপোর্টিং)।
তবে SQLite-তে ভিউ শুধুমাত্র পঠনযোগ্য (read-only)। আপনি সরাসরি ভিউর ওপর INSERT, UPDATE বা DELETE চালাতে পারবেন না (তবে ট্রিগার ব্যবহার করে সীমিতভাবে কাজ করানো যায়)।
আজ আমরা ভিউ তৈরি, ব্যবহার, এবং মুছে ফেলার পূর্ণাঙ্গ প্রক্রিয়া উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
COMPANYটেবিল ব্যবহার করব।views_demo.dbনামে ডাটাবেস প্রস্তুত করি।
টার্মিনাল:
bash
sqlite3 views_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।
১. CREATE VIEW – ভিউ তৈরি
ভিউ তৈরি করা অনেকটা CREATE TABLE-এর মতো, কিন্তু ডেটার বদলে একটি SELECT কোয়েরি সংরক্ষিত হয়।
সিনট্যাক্স:
sql
CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition;
TEMPবাTEMPORARYকীওয়ার্ড দিলে ভিউটি শুধুমাত্র বর্তমান ডাটাবেস সংযোগের জন্য তৈরি হয় এবং সংযোগ বন্ধ হলে মুছে যায়।view_name: ভিউর নাম।SELECTস্টেটমেন্ট: যেকোনো বৈধ SELECT কোয়েরি; এক বা একাধিক টেবিল থেকে, এমনকি অন্য ভিউ থেকেও।
উদাহরণ ১ – একক টেবিল থেকে সহজ ভিউ:
আমরা চাই COMPANY টেবিল থেকে শুধু ID, NAME, AGE দেখতে।
sql
CREATE VIEW COMPANY_VIEW AS SELECT ID, NAME, AGE FROM COMPANY;
এখন COMPANY_VIEW একটি ভার্চুয়াল টেবিলের মতো। আমরা জিজ্ঞাসা করতে পারি:
sql
SELECT * FROM COMPANY_VIEW;
ফলাফল:
text
ID NAME AGE ---------- ---------- ---------- 1 Paul 32 2 Allen 25 3 Teddy 23 4 Mark 25 5 David 27 6 Kim 22 7 James 24
উদাহরণ ২ – শর্তযুক্ত ভিউ:
শুধু তাদের দেখতে চাই যাদের বেতন ৩০,০০০-এর বেশি।
sql
CREATE VIEW HIGH_EARNERS AS SELECT NAME, SALARY FROM COMPANY WHERE SALARY > 30000;
sql
SELECT * FROM HIGH_EARNERS;
ফলাফল:
text
NAME SALARY ---------- ---------- Mark 65000.0 David 85000.0 Kim 45000.0
উদাহরণ ৩ – একাধিক টেবিল থেকে ভিউ (JOIN):
যদি DEPARTMENT নামে আরেকটি টেবিল থাকে, তাহলে:
sql
CREATE VIEW EMP_DEPT AS SELECT COMPANY.NAME, DEPARTMENT.DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
এখন SELECT * FROM EMP_DEPT; দিয়ে কর্মী ও তাদের বিভাগ দেখা যাবে।
২. টেম্পোরারি ভিউ (Temporary View)
টেম্পোরারি ভিউ শুধুমাত্র বর্তমান সংযোগে থাকে এবং সংযোগ বন্ধ হলে স্বয়ংক্রিয়ভাবে মুছে যায়।
sql
CREATE TEMP VIEW temp_high_salary AS SELECT NAME, SALARY FROM COMPANY WHERE SALARY > 80000;
এটি temp ডাটাবেসে সংরক্ষিত হয় এবং .quit করার সাথে সাথে আর থাকবে না। টেস্টিং বা সাময়িক কাজের জন্য ভালো।
৩. ভিউ-এর সীমাবদ্ধতা
- শুধু পঠনযোগ্য: SQLite-তে ভিউর ওপর
INSERT,UPDATE,DELETEসরাসরি চালানো যায় না। এটি একটি গুরুত্বপূর্ণ সীমাবদ্ধতা। - ট্রিগার দিয়ে কাজ করানো: তবে চাইলে আপনি ভিউর ওপর
INSTEAD OFট্রিগার তৈরি করে INSERT/UPDATE/DELETE ইভেন্টকে হাতের কাজে রূপান্তর করতে পারেন। - ভিউর ভেতর ORDER BY: ভিউতে
ORDER BYব্যবহার করলে বাইরের SELECT-এ তা অগ্রাহ্য হতে পারে, যদি না বাইরের SELECT-এORDER BYনা থাকে। সুতরাং সাধারণত ভিউতে ORDER BY না দেওয়াই ভালো (SQLite 3.33+ সংস্করণে কিছু পরিবর্তন এসেছে, তবে নির্ভরযোগ্য নয়)।
৪. ভিউ তালিকা দেখা
সমস্ত ভিউর নাম sqlite_master থেকে বের করা যায়:
sql
SELECT name FROM sqlite_master WHERE type = 'view';
এটি তৈরি করা সব ভিউর নাম দেখাবে (টেম্পোরারি বাদে, সেগুলো sqlite_temp_master-এ থাকে)।
৫. DROP VIEW – ভিউ মুছে ফেলা
যখন কোনো ভিউ আর প্রয়োজন নেই, তা মুছে ফেলতে DROP VIEW ব্যবহার করুন।
সিনট্যাক্স:
sql
DROP VIEW view_name;
উদাহরণ:
sql
DROP VIEW COMPANY_VIEW;
এখন COMPANY_VIEW আর কাজ করবে না। মনে রাখবেন, ভিউ মুছে ফেললে মূল টেবিলের কোনো ক্ষতি হয় না।
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
ডাটাবেস ফাইল: views_demo.db। ভিউ ডাটাবেসেরই অংশ, কোনো পৃথক ফাইল তৈরি করে না। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।
text
project-folder/ └── views_demo.db
৭. গুরুত্বপূর্ণ টিপস
- ভিউ দিয়ে জটিলতা লুকান: ইউজারকে জটিল JOIN বা সাবকোয়েরি না দেখিয়ে একটি সহজ নাম দিয়ে ভিউ দিন, তাহলে ডেটা অ্যাক্সেস সহজ হয়।
- নিরাপত্তার স্তর: সংবেদনশীল কলাম (যেমন বেতন) বাদ দিয়ে ভিউ তৈরি করে নির্দিষ্ট ইউজার গ্রুপকে শুধু প্রয়োজনীয় কলাম দেখাতে পারেন।
- পারফরম্যান্স: ভিউ স্বয়ংক্রিয়ভাবে দ্রুততর কিছু নয়; এটি কেবল একটি সঞ্চিত কোয়েরি। ভিউর পেছনের SELECT যত দ্রুত, ভিউও তত দ্রুত।
- ভিউর উপর ভিউ: এক ভিউ থেকে আরেক ভিউ তৈরি করা যায়, তবে জটিলতা বাড়তে পারে। খুব বেশি নেস্টিং পারফরম্যান্স কমাতে পারে।
- TEMP ভিউ: টেস্টিং বা এককালীন রিপোর্টিং-এর জন্য TEMP ভিউ ব্যবহার করুন, যাতে ডাটাবেস অপ্রয়োজনীয় ভিউতে ভরে না যায়।
৮. সম্পূর্ণ অনুশীলন সেশন
টার্মিনালে নিচের কোডগুলো চালান:
sql
.headers on .mode column -- ১. সহজ ভিউ তৈরি CREATE VIEW EMP_VIEW AS SELECT ID, NAME, AGE FROM COMPANY; -- ২. ভিউ থেকে ডেটা দেখি SELECT * FROM EMP_VIEW; -- ৩. শর্তযুক্ত ভিউ CREATE VIEW TEXAS_EMPS AS SELECT * FROM COMPANY WHERE ADDRESS = 'Texas'; SELECT * FROM TEXAS_EMPS; -- ৪. ভিউর তালিকা SELECT name FROM sqlite_master WHERE type = 'view'; -- ৫. টেম্পোরারি ভিউ (একটি) CREATE TEMP VIEW TEMP_SAMPLE AS SELECT NAME FROM COMPANY; SELECT * FROM TEMP_SAMPLE; -- ৬. ভিউ ড্রপ DROP VIEW EMP_VIEW; -- ৭. দেখি EMP_VIEW আর নেই SELECT name FROM sqlite_master WHERE type = 'view';
পরবর্তী পর্বে
আমরা শিখব SQLite Transactions – BEGIN, COMMIT, ROLLBACK দিয়ে ডেটা ইন্টিগ্রিটি রক্ষা করার কৌশল।
লেখকের কথা: ভিউ ডাটাবেস ডিজাইনকে আরও মার্জিত ও নিরাপদ করে তোলে। বাংলায় 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
