6.3.1 কুয়েরি ব্যবহার

টেবিল তৈরি

স্কুলের ডেটাবেজে আমরা বিভিন্ন টেবিল তৈরি করব। প্রথমেই ধরা যাক শিক্ষার্থীর টেবিল। শিক্ষার্থীর টেবিলে কী কী তথ্য থাকতে পারে? (আমরা তথ্যগুলোর পাশে ব্রাকেটে ইংরেজি শব্দটিও লিখব যেন এসকিউলাইটে টেবিল তৈরির সময় আমরা সেটি ব্যবহার করতে পারি)।

  • শিক্ষার্থীর নাম (NAME)
  • কোন শ্রেণিতে পড়ে (CLASS)
  • শিক্ষার্থীর রোল নম্বর (ROLL)
  • কোন শাখার অন্তর্ভুক্ত (দিবা বা প্রভাতি, কিংবা ক, খ, গ ইত্যাদি) (SECTION)

টেবিল তৈরি করার জন্য CREATE TABLE কুয়েরি ব্যবহার করতে হবে। এই কুয়েরি লেখার নিয়ম (সিনট্যাক্স / SYNTAX) হচ্ছে এরকম-

CREATE TABLE TABLE_NAME (COLUMN_NAME COLUMN_TYPE, …..);

এখানে TABLE_NAME-এর জায়গায় যেই টেবিল তৈরি করা হবে, তার নাম লিখতে হবে। আর প্রথম বন্ধনীর ভেতরে প্রতিটি কলামের নাম ও একটি স্পেস দিয়ে সেই কলামের ডেটা টাইট লিখতে হবে। আর একাধিক কলামের তথ্য কমা দিয়ে পৃথক করা থাকবে।

উপরে পরিকল্পিত STUDENT টেবিল তৈরি করতে হলে লিখতে হবে-

CREATE TABLE STUDENT (NAME TEXT, CLASS INTEGER, ROLL INTEGER, SECTION TEXT);

কোনো টেবিল মুছে ফেলতে হলে DROP TABLE কুয়েরি ব্যবহার করতে হবে-

DROP TABLE table-name;

যেমন- STUDENT টেবিলটি মুছে ফেলতে হলে লিখতে হবে,

DROP TABLE STUDENT;

এখন আবার CREATE TABLE কুয়েরি ব্যবহার করে টেবিলটি আবার তৈরি করা যাবে।

নোট: এসকিউএল কমান্ডগুলো ইংরেজি বড় হাতের অক্ষরে বা ছোট হাতের অক্ষরে উভয়ভাবেই লেখা যায়। অর্থাৎ CREATE বা create দুটিই একই কমান্ড বোঝায়। তবে, প্রচলিত রীতি হচ্ছে ইংরেজি বড় হাতের অক্ষর ব্যবহার করে লেখা।

টেবিলে ডেটা রাখা ও টেবিল থেকে ডেটা পড়া

কোনো টেবিলে ডেটা রাখতে চাইলে, INSERT কুয়েরি ব্যবহার করতে হবে। এই কুয়েরি লেখার নিয়ম হচ্ছে,

INSERT INTO টেবিলের নাম (প্রথম কলামের নাম, দ্বিতীয় কলামের নাম, তৃতীয় কলামের নাম …) VALUES (প্রথম কলামের ডেটা, দ্বিতীয় কলামের ডেটা, তৃতীয় কলামের ডেটা …);

যেমন- student টেবিলে Mizanur Rahman নামের একজন শিক্ষার্থী, যে কি না নবম শ্রেণির morning শাখায় পড়ে এবং রোল নম্বর 3, তার তথ্য রাখতে হলে নিচের মতো করে কুয়েরি লিখতে হবে-

INSERT INTO student (name, class, roll, section) VALUES
('Mizanur Rahman', 9, 3, 'morning');

টেবিলে ডেটা ঠিকমতো রাখা হলো কি না, সেটি দেখার জন্য এখন টেবিলের ডেটা পড়া হবে। সেজন্য SELECT কুয়েরি লিখতে হবে। এই কুয়েরি লেখার নিয়ম হচ্ছে-

SELECT [কলামের নাম] কিংবা * FROM [টেবিলের নাম]; (একাধিক কলামের জন্য প্রতিটি কলামের নাম কমা দিয়ে পৃথক করে দিতে হবে)

SELECT * FROM student;
নোট: এসকিউলাইট কমান্ড লাইনে ‍SELECT কুয়েরি-এর আউটপুট সুন্দর করে দেখতে চাইলে নিচের কমান্ড দুটি আগে দিতে হবে,
.mode column
.headers on
select * from student;

আবার যদি শুধু নাম আর শ্রেণি দেখতে চাই, তাহলে লিখতে হবে-
SELECT name, class FROM student;

পরবর্তী কিছু কাজের সুবিধার জন্য student টেবিলে আরো কিছু ডেটা রাখতে হবে।

INSERT INTO student (name, class, roll, section) VALUES
('Mosharraf Hossain', 9, 4, 'morning');
INSERT INTO student (name, class, roll, section) VALUES
('David Pandey', 9, 2, 'morning');
INSERT INTO student (name, class, roll, section) VALUES
('Promila Gosh', 8, 2, 'day');
INSERT INTO student (name, class, roll, section) VALUES
('Bazlur Rahman', 8, 1, 'day');
INSERT INTO student (name, class, roll, section) VALUES
('Sourav Das', 9, 1, 'day');
INSERT INTO student (name, class, roll, section) VALUES
('Tamanna Nishat', 10, 1, 'morning');
INSERT INTO student (name, class, roll, section) VALUES
('Maysha', 10, 1, 'day');

এরকম কিছু ডেটা টেবিলে রাখার পরে আবার SELECT কুয়েরি ব্যবহার করে দেখতে হবে যে টেবিলে ডেটা আছে কি না। টার্মিনালে অনেক সময় কোনো ফিল্ডের নাম বেশি বড় হলে পুরোটা নাও দেখাতে পারে।

টেবিল থেকে ডেটা পড়া বা দেখার জন্য SELECT কুয়েরিতে বিভিন্ন শর্তও জুড়ে দেওয়া যায়। সেজন্য WHERE লিখে তারপরে শর্ত লিখতে হবে। নিচে বিভিন্ন উদাহরণ দেখানো হলো- কেবল নবম শ্রেণির শিক্ষার্থীদের তথ্য দেখতে হলে লিখতে হবে-

SELECT * FROM student WHERE class = 9;

এখানে শর্ত লেখা হয়েছে class = 9 অর্থাৎ class কলামের মান হতে হবে 9। SQL-এ দুটি মান তুলনা করার জন্য নিচের অপারেটরগুলো ব্যবহার করা হয়-

অপারেটরবর্ণনা
=সমান
<>সমান নয়
>বড় (বামপক্ষ ডানপক্ষের চেয়ে বড়)
>=বড় কিংবা সমান (বামপক্ষ ডানপক্ষের চেয়ে বড় বা সমান)
<ছোট (বামপক্ষ ডানপক্ষের চেয়ে ছোট)
<=ছোট কিংবা সমান (বামপক্ষ ডানপক্ষের চেয়ে ছোট বা সমান)

আবার যেসব শিক্ষার্থী morning শাখায়, তাদের তথ্য দেখতে হলে লিখতে হবে।

SELECT * FROM student WHERE section = 'morning';
নোট : টেক্সট টাইপের ডেটা নিয়ে কাজ করার সময় শুরুতে ও শেষে কোটেশন চিহ্ন (‘ চিহ্ন) ব্যবহার করতে হবে। অর্থাৎ নিচের মতো কুয়েরি লিখলে হবে না।
SELECT * FROM student WHERE section = morning;

একাধিক শর্ত একসঙ্গে জুড়ে দিতে চাইলে AND অথবা OR ব্যবহার করে কাজটি করা যায়। নবম শ্রেণি এবং morning শাখার শিক্ষার্থীদের তথ্য পেতে চাইলে লিখতে হবে-

SELECT * FROM student WHERE class = 9 AND section = 'morning';

নবম শ্রেণি অথবা morning শাখার শিক্ষার্থীদের তথ্য পেতে চাইলে লিখতে হবে-

SELECT * FROM student WHERE class = 9 OR section = 'morning';

নবম শ্রেণিতে পড়ে না এবং morning শাখার শিক্ষার্থীদের তথ্য দেখার জন্য নিচের কুয়েরি লিখতে হবে-

SELECT * FROM student WHERE class <> 9 AND section = 'morning';

অষ্টম নবম কিংবা দশম শ্রেণির শিক্ষার্থীদের তথ্য পাওয়ার জন্য কুয়েরি লিখতে হবে-

SELECT * FROM student WHERE class = 8 OR class = 9 OR class = 10;

উপরের কুয়েরিটি অন্যভাবেও লেখা যায়-

SELECT * FROM student WHERE class IN (8, 9, 10);

ডেটা মুছে ফেলা ও পরিবর্তন করা

ধরা যাক, student টেবিলে একটি নতুন রেকর্ড যোগ করা হলো-

INSERT INTO student (name, class, roll, section) VALUES ('Fardeem Munir', 10, 1, 'day');

এখন টেবিলে day শাখার দশম শ্রেণির রোল নম্বর এক, এরকম দুইজন শিক্ষার্থী দেখা যাচ্ছে।

SELECT name FROM student WHERE class = 10 AND roll = 1 AND section = 'day';

তাহলে নতুন যোগ করা রেকর্ডটি সঠিক নয়, কিংবা আগের রেকর্ডটি সঠিক নয়। নতুন রেকর্ডটি অর্থাৎ Fardeem Munir নামের শিক্ষার্থীর রেকর্ডটি মুছে ফেলতে হলে, DELETE কুয়েরি ব্যবহার করতে হবে। এটি লেখার নিয়ম হচ্ছে-

DELETE FROM [টেবিলের নাম] WHERE [শর্ত]

নিচের কুয়েরি চালালে Fardeem Munir-এর রেকর্ড মুছে যাবে-

DELETE FROM student WHERE name = 'Fardeem Munir';

তবে উপরের কুয়েরিটি চালালে student টেবিলে name কলামের যতগুলো রেকর্ড Fardeem Munir হবে, সব রেকর্ড মুছে যাবে। তাই কোনো নির্দিষ্ট রেকর্ড ফেলার জন্য একটু সতর্কতা অবলম্বন করতে হয়। যেমন, এই কুয়েরিতে নামের সঙ্গে আরো শর্ত জুড়ে দেওয়া যায়-

DELETE FROM student WHERE name = 'Fardeem Munir' AND class = 10 AND roll = 1 AND section = 'day';

অনেক সময় কোনো রেকর্ড পরিবর্তন বা হালনাগাদ করার প্রয়োজন হয়। এই কাজটি করা যায় UPDATE কুয়েরি ব্যবহার করে। এই কুয়েরি লেখার নিয়ম হচ্ছে-

UPDATE [টেবিলের নাম] SET [কলামের নাম] = নতুন ডেটা (একাধিক কলাম হলে কমা দিয়ে তারপরে আবার [কলামের নাম] = নতুন ডেটা)WHERE [শর্ত]
ধরা যাক, ডেটাবেজে নিচের তথ্য রাখা হলো-

INSERT INTO student (name, class, roll, section) VALUES ('Fardeem Munir', 1, 1, 'day');

তারপর দেখা গেল, Fardeem Munir আসলে দশম শ্রেণির শিক্ষার্থী এবং তার রোল নম্বর 3। তখন রেকর্ডটি মুছে না ফেলে আপডেট করা যায়।

UPDATE student SET class = 10, roll = 3 WHERE name = 'Fardeem Munir';

একাধিক টেবিল জয়েন করা

রিলেশনাল ডেটাবেজে ডেটা বিভিন্ন টেবিলে রাখা হয় এবং প্রয়োজন হলে একটি কুয়েরিতে একাধিক টেবিল থেকে ডেটা পড়া যায়। এই বিষয়টিকে বলে জয়েন (join) করা, যা রিলেশনাল ডেটাবেজের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য।
ধরা যাক, student_info ও result নামে দুটি টেবিল তৈরি করা হলো।

CREATE TABLE student_info (roll INTEGER, name TEXT);
CREATE TABLE result (roll INTEGER, subject TEXT, marks REAL);

এই টেবিল দুটির মধ্যে roll কলাম দিয়ে একটি রিলেশনশিপ দেখা যাচ্ছে। student_info টেবিলে প্রতিটি শিক্ষার্থীর roll ও name রয়েছে। আবার result টেবিলে, শিক্ষার্থীর রোল নম্বর ও বিভিন্ন বিষয়ে পরীক্ষায় প্রাপ্ত নম্বর (marks) রয়েছে। student_info টেবিলের সঙ্গে result টেবিলের রিলেশনশিপ হচ্ছে ওয়ান টু মেনি রিলেশনশিপ।

এখন টেবিলে কিছু ডেটা ইনসার্ট করা হবে-

INSERT INTO student_info (roll, name) VALUES (1, 'Mizanur Rahman');
INSERT INTO student_info (roll, name) VALUES (10, 'Mosharraf Hossain');
INSERT INTO student_info (roll, name) VALUES (2, 'Maysha');
INSERT INTO result (roll, subject, marks) VALUES (1, 'Bangla', 79.0);
INSERT INTO result (roll, subject, marks) VALUES (1, 'English', 76.0);
INSERT INTO result (roll, subject, marks) VALUES (1, 'Mathematics', 74.0);
INSERT INTO result (roll, subject, marks) VALUES (10, 'Bangla', 82.0);
INSERT INTO result (roll, subject, marks) VALUES (10, 'English', 70.0);
INSERT INTO result (roll, subject, marks) VALUES (10, 'Mathematics', 98.0);
INSERT INTO result (roll, subject, marks) VALUES (2, 'Bangla', 75.0);
INSERT INTO result (roll, subject, marks) VALUES (2, 'English', 80.0);
INSERT INTO result (roll, subject, marks) VALUES (2, 'Mathematics', 100.0);

রোল নম্বর 1 যে শিক্ষার্থীর, তার পরীক্ষার ফল জানতে নিচের কুয়েরিটি চালাতে হবে-

SELECT roll, subject, marks FROM result WHERE roll = 1;

এখন, রোল নম্বরের পাশাপাশি শিক্ষার্থীর নামও যদি দেখানোর প্রয়োজন হয়, তখন student_info টেবিলেও কুয়েরি করতে হবে, কারণ result টেবিলে তো শিক্ষার্থীর নাম নেই। কুয়েরিটি হবে এমন-

SELECT name, result.roll, subject, marks FROM
result, student_info WHERE result.roll = 1 AND result.roll = student_info.roll;

লক্ষ করতে হবে, কুয়েরিতে roll না লিখে result.roll লেখা হয়েছে, কারণ roll নামের কলাম দুটি টেবিলেই আছে। আর কুয়েরির result.roll=student_info.roll অংশ দিয়ে টেবিল দুটি যুক্ত (join) করা হয়েছে। সব শিক্ষার্থীর তথ্য চাইলে result.roll = 1 শর্তটি বাদ দিতে হবে। তখন কুয়েরিটি হবে এমন-

SELECT name, result.roll, subject, marks FROM result,
student_info WHERE result.roll = student_info.roll;