SQLHome
📚 HSC ICT • অধ্যায় ৬ • NCTB বাংলাদেশ

SQL শিখুন
বাংলায়

Structured Query Language — ডেটাবেজের ভাষা। W3Schools-এর মতো বিস্তারিত গাইড, বাংলায়, HSC ICT পাঠ্যক্রম অনুযায়ী।

৬+
টপিক
২০+
কোড উদাহরণ
১৫+
কুইজ প্রশ্ন
১০০%
বাংলায়

SQL কী?

SQL (Structured Query Language) হলো একটি বিশেষ প্রোগ্রামিং ভাষা যা রিলেশনাল ডেটাবেজ ম্যানেজমেন্ট সিস্টেম (RDBMS)-এ তথ্য সংরক্ষণ, অনুসন্ধান, পরিবর্তন ও মুছে ফেলার জন্য ব্যবহার করা হয়।

💡
মনে রাখুন: SQL উচ্চারণ করা হয় "এস-কিউ-এল" অথবা "সিক্যুয়েল"। ১৯৭০ সালে IBM-এ এটি তৈরি হয়েছিল।

SQL কোথায় ব্যবহার হয়?

🏦 ব্যাংকিং

গ্রাহকের অ্যাকাউন্ট, লেনদেন সংরক্ষণ।

🏥 হাসপাতাল

রোগীর তথ্য, চিকিৎসা ইতিহাস সংরক্ষণ।

🛒 ই-কমার্স

পণ্য, অর্ডার, গ্রাহক তথ্য ব্যবস্থাপনা।

🎓 শিক্ষা প্রতিষ্ঠান

ছাত্র-শিক্ষকের তথ্য, ফলাফল সংরক্ষণ।

SQL কমান্ডের শ্রেণীবিভাগ

শ্রেণীপূর্ণরূপকমান্ডকাজ
DDLData Definition LanguageCREATE, ALTER, DROPকাঠামো তৈরি/পরিবর্তন
DMLData Manipulation LanguageSELECT, INSERT, UPDATE, DELETEতথ্য নিয়ন্ত্রণ
DCLData Control LanguageGRANT, REVOKEঅনুমতি নিয়ন্ত্রণ
TCLTransaction Control LanguageCOMMIT, ROLLBACKলেনদেন নিয়ন্ত্রণ

SQL-এর ইতিহাস

১৯৭০ সালে IBM-এর গবেষক Edgar Frank Codd রিলেশনাল ডেটাবেজের ধারণা প্রবর্তন করেন। ১৯৭৪ সালে Donald Chamberlin এবং Raymond Boyce "SEQUEL" (Structured English Query Language) নামক ভাষা তৈরি করেন যা পরে SQL নামে পরিচিত হয়।

সালঘটনা
১৯৭০E.F. Codd রিলেশনাল মডেল প্রকাশ করেন
১৯৭৪SEQUEL ভাষা তৈরি
১৯৭৯Oracle প্রথম বাণিজ্যিক SQL ডেটাবেজ প্রকাশ করে
১৯৮৬ANSI কর্তৃক SQL স্ট্যান্ডার্ড প্রকাশ
বর্তমানMySQL, PostgreSQL, MS SQL Server ব্যাপকভাবে ব্যবহৃত

SQL-এর বৈশিষ্ট্য

  • সহজ ভাষা: ইংরেজি ভাষার মতো পড়া যায়।
  • মানসম্মত (Standardized): ANSI/ISO স্ট্যান্ডার্ড অনুসরণ করে।
  • পোর্টেবল: বিভিন্ন DBMS-এ ব্যবহারযোগ্য।
  • শক্তিশালী: জটিল প্রশ্ন (Query) করা যায়।
  • নিরাপদ: ব্যবহারকারীর অনুমতি নিয়ন্ত্রণ করা যায়।

RDBMS ধারণা

RDBMS (Relational Database Management System) হলো একটি সফটওয়্যার যা টেবিল আকারে তথ্য সংরক্ষণ করে এবং টেবিলগুলোর মধ্যে সম্পর্ক তৈরি করে।

জনপ্রিয় RDBMS: MySQL, PostgreSQL, Microsoft SQL Server, Oracle, SQLite, MariaDB

সাধারণ SQL সিনট্যাক্স

⚠️
SQL কমান্ড Case-Insensitive — SELECT এবং select একই কাজ করে। তবে কমান্ড বড় হাতে লেখা ভালো অভ্যাস।
SQL
-- এটি একটি SQL মন্তব্য (Comment)
SELECT column_name
FROM table_name
WHERE condition;

ডেটাবেজ কাঠামো

একটি রিলেশনাল ডেটাবেজে তথ্য টেবিল (Table) আকারে সংরক্ষিত থাকে। প্রতিটি টেবিল একটি বিষয়ের তথ্য ধারণ করে।

📋 ছাত্র (Student)
PK id INT
name VARCHAR
class VARCHAR
roll INT
FK dept_id INT
🏫 বিভাগ (Department)
PK dept_id INT
dept_name VARCHAR
head VARCHAR

গুরুত্বপূর্ণ পরিভাষা

পরিভাষাবাংলা অর্থউদাহরণ
Tableসারণি/টেবিলStudent, Course
Row / Recordসারি / রেকর্ডএকজন ছাত্রের তথ্য
Column / Fieldকলাম / ক্ষেত্রname, age, marks
Primary Keyপ্রাথমিক কীStudent ID
Foreign Keyবৈদেশিক কীdept_id
Queryপ্রশ্ন/অনুসন্ধানSELECT * FROM student

ডেটা টাইপ (Data Types)

ডেটা টাইপবিবরণউদাহরণ
INTপূর্ণ সংখ্যা1, 25, 100
VARCHAR(n)পরিবর্তনশীল দৈর্ঘ্যের টেক্সট'রাহিম', 'Dhaka'
CHAR(n)নির্দিষ্ট দৈর্ঘ্যের টেক্সট'M', 'F'
FLOAT / DECIMALদশমিক সংখ্যা3.14, 98.5
DATEতারিখ'2024-01-15'
BOOLEANসত্য/মিথ্যাTRUE, FALSE
DDL Data Definition

CREATE DATABASE

নতুন ডেটাবেজ তৈরি করতে CREATE DATABASE কমান্ড ব্যবহার করা হয়।

সিনট্যাক্স:

CREATE DATABASE database_name;

উদাহরণ:

SQL
-- স্কুলের জন্য ডেটাবেজ তৈরি
CREATE DATABASE school_db;

-- ডেটাবেজ ব্যবহার শুরু করুন
USE school_db;

CREATE TABLE

ডেটাবেজে নতুন টেবিল তৈরি করতে CREATE TABLE কমান্ড ব্যবহার করা হয়।

সিনট্যাক্স:

CREATE TABLE table_name ( column1 datatype constraint, column2 datatype constraint, ... );

উদাহরণ — ছাত্রের টেবিল তৈরি:

SQL
CREATE TABLE student (
    id       INT           PRIMARY KEY AUTO_INCREMENT,
    name     VARCHAR(50)   NOT NULL,
    class    VARCHAR(10)   NOT NULL,
    roll     INT           UNIQUE,
    age      INT,
    marks    FLOAT,
    gender   CHAR(1),
    dob      DATE
);

Constraints (শর্ত/বাধা)

Constraintবিবরণ
NOT NULLকলামটি খালি থাকতে পারবে না
UNIQUEপ্রতিটি মান আলাদা হতে হবে
PRIMARY KEYNOT NULL + UNIQUE — রেকর্ড সনাক্তকারী
FOREIGN KEYঅন্য টেবিলের Primary Key-এর সাথে সম্পর্ক
DEFAULTকোনো মান না দিলে এটি ব্যবহৃত হবে
CHECKমান একটি শর্ত পূরণ করতে হবে
AUTO_INCREMENTস্বয়ংক্রিয়ভাবে মান বৃদ্ধি পায়
💡
HSC পরীক্ষায়: CREATE TABLE-এ PRIMARY KEY, NOT NULL, ও FOREIGN KEY constraint সবচেয়ে বেশি আসে।
DDL

ALTER TABLE — কলাম যোগ করুন

ALTER TABLE table_name ADD column_name datatype;
SQL
-- student টেবিলে email কলাম যোগ করুন
ALTER TABLE student
ADD email VARCHAR(100);

ALTER TABLE — কলাম পরিবর্তন করুন

ALTER TABLE table_name MODIFY COLUMN column_name new_datatype;
SQL
-- marks কলামের ধরন পরিবর্তন করুন
ALTER TABLE student
MODIFY COLUMN marks DECIMAL(5,2);

-- কলাম বাদ দিন
ALTER TABLE student
DROP COLUMN gender;
DDL
⚠️
সতর্কতা! DROP কমান্ড টেবিল এবং সকল তথ্য স্থায়ীভাবে মুছে দেয়। এটি পূর্বাবস্থায় (Undo) ফেরানো যায় না!
SQL
-- টেবিল মুছে ফেলুন
DROP TABLE student;

-- ডেটাবেজ মুছে ফেলুন
DROP DATABASE school_db;

-- টেবিল থাকলেই মুছুন (Error এড়াতে)
DROP TABLE IF EXISTS student;

-- টেবিল রেখে শুধু সব তথ্য মুছুন
TRUNCATE TABLE student;

DROP vs TRUNCATE vs DELETE

বিষয়DROPTRUNCATEDELETE
টেবিল মুছে যায়?✅ হ্যাঁ❌ না❌ না
তথ্য মুছে যায়?✅ হ্যাঁ✅ হ্যাঁ✅ নির্বাচিত
WHERE ব্যবহার?✅ হ্যাঁ
Rollback সম্ভব?❌ না❌ না✅ হ্যাঁ
শ্রেণীDDLDDLDML
DMLসবচেয়ে গুরুত্বপূর্ণ

মূল সিনট্যাক্স

SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column] [LIMIT number];
SQL
-- সব কলাম দেখান
SELECT * FROM student;

-- নির্দিষ্ট কলাম
SELECT name, class, marks
FROM student;

-- একই মান বাদ দিন (Distinct)
SELECT DISTINCT class FROM student;

-- নাম দিয়ে সাজান (A-Z)
SELECT name, marks
FROM student
ORDER BY marks DESC;

-- প্রথম ৫ জন
SELECT * FROM student LIMIT 5;

📊 নমুনা টেবিল: student

idnameclassrollmarks
1রাহিমএকাদশ10185.5
2করিমদ্বাদশ10272.0
3সুমাইয়াএকাদশ10391.0
4তানিয়াদ্বাদশ10465.5
5আরিফএকাদশ10578.0

এখনই চেষ্টা করুন!

SQL Editor — SELECT অনুশীলন
▸ OUTPUT
DML

সিনট্যাক্স

INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);
SQL
-- একটি রেকর্ড যোগ করুন
INSERT INTO student (name, class, roll, marks)
VALUES ('রাহিম', 'একাদশ', 101, 85.5);

-- একসাথে একাধিক রেকর্ড
INSERT INTO student (name, class, roll, marks)
VALUES
    ('করিম',   'দ্বাদশ',   102, 72.0),
    ('সুমাইয়া', 'একাদশ', 103, 91.0),
    ('তানিয়া',  'দ্বাদশ',   104, 65.5);
💡
টেক্সট ও তারিখ মানগুলো সিঙ্গেল কোটে ('...') লিখতে হয়। সংখ্যার জন্য কোট লাগে না।
DML

সিনট্যাক্স

UPDATE table_name SET col1 = val1, col2 = val2, ... WHERE condition;
🚨
সাবধান! WHERE ছাড়া UPDATE করলে সব রেকর্ড পরিবর্তন হয়ে যাবে!
SQL
-- id=1 এর ছাত্রের নম্বর আপডেট করুন
UPDATE student
SET marks = 90.0
WHERE id = 1;

-- একসাথে একাধিক কলাম আপডেট
UPDATE student
SET class = 'দ্বাদশ', marks = 88.5
WHERE name = 'রাহিম';
DML

সিনট্যাক্স

DELETE FROM table_name WHERE condition;
SQL
-- নির্দিষ্ট রেকর্ড মুছুন
DELETE FROM student
WHERE id = 3;

-- শর্ত অনুযায়ী মুছুন
DELETE FROM student
WHERE marks < 40;

-- ⚠️ সব রেকর্ড মুছুন (WHERE ছাড়া)
DELETE FROM student;

অপারেটর সমূহ

অপারেটরঅর্থউদাহরণ
=সমানWHERE marks = 90
!= বা <>সমান নয়WHERE class != 'একাদশ'
>বড়WHERE marks > 80
<ছোটWHERE age < 18
BETWEENমানের মধ্যেWHERE marks BETWEEN 60 AND 90
INতালিকায় আছেWHERE class IN ('একাদশ', 'দ্বাদশ')
LIKEপ্যাটার্ন মিলWHERE name LIKE 'র%'
IS NULLখালি মানWHERE email IS NULL
ANDউভয় শর্তWHERE marks > 70 AND class = 'একাদশ'
ORযেকোনো একটিWHERE marks < 40 OR absent = 1
NOTবিপরীতWHERE NOT class = 'দ্বাদশ'

LIKE অপারেটর — Wildcard

Symbolঅর্থউদাহরণ
%যেকোনো সংখ্যক অক্ষরLIKE 'র%' → রাহিম, রবি, রনি
_ঠিক একটি অক্ষরLIKE '_নি' → তানি, রনি
SQL
-- ৮০+ নম্বর পেয়েছে এমন একাদশ শ্রেণীর ছাত্র
SELECT * FROM student
WHERE marks > 80 AND class = 'একাদশ';

-- নাম 'র' দিয়ে শুরু
SELECT * FROM student
WHERE name LIKE 'র%';

-- নম্বর ৬০ থেকে ৯০ এর মধ্যে
SELECT * FROM student
WHERE marks BETWEEN 60 AND 90;

Aggregate ফাংশন

এই ফাংশনগুলো অনেক রেকর্ডের উপর কাজ করে একটি ফলাফল দেয়।

ফাংশনকাজউদাহরণ
COUNT()রেকর্ড গণনা করেCOUNT(*)
SUM()যোগফল বের করেSUM(marks)
AVG()গড় বের করেAVG(marks)
MAX()সর্বোচ্চ মানMAX(marks)
MIN()সর্বনিম্ন মানMIN(marks)
SQL
-- মোট ছাত্র সংখ্যা
SELECT COUNT(*) AS total_students
FROM student;

-- সর্বোচ্চ ও সর্বনিম্ন নম্বর
SELECT
    MAX(marks) AS highest,
    MIN(marks) AS lowest,
    AVG(marks) AS average
FROM student;

-- শ্রেণী অনুযায়ী গ্রুপ করুন
SELECT class, COUNT(*) AS count, AVG(marks) AS avg_marks
FROM student
GROUP BY class
HAVING AVG(marks) > 70;
💡
GROUP BY vs HAVING: GROUP BY দিয়ে গ্রুপ করা হয়, HAVING দিয়ে গ্রুপের উপর শর্ত দেওয়া হয়। WHERE দিয়ে গ্রুপ করা যায় না।

অন্যান্য ফাংশন

SQL
-- টেক্সট ফাংশন
SELECT UPPER(name), LOWER(name), LENGTH(name)
FROM student;

-- তারিখ ফাংশন
SELECT NOW(), CURDATE(), YEAR(NOW());

-- গণিত ফাংশন
SELECT ROUND(85.567, 2), CEIL(4.2), FLOOR(4.9);

JOIN-এর প্রকারভেদ

INNER JOIN

উভয় টেবিলে মিল আছে শুধু সেই রেকর্ড দেখায়।

LEFT JOIN

বাম টেবিলের সব রেকর্ড + ডান টেবিলের মিল।

RIGHT JOIN

ডান টেবিলের সব রেকর্ড + বাম টেবিলের মিল।

FULL JOIN

উভয় টেবিলের সব রেকর্ড দেখায়।

নমুনা টেবিল

student
1 | রাহিম | dept_id: 10
2 | করিম | dept_id: 20
3 | সুমাইয়া | dept_id: 10
department
10 | বিজ্ঞান বিভাগ
20 | মানবিক বিভাগ
30 | বাণিজ্য বিভাগ
SQL
-- INNER JOIN: ছাত্র ও বিভাগ একসাথে
SELECT s.name, d.dept_name
FROM student AS s
INNER JOIN department AS d
    ON s.dept_id = d.dept_id;

-- LEFT JOIN: সব ছাত্র + তাদের বিভাগ
SELECT s.name, d.dept_name
FROM student AS s
LEFT JOIN department AS d
    ON s.dept_id = d.dept_id;

INNER JOIN ফলাফল

namedept_name
রাহিমবিজ্ঞান বিভাগ
করিমমানবিক বিভাগ
সুমাইয়াবিজ্ঞান বিভাগ

Primary Key (প্রাথমিক কী)

টেবিলের প্রতিটি রেকর্ডকে আলাদাভাবে চেনার জন্য Primary Key ব্যবহার করা হয়। এটি NULL হতে পারে না এবং Unique হতে হবে।

SQL
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

Foreign Key (বৈদেশিক কী)

Foreign Key এক টেবিলকে অন্য টেবিলের সাথে সংযুক্ত করে। এটি অন্য টেবিলের Primary Key-এর মান ধারণ করে।

SQL
CREATE TABLE student (
    id      INT         PRIMARY KEY,
    name    VARCHAR(50),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);

সব ধরনের কী

কীবৈশিষ্ট্য
Primary KeyUnique + NOT NULL, প্রতি টেবিলে একটি
Foreign Keyঅন্য টেবিলের Primary Key রেফারেন্স
Unique KeyUnique কিন্তু NULL হতে পারে
Candidate KeyPrimary Key হতে পারে এমন কলাম
Composite Keyএকাধিক কলাম মিলে Primary Key
Super Keyরেকর্ড সনাক্ত করতে পারে এমন যেকোনো কলাম
ℹ️
এই এডিটরটি শুধু SELECT কমান্ডের সিমুলেশন করে। নিচের নমুনা ডেটাতে কমান্ড পরীক্ষা করুন।

📊 নমুনা ডেটা

idnameclassrollmarksdept
1রাহিমএকাদশ10185.5বিজ্ঞান
2করিমদ্বাদশ10272.0মানবিক
3সুমাইয়াএকাদশ10391.0বিজ্ঞান
4তানিয়াদ্বাদশ10465.5বাণিজ্য
5আরিফএকাদশ10578.0বিজ্ঞান
6নাসরিনদ্বাদশ10655.0মানবিক
7রফিকএকাদশ10744.5বাণিজ্য

SQL এডিটর

live-sql-editor.js

অনুশীলন কমান্ড চেষ্টা করুন:

↕ নম্বর অনুযায়ী সাজান

ORDER BY marks DESC

🎯 ৭০+ নম্বর

WHERE marks > 70

🔢 মোট ছাত্র

COUNT(*)

📊 গড় নম্বর

AVG(marks)

DDL কমান্ড

SQL — DDL
CREATE DATABASE db_name;
USE db_name;
CREATE TABLE t (col type constraint, ...);
ALTER TABLE t ADD col type;
ALTER TABLE t MODIFY col type;
ALTER TABLE t DROP COLUMN col;
DROP TABLE t;
DROP DATABASE db;
TRUNCATE TABLE t;

DML কমান্ড

SQL — DML
SELECT col1, col2 FROM t;
SELECT * FROM t WHERE condition;
SELECT * FROM t ORDER BY col DESC;
SELECT * FROM t LIMIT n;
SELECT DISTINCT col FROM t;
INSERT INTO t (col1,col2) VALUES (v1,v2);
UPDATE t SET col=val WHERE condition;
DELETE FROM t WHERE condition;

ফাংশন রেফারেন্স

SQL — Functions
-- Aggregate
COUNT(*)  SUM(col)  AVG(col)  MAX(col)  MIN(col)

-- String
UPPER(str)  LOWER(str)  LENGTH(str)
CONCAT(s1,s2)  SUBSTRING(str,pos,len)

-- Math
ROUND(n,d)  CEIL(n)  FLOOR(n)  ABS(n)

-- Date
NOW()  CURDATE()  YEAR(d)  MONTH(d)

GROUP BY ও HAVING

SQL
SELECT class, COUNT(*), AVG(marks)
FROM student
GROUP BY class
HAVING COUNT(*) > 2;