CH 00 স্বাগতম
Oracle Database 21c — বাংলা লেকচার সিরিজ
Oracle SQL
সম্পূর্ণ গাইড

SQL-এর মূল ধারণা থেকে শুরু করে এডভান্সড ফাংশন, জয়েন, সাবকোয়েরি এবং উইন্ডো ফাংশন পর্যন্ত — বাংলায় সম্পূর্ণ ইন্টারেক্টিভ লেকচার।

SELECTJOIN GROUP BYSubquery Scalar FunctionsAggregate Functions String FunctionsDate & Time ConversionAnalytic / Window DDL / DMLIndex
অধ্যায় ০১

SQL কী এবং Oracle কেন? ভূমিকা

SQL (Structured Query Language) হলো রিলেশনাল ডেটাবেজের সাথে যোগাযোগের মানসম্মত ভাষা। Oracle Database বিশ্বের সবচেয়ে শক্তিশালী RDBMS গুলোর একটি।

🗄️
DDL
Data Definition — CREATE, ALTER, DROP — স্ট্রাকচার তৈরি ও পরিবর্তন
✏️
DML
Data Manipulation — INSERT, UPDATE, DELETE — ডেটা পরিবর্তন
🔍
DQL
Data Query — SELECT — ডেটা অনুসন্ধান ও পুনরুদ্ধার
🔒
DCL
Data Control — GRANT, REVOKE — অনুমতি নিয়ন্ত্রণ
🔄
TCL
Transaction Control — COMMIT, ROLLBACK — লেনদেন নিয়ন্ত্রণ
Oracle বৈশিষ্ট্য
ROWNUM, CONNECT BY, Analytic Functions, PL/SQL এক্সটেনশন
💡Oracle SQL ANSI মান মেনে চলে কিন্তু অনেক শক্তিশালী নিজস্ব extension যোগ করে যেমন ROWNUM, DUAL table, CONNECT BY ইত্যাদি।
অধ্যায় ০২

SELECT স্টেটমেন্ট — ডেটা অনুসন্ধান

SELECT হলো SQL-এর সবচেয়ে মৌলিক কমান্ড। এটি দিয়ে এক বা একাধিক টেবিল থেকে ডেটা পুনরুদ্ধার করা হয়।

SELECT col1, col2   FROM table_name   [WHERE condition]   [ORDER BY col]   [FETCH FIRST n ROWS ONLY]
Oracle SQL
1-- HR স্কিমা থেকে কর্মচারী তথ্য 2SELECT employee_id, 3 first_name, 4 last_name, 5 salary 6 FROM employees 7 WHERE salary > 5000 8 AND department_id = 60 9 ORDER BY salary DESC 10FETCH FIRST 5 ROWS ONLY;
ফলাফল (Result)
EMPLOYEE_IDFIRST_NAMESALARY
103Alexander9000
104Bruce6000
105David4800
⚠️SELECT * ব্যবহার এড়িয়ে চলুন — শুধু প্রয়োজনীয় কলাম নির্দিষ্ট করুন।
অধ্যায় ০২

WHERE ক্লজ ও অপারেটর

WHERE ক্লজ দিয়ে শর্ত অনুযায়ী সারি ফিল্টার করা হয়। বিভিন্ন ধরনের অপারেটর ব্যবহার করে জটিল শর্ত তৈরি করা যায়।

WHERE অপারেটর
1-- BETWEEN অপারেটর 2WHERE salary BETWEEN 3000 AND 8000 3-- IN তালিকা 4WHERE dept_id IN (10, 20, 30) 5-- LIKE প্যাটার্ন 6WHERE last_name LIKE 'S%' 7-- NULL চেক 8WHERE commission_pct IS NOT NULL 9-- NOT অপারেটর 10WHERE dept_id NOT IN (40, 50)
  • =
    সমতা — নির্দিষ্ট মানের সাথে মিল যাচাই
  • != বা <> — অসমান তুলনা
  • %
    LIKE % — যেকোনো অক্ষর; _ একটি অক্ষর
  • IN (...) — তালিকার যেকোনো মানের সাথে মিল
  • IS NULL — NULL মান যাচাই করে
🚫NULL-এর সাথে কখনো = বা != ব্যবহার করবেন না — সবসময় IS NULL / IS NOT NULL লিখুন।
অধ্যায় ০৩

SQL JOIN — একাধিক টেবিল একত্রিত

JOIN দিয়ে একটি সাধারণ কলামের ভিত্তিতে দুই বা ততোধিক টেবিলের সারি একত্রিত করা হয়।

employeesবাম টেবিল
departmentsডান টেবিল
INNER
LEFT
RIGHT
FULL OUTER
CROSS
INNER JOIN
SELECT e.first_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
INNER JOIN — উভয় টেবিলে মিল থাকা সারিই শুধু ফেরত দেয়।
অধ্যায় ০৪

Aggregate Functions — সমষ্টিগত ফাংশন

Aggregate Functions একাধিক সারির উপর কাজ করে এবং একটি একক ফলাফল দেয়। GROUP BY-এর সাথে ব্যবহার করে ডেটা গ্রুপ করা যায়।

ফাংশনকাজউদাহরণ
COUNT(*)মোট সারির সংখ্যাCOUNT(*) → 45
SUM(col)যোগফলSUM(salary)
AVG(col)গড়AVG(salary)
MAX(col)সর্বোচ্চ মানMAX(salary)
MIN(col)সর্বনিম্ন মানMIN(salary)
LISTAGG()মান জোড়া লাগায়LISTAGG(name,',')
STDDEV()Standard deviationSTDDEV(salary)
VARIANCE()ভ্যারিয়েন্সVARIANCE(sal)
GROUP BY + HAVING
1SELECT department_id, 2 COUNT(*) AS মোট_কর্মচারী, 3 AVG(salary) AS গড়_বেতন, 4 MAX(salary) AS সর্বোচ্চ_বেতন, 5 MIN(salary) AS সর্বনিম্ন_বেতন 6 FROM employees 7 GROUP BY department_id 8HAVING COUNT(*) > 3 9 ORDER BY গড়_বেতন DESC;
⚠️HAVING গ্রুপ ফিল্টার করে (GROUP BY পরে)। WHERE সারি ফিল্টার করে (গ্রুপিং আগে)।
অধ্যায় ০৫

Scalar Functions — একক-মান ফাংশন

Scalar Functions প্রতিটি সারির জন্য আলাদাভাবে কাজ করে এবং প্রতিটি সারির জন্য একটি মান ফেরত দেয়। Aggregate থেকে মূল পার্থক্য — এগুলো সারি ভেঙে দেয় না।

Numeric NULL Handling CASE / DECODE
ফাংশনবর্ণনাউদাহরণফলাফল
ABS(n)পরম মানABS(-15)15
ROUND(n,d)নির্দিষ্ট দশমিকে পূর্ণROUND(3.567,2)3.57
TRUNC(n,d)দশমিক কেটে ফেলাTRUNC(3.999,1)3.9
CEIL(n)উপরের পূর্ণসংখ্যাCEIL(3.2)4
FLOOR(n)নিচের পূর্ণসংখ্যাFLOOR(3.9)3
MOD(n,m)ভাগশেষMOD(10,3)1
POWER(n,p)n এর p-তম ঘাতPOWER(2,8)256
অধ্যায় ০৬

String Functions — টেক্সট ফাংশন

Oracle-এ অনেক শক্তিশালী স্ট্রিং ফাংশন আছে যা VARCHAR2 ও CHAR ডেটা প্রক্রিয়া করে।

ফাংশনবর্ণনাফলাফল
UPPER(s)বড় হাতে রূপান্তর'ORACLE'
LOWER(s)ছোট হাতে রূপান্তর'oracle'
INITCAP(s)প্রথম অক্ষর বড়'Oracle Sql'
LENGTH(s)অক্ষর সংখ্যা6
SUBSTR(s,m,n)অংশ বিশেষ কাটা'SQL'
INSTR(s,t)অবস্থান খোঁজা3
REPLACE(s,a,b)প্রতিস্থাপন'Hello SQL'
TRIM(s)দুদিকের স্পেস মুছা'oracle'
LPAD/RPADবাম/ডানে প্যাড করা' 007'
CONCAT(a,b)দুটি স্ট্রিং জোড়া'OracleSQL'
String উদাহরণ
1SELECT 2 UPPER('oracle sql'), -- ORACLE SQL 3 LENGTH('বাংলাদেশ'), -- 8 4 SUBSTR('Oracle SQL',8), -- SQL 5 INSTR('hello','l'), -- 3 6 REPLACE('Hi World', 7 'World','SQL'), -- Hi SQL 8 TRIM(' hello '), -- hello 9 LPAD('7',5,'0'), -- 00007 10 CONCAT('Oracle',' SQL') -- Oracle SQL 11FROM dual;
💡DUAL একটি বিশেষ single-row টেবিল যা Oracle-এ expression টেস্ট করতে ব্যবহৃত হয়।
অধ্যায় ০৭

Date & Time Functions — তারিখ ও সময়

Oracle-এ DATE টাইপে তারিখ ও সময় উভয়ই সংরক্ষিত থাকে। TIMESTAMP আরও বেশি নির্ভুলতা দেয়।

ফাংশনবর্ণনাফলাফল
SYSDATEবর্তমান তারিখ + সময়07-APR-26
SYSTIMESTAMPউচ্চ নির্ভুলতার সময়07-APR-26 12:30:45
ADD_MONTHS(d,n)মাস যোগ করাতারিখ + n মাস
MONTHS_BETWEENদুই তারিখের মাসের ব্যবধানসংখ্যা
NEXT_DAY(d,day)পরবর্তী নির্দিষ্ট বারতারিখ
LAST_DAY(d)মাসের শেষ দিন30-APR-26
TRUNC(d,'MM')মাসের প্রথম দিন01-APR-26
EXTRACT(p FROM d)অংশ বের করাYEAR→2026
Date উদাহরণ
1SELECT 2 SYSDATE AS আজকের_তারিখ, 3 ADD_MONTHS(SYSDATE, 6) AS ছয়_মাস_পরে, 4 LAST_DAY(SYSDATE) AS মাসের_শেষ, 5 EXTRACT(YEAR FROM SYSDATE) AS বছর, 6 EXTRACT(MONTH FROM SYSDATE) AS মাস, 7 MONTHS_BETWEEN( 8 SYSDATE, hire_date) AS কর্মকাল_মাস, 9 TO_CHAR(SYSDATE, 10 'DD-MON-YYYY HH24:MI') AS ফরম্যাট_তারিখ 11FROM employees;
অধ্যায় ০৮

Conversion Functions — রূপান্তর ফাংশন

ডেটা টাইপ রূপান্তর করতে ও NULL মান সামলাতে Conversion Functions ব্যবহার করা হয়।

ফাংশনবর্ণনা
TO_CHAR(x, fmt)সংখ্যা/তারিখ → স্ট্রিং
TO_NUMBER(s, fmt)স্ট্রিং → সংখ্যা
TO_DATE(s, fmt)স্ট্রিং → তারিখ
TO_TIMESTAMPস্ট্রিং → TIMESTAMP
NVL(x, default)NULL হলে বিকল্প মান
NVL2(x, a, b)NULL/NOT NULL দুটি বিকল্প
COALESCE(a,b,c…)প্রথম non-NULL মান
NULLIF(a,b)a=b হলে NULL ফেরায়
CAST(x AS type)ANSI মান রূপান্তর
Conversion উদাহরণ
1-- TO_CHAR: তারিখ ফরম্যাট 2SELECT TO_CHAR(SYSDATE, 3 'DD/MM/YYYY') -- 07/04/2026 4FROM dual; 5-- TO_DATE: স্ট্রিং থেকে তারিখ 6SELECT TO_DATE('15-01-2026', 7 'DD-MM-YYYY') 8FROM dual; 9-- NVL ও COALESCE 10SELECT 11 NVL(commission_pct, 0), 12 NVL2(commission_pct, 13 salary * commission_pct, 14 0) AS কমিশন, 15 COALESCE(phone, mobile, 16 'যোগাযোগ নেই') AS যোগাযোগ 17FROM employees;
💡TO_CHAR-এর format mask: 'YYYY'=বছর, 'MM'=মাস, 'DD'=দিন, 'HH24'=২৪ঘন্টা, 'MI'=মিনিট, 'SS'=সেকেন্ড।
অধ্যায় ০৯

Analytic (Window) Functions — উইন্ডো ফাংশন

Analytic Functions সম্পর্কিত একটি সেটের সারির উপর গণনা করে কিন্তু GROUP BY-এর মতো সারি একত্রিত করে না। প্রতিটি সারি তার ফলাফল রাখে।

FN() OVER ( PARTITION BY dept_id ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
↑ ফাংশন                 ↑ পার্টিশন (ঐচ্ছিক)       ↑ ক্রম (ঐচ্ছিক)              ↑ ফ্রেম (ঐচ্ছিক)
ফাংশনকাজ
RANK()র‍্যাংক (সমান হলে গ্যাপ)
DENSE_RANK()র‍্যাংক (গ্যাপ নেই)
ROW_NUMBER()অনন্য ক্রম সংখ্যা
NTILE(n)n ভাগে ভাগ
LAG(col,n)n সারি আগের মান
LEAD(col,n)n সারি পরের মান
FIRST_VALUE()উইন্ডোর প্রথম মান
LAST_VALUE()উইন্ডোর শেষ মান
SUM() OVER()চলমান যোগফল
Window Functions উদাহরণ
1SELECT 2 first_name, 3 department_id, 4 salary, 5 RANK() OVER ( 6 PARTITION BY department_id 7 ORDER BY salary DESC 8 ) AS dept_rank, 9 SUM(salary) OVER ( 10 PARTITION BY department_id 11 ) AS dept_total, 12 LAG(salary, 1, 0) OVER ( 13 ORDER BY hire_date 14 ) AS পূর্ববর্তী_বেতন, 15 ROUND(100 * salary / 16 SUM(salary) OVER(), 2) AS শতকরা 17FROM employees 18ORDER BY department_id, dept_rank;
অধ্যায় ০৯ — ফলাফল

Window Function ফলাফল বিশ্লেষণ

নিচের ফলাফল দেখুন — কীভাবে প্রতিটি সারি আলাদা র‍্যাংক ও বিভাগ-ভিত্তিক মোট পাচ্ছে, তবুও কোনো সারি মুছে যাচ্ছে না।

Window Function কোয়েরির ফলাফল
FIRST_NAMEDEPT_IDSALARYDEPT_RANKDEPT_TOTALপূর্বে_বেতনশতকরা %
Alexander609,000128,800031.25
Bruce606,000228,8009,00020.83
David604,800328,8006,00016.67
Valli604,800328,8004,80016.67
Diana604,200528,8004,80014.58
Nancy10012,000151,6004,20023.26
💡
RANK vs DENSE_RANK: উপরে David ও Valli উভয়ের RANK=3। RANK()-এ পরেরটি হবে 5, কিন্তু DENSE_RANK()-এ হবে 4।
চলমান মোট (Running Total): SUM(salary) OVER(ORDER BY hire_date) প্রতিটি সারিতে যোগফল জমা করতে থাকে।
অধ্যায় ১০

Subqueries — নেস্টেড কোয়েরি

Subquery হলো একটি কোয়েরির ভেতরে আরেকটি কোয়েরি। SELECT, WHERE, FROM, HAVING ক্লজে ব্যবহার করা যায়।

Scalar Subquery
1-- গড়ের চেয়ে বেশি বেতন পায় 2SELECT first_name, salary 3 FROM employees 4 WHERE salary > ( 5 SELECT AVG(salary) 6 FROM employees 7 ) 8 ORDER BY salary DESC;
Correlated Subquery
1-- প্রতি বিভাগের সর্বোচ্চ বেতনধারী 2SELECT first_name, salary, 3 department_id 4 FROM employees e 5 WHERE salary = ( 6 SELECT MAX(salary) 7 FROM employees 8 WHERE department_id 9 = e.department_id 10 );
  • Scalar — একটি মান ফেরায়; WHERE বা SELECT-এ ব্যবহার
  • Row — একটি সারি ফেরায়
  • Table — একাধিক সারি; IN / ANY / ALL-এর সাথে
  • Correlated — বাইরের কোয়েরি রেফার করে; প্রতিটি সারির জন্য চলে
  • Inline View — FROM ক্লজে subquery, ভার্চুয়াল টেবিল হিসেবে কাজ করে
💡WITH ক্লজ (CTE) ব্যবহার করে জটিল subquery সহজে পড়ার মতো করা যায় এবং পুনরায় ব্যবহার করা যায়।
অধ্যায় ১১

DDL — CREATE, ALTER, DROP

Data Definition Language ডেটাবেজের স্ট্রাকচার নিয়ন্ত্রণ করে। Oracle-এ DDL স্বয়ংক্রিয়ভাবে COMMIT করে।

CREATE TABLE
1CREATE TABLE students ( 2 student_id NUMBER(6) 3 GENERATED ALWAYS 4 AS IDENTITY 5 PRIMARY KEY, 6 full_name VARCHAR2(100) 7 NOT NULL, 8 email VARCHAR2(150) 9 UNIQUE, 10 enroll_date DATE 11 DEFAULT SYSDATE, 12 gpa NUMBER(3,2) 13 CHECK (gpa 14 BETWEEN 0 AND 4) 15);
ALTER + DROP
1-- কলাম যোগ করা 2ALTER TABLE students 3 ADD phone VARCHAR2(20); 4-- কলাম পরিবর্তন 5ALTER TABLE students 6 MODIFY full_name VARCHAR2(200); 7-- কলাম মুছে ফেলা 8ALTER TABLE students 9 DROP COLUMN phone; 10-- টেবিল মুছে ফেলা 11DROP TABLE students; 12-- দ্রুত ডেটা মুছা 13TRUNCATE TABLE students;
🚫DROP ও TRUNCATE স্বয়ংক্রিয় COMMIT করে — ROLLBACK সম্ভব নয়। সতর্কতার সাথে ব্যবহার করুন।
অধ্যায় ১২

DML — INSERT, UPDATE, DELETE

Data Manipulation Language টেবিলের ডেটা যোগ, পরিবর্তন ও মুছতে ব্যবহৃত হয়। সব DML লেনদেন নিয়ন্ত্রিত।

DML অপারেশন
1-- একটি সারি যোগ করা 2INSERT INTO students (full_name, email, gpa) 3 VALUES ('আলিম রহমান', 'alim@uni.edu', 3.85); 4-- শর্ত দিয়ে আপডেট 5UPDATE students 6 SET gpa = 3.90, 7 email = 'alim.r@uni.edu' 8 WHERE full_name = 'আলিম রহমান'; 9-- শর্ত দিয়ে মুছে ফেলা 10DELETE FROM students 11 WHERE gpa < 1.5; 12-- MERGE (UPSERT) — Oracle বিশেষ 13MERGE INTO students tgt 14 USING new_data src 15 ON (tgt.email = src.email) 16 WHEN MATCHED THEN 17 UPDATE SET tgt.gpa = src.gpa 18 WHEN NOT MATCHED THEN 19 INSERT (full_name, email, gpa) 20 VALUES (src.full_name, src.email, src.gpa); 21COMMIT; -- পরিবর্তন স্থায়ী করুন 22-- ROLLBACK; -- শেষ COMMIT-এর পর থেকে পূর্বাবস্থায় ফেরা
হ্যান্ডস-অন ল্যাব

🧪 ইন্টারেক্টিভ SQL ল্যাব

নিচে কোয়েরি লিখুন বা উদাহরণ বেছে নিন, তারপর ▶ Run বাটন চাপুন।

⚡ ORACLE SQL SIMULATOR
▶ Run বাটন চাপলে ফলাফল দেখাবে...
অধ্যায় ১৩

Index ও পারফরম্যান্স টিউনিং

Index ডেটা দ্রুত খুঁজে পেতে সাহায্য করে কিন্তু লেখার সময় অতিরিক্ত চাপ তৈরি করে — তাই বুদ্ধিমত্তার সাথে ব্যবহার করতে হবে।

Index তৈরি
1-- B-Tree index (ডিফল্ট) 2CREATE INDEX idx_emp_lname 3 ON employees (last_name); 4-- Composite index 5CREATE INDEX idx_emp_dept_sal 6 ON employees ( 7 department_id, 8 salary 9 ); 10-- Function-based index 11CREATE INDEX idx_upper_lname 12 ON employees (UPPER(last_name)); 13-- Execution Plan দেখা 14EXPLAIN PLAN FOR 15 SELECT * FROM employees 16 WHERE last_name = 'King'; 17 18SELECT * FROM 19 TABLE(DBMS_XPLAN.DISPLAY);
  • B
    B-Tree — ডিফল্ট; = এবং range কোয়েরির জন্য উত্তম
  • BM
    Bitmap — কম মান বৈচিত্র্যের কলামের জন্য (gender, status)
  • Fn
    Function-based — expression-এর ফলের উপর index
  • U
    Unique — uniqueness নিশ্চিত করে ও দ্রুত lookup
  • PG
    Partitioned — বড় টেবিল ভাগ করে index
💡WHERE, JOIN, ORDER BY-তে ব্যবহৃত কলামে index দিন। অতিরিক্ত index INSERT/UPDATE ধীর করে।
অধ্যায় ১৪

Oracle SQL সেরা অভ্যাস

দক্ষ, পঠনযোগ্য ও রক্ষণাবেক্ষণযোগ্য SQL লিখতে এই নিয়মগুলো মেনে চলুন।

🎯
Bind Variable ব্যবহার
Hard-coded literal এড়ান — cursor sharing ও SQL injection প্রতিরোধ
🚫
SELECT * এড়ান
শুধু প্রয়োজনীয় কলাম নির্দিষ্ট করুন — পারফরম্যান্স ও স্থায়িত্ব বাড়বে
📐
সঠিক ইন্ডেন্টিং
keyword align, lowercase identifier, uppercase keyword — কোড সহজে পড়া যাবে
JOIN > Subquery
JOIN সাধারণত correlated subquery-র চেয়ে বেশি দক্ষ ও পঠনযোগ্য
🧪
EXPLAIN PLAN
কোয়েরি রান করার আগে execution plan যাচাই করুন — full scan এড়ান
🔑
NULL সতর্কতা
NVL/COALESCE ব্যবহার করুন — NULL arithmetic-এ অপ্রত্যাশিত ফল দেয়
লেকচার সমাপ্তি

📚 লেকচার সারসংক্ষেপ

আপনি Oracle SQL-এর মূল থেকে এডভান্সড বিষয় পর্যন্ত শিখেছেন। অনুশীলন চালিয়ে যান!

SELECT, WHERE, ORDER BY — ডেটা অনুসন্ধান ও ফিল্টার
JOIN — INNER, LEFT, RIGHT, FULL OUTER, CROSS
Aggregate Functions — COUNT, SUM, AVG, MAX, MIN, LISTAGG
Scalar Functions — ABS, ROUND, TRUNC, CEIL, FLOOR, MOD
String Functions — UPPER, SUBSTR, REPLACE, TRIM, LPAD
Date & Time — SYSDATE, ADD_MONTHS, EXTRACT, TO_CHAR
Conversion — TO_CHAR, TO_DATE, NVL, COALESCE, CAST
Analytic (Window) — RANK, ROW_NUMBER, LAG, LEAD, SUM OVER()
Subqueries — Scalar, Correlated, Inline View, CTE
DDL & DML — CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, MERGE
🎓অনুশীলন করুন: livesql.oracle.com — বিনামূল্যে Oracle SQL পরিবেশ
📖রেফারেন্স: Oracle Database SQL Language Reference 21c
🏆চ্যালেঞ্জ: ৩টি সম্পর্কিত টেবিল তৈরি করুন, ডেটা দিন, এবং Window Function দিয়ে ৫টি বিশ্লেষণী কোয়েরি লিখুন!