SQL Basics

প্রথম অধ্যায়ে আমরা ডেটাবেস সেটআপ করেছি। এখন সময় ইঞ্জিনে হাত দেওয়ার। SQL বা Structured Query Language কে আমরা কাজের ধরণ অনুযায়ী প্রধানত ৩টি ভাগে ভাগ করতে পারি:

DDL (Data Definition Language): স্ট্রাকচার বা কঙ্কাল তৈরির জন্য। CREATE, ALTER, DROP, TRUNCATE.

DML (Data Manipulation Language): ডেটা পরিবর্তন বা মডিফাই করার জন্য। INSERT, UPDATE, DELETE.

DQL (Data Query Language): ডেটা পড়ার বা দেখার জন্য। SELECT.

এই অধ্যায়ে আমরা মূলত DML এবং DQL এর ওপর ফোকাস করব, যা একজন ডেভেলপারের দৈনন্দিন কাজের ৯০% জুড়ে থাকে।

২.১ SELECT — ডেটা দেখার জাদু (The Most Used Query)

ডেটাবেস থেকে ডেটা তুলে আনার জন্য SELECT কমান্ড ব্যবহার করা হয়।

Basic Syntax:

SELECT column1, column2 FROM table_name;

উদাহরণ:

SELECT id, name, email FROM users;

⚠️ The SELECT * Trap (Senior Developer Insight)

জুনিয়ররা প্রায়ই সব ডেটা দেখার জন্য SELECT * ব্যবহার করে।

-- Development এ ঠিক আছে, কিন্তু Production এ কদাচ নয়!
SELECT * FROM users;

কেন SELECT * প্রোডাকশন অ্যাপে ব্যবহার করবেন না?

  • Unnecessary I/O: যদি টেবিলে ৫০টি কলাম থাকে আর আপনার দরকার মাত্র ২টা, তাহলে বাকি ৪৮টি কলামের ডেটা অকারণে ডিস্ক থেকে রিড হচ্ছে।
  • Network Bandwidth: সার্ভার থেকে অ্যাপ্লিকেশনে ডেটা ট্রান্সফার হতে সময় বেশি লাগবে।
  • Index Issue: আমরা পরে দেখব যে "Covering Index" বলে একটা অ্যাডভান্সড টপিক আছে, যা SELECT * দিলে কাজ করে না।

✨ Senior Rule: সবসময় স্পেসিফিক কলামের নাম উল্লেখ করুন। এটি কোডকে ফাস্ট করে এবং ভবিষ্যতে টেবিল স্ট্রাকচার চেঞ্জ হলেও কোড ব্রেক হওয়ার সম্ভাবনা কমায়।

২.২ WHERE — ছাঁকনি দিয়ে ডেটা ফিল্টার করা

সব ডেটা আমাদের দরকার নেই। নির্দিষ্ট শর্তের ডেটা আনতে WHERE ব্যবহার হয়।

উদাহরণ:

যাদের বয়স ২০ এর বেশি:

SELECT * FROM users WHERE age > 20;

যাদের বাড়ি ঢাকায়:

SELECT name FROM users WHERE city = 'Dhaka';

Comparison Operators:

Operator অর্থ
=সমান
!= বা <>সমান নয়
<ছোট
>বড়
<=ছোট অথবা সমান
>=বড় অথবা সমান

২.৩ ORDER BY — সাজানো গোছানো ডেটা

ডেটাকে নির্দিষ্ট অর্ডারে সাজাতে এটি ব্যবহার হয়।

Ascending (ছোট থেকে বড় - Default):

SELECT * FROM users ORDER BY name ASC; 
-- বা শুধু ORDER BY name;

Descending (বড় থেকে ছোট - Latest First):

সাধারণত নিউজ ফিড বা লেটেস্ট ইউজার দেখাতে এটি লাগে।

SELECT * FROM users ORDER BY created_at DESC;

💡 Performance Tip: অনেক বড় টেবিলে ORDER BY ব্যবহার করলে কুয়েরি স্লো হতে পারে যদি না ওই কলামে Index থাকে। আমরা ইনডেক্সিং অধ্যায়ে এটি সলভ করব।

২.৪ LIMIT & OFFSET — পেজিনেশন লজিক

গুগল বা ফেসবুকে যেমন এক পেজে সব রেজাল্ট দেখায় না, ডেটাবেসেও তাই করতে হয়।

প্রথম ১০টি প্রোডাক্ট আনা:

SELECT * FROM products LIMIT 10;

Pagination (Real World Example):

ধরি প্রতি পেজে ২০টি ডেটা দেখাবেন।

  • Page 1: LIMIT 20 OFFSET 0
  • Page 2: LIMIT 20 OFFSET 20
  • Page 3: LIMIT 20 OFFSET 40 (অর্থাৎ প্রথম ৪০টি বাদ দিয়ে পরের ২০টি)

Short Syntax:

-- প্রথম সংখ্যাটি OFFSET, পরেরটি LIMIT
SELECT * FROM orders LIMIT 40, 20;

২.৫ INSERT — নতুন ডেটা ঢুকানো (DML)

Basic Insert:

INSERT INTO users (name, email, age) 
VALUES ('Shagor', 'test@example.com', 28);

🚀 Bulk Insert (Senior Optimization):

ধরা যাক আপনাকে ১০০ জন ইউজার অ্যাড করতে হবে। আপনি কি ১০০ বার INSERT কুয়েরি চালাবেন? না!

লুপ চালিয়ে ১০০ বার কুয়েরি হিট করলে সার্ভারে ১০০ বার রিকোয়েস্ট যায়, যা অনেক স্লো।

সঠিক পদ্ধতি (One Query, Multiple Rows):

INSERT INTO users (name, email, age) VALUES 
 ('Rahim', 'rahim@mail.com', 20),
 ('Karim', 'karim@mail.com', 21),
 ('Jabbar', 'jabbar@mail.com', 22);

💡 Tip: ১০০০ রো (Row) পর্যন্ত এক ব্যাচে ইনসার্ট করা স্ট্যান্ডার্ড প্র্যাকটিস। এটি সিঙ্গেল ইনসার্টের চেয়ে ১০-২০ গুণ ফাস্ট হতে পারে।

২.৬ UPDATE — ডেটা পরিবর্তন করা

⚠️ সতর্কতা:

UPDATE কুয়েরি চালানোর সময় WHERE ক্লজ দিতে ভুলবেন না। ভুললে পুরো টেবিলের সব ডেটা চেঞ্জ হয়ে যাবে!

সঠিক পদ্ধতি:

UPDATE users 
SET name = 'New Name', city = 'Chittagong' 
WHERE id = 5;

Dangerous Mistake (Junior Dev):

-- এটি করবেন না! সব ইউজারের স্ট্যাটাস active হয়ে যাবে।
UPDATE users SET status = 'active';

🔒 Safety Hack:

কনফিডেন্স না থাকলে আগে SELECT করে দেখে নিন আপনি কাকে আপডেট করতে যাচ্ছেন।

SELECT * FROM users WHERE id = 5; -- ঠিক থাকলে
UPDATE users SET status = 'active' WHERE id = 5;

২.৭ DELETE vs TRUNCATE — ডেটা মুছে ফেলা

ডেটা ডিলিট করার দুটি উপায় আছে, কিন্তু এদের কাজ করার পদ্ধতি ভিন্ন।

১. DELETE (বেছে বেছে মোছা):

DELETE FROM users WHERE id = 5;
  • শর্ত সাপেক্ষে নির্দিষ্ট রো ডিলিট করে।
  • ভুল হলে ROLLBACK (Transaction) করে ডেটা ফেরত আনা সম্ভব।
  • একটু ধীরগতির।

২. TRUNCATE (সব পরিষ্কার করা):

TRUNCATE TABLE logs;
  • টেবিলের সব ডেটা একবারে মুছে ফেলে।
  • WHERE ব্যবহার করা যায় না।
  • আইডি বা AUTO_INCREMENT রিসেট হয়ে ১ থেকে শুরু হয়।
  • এটি DELETE এর চেয়ে অনেক অনেক ফাস্ট।

Comparison Table:

Feature DELETE TRUNCATE
Data Removalরো ধরে ধরে মুছেপুরো টেবিল খালি করে দেয়
WHERE Clauseব্যবহার করা যায়যায় না
Rollbackসম্ভব (Transaction এ)সম্ভব নয় (DDL operation)
SpeedSlowVery Fast
ID Resetনাহ্যাঁ (Resets Auto Increment)

২.৮ ALIASES (AS) — ছদ্মনাম ব্যবহার

বড় কুয়েরি ছোট করতে বা কলামের নাম সুন্দর করতে AS ব্যবহার হয়।

Column Alias (API এর জন্য সুন্দর নাম):

SELECT name AS user_name, email AS user_email FROM users;

Table Alias (JOIN এর সময় জীবন বাঁচায়):

বারবার টেবিলের পুরো নাম না লিখে আমরা শর্ট ফর্ম ব্যবহার করি।

SELECT u.name, u.email 
FROM users AS u 
WHERE u.id = 1;

(এখানে users টেবিলকে আমরা u বলে ডাকছি)

২.৯ DISTINCT — ডুপ্লিকেট দূর করা

একই শহরের অনেক ইউজার থাকতে পারে। আপনি শুধু ইউনিক শহরের নামগুলো চান।

SELECT DISTINCT city FROM users;

এটি ডুপ্লিকেট ভ্যালু বাদ দিয়ে শুধু ইউনিক রেজাল্ট দেখাবে।

২.১০ Real-world Query Patterns (Senior Level Practice)

এখন সব নলেজ একসঙ্গে করার পালা। একজন সিনিয়র ডেভেলপার কীভাবে কুয়েরি লেখে?

Scenario 1: লেটেস্ট ১০ জন অ্যাক্টিভ ইউজারকে খুঁজে বের করা

SELECT id, name, email 
FROM users 
WHERE status = 'active' 
ORDER BY id DESC 
LIMIT 10;

ব্যাখ্যা: প্রথমে ফিল্টার (WHERE), তারপর সর্টিং (ORDER BY), শেষে লিমিট (LIMIT)

Scenario 2: নির্দিষ্ট পেজের জন্য ডেটা স্কিপ করে আনা

-- Page 3 (প্রতি পেজে ২০টি করে)
SELECT id, title, price 
FROM products 
ORDER BY price ASC 
LIMIT 20 OFFSET 40;

🎯 অধ্যায় ২ এর সারাংশ (Summary)

এই অধ্যায় শেষে আপনি যা শিখলেন:

  • SELECT: সবসময় প্রয়োজনীয় কলাম সিলেক্ট করা (SELECT * পরিহার করা)।
  • WHERE: অপারেটর দিয়ে নিখুঁতভাবে ডেটা ফিল্টার করা।
  • INSERT: বাল্ক ইনসার্ট ব্যবহার করে পারফরম্যান্স বাড়ানো।
  • UPDATE/DELETE: WHERE ছাড়া এগুলো কতটা বিপজ্জনক তা বোঝা।
  • TRUNCATE vs DELETE: কখন কোনটা ব্যবহার করবেন।
  • Alias & Limit: কুয়েরি সুন্দর ও অপটিমাইজ করা।

✨ পরবর্তী অধ্যায়ে আমরা শিখব Filtering এর অ্যাডভান্সড টেকনিক (LIKE, IN, BETWEEN) এবং MySQL এর পাওয়ারফুল ফাংশনগুলো।

🔒 কপিরাইট সুরক্ষিত কন্টেন্ট 🔒

কপি, স্ক্রিনশট, প্রিন্ট করা সম্পূর্ণ নিষিদ্ধ।