{"id":25556413,"url":"https://github.com/rakibul263/mysql-database","last_synced_at":"2025-10-20T04:15:53.203Z","repository":{"id":278424563,"uuid":"935215799","full_name":"rakibul263/MySQL-Database","owner":"rakibul263","description":"📌 SQL-এর খুঁটিনাটি (MySQL সহ) এই 🗂️ রেপোজিটরিতে SQL-এর বিভিন্ন খুঁটিনাটি বিষয় বাংলা ভাষায় 📖 ব্যাখ্যা করা হয়েছে। এখানে 🛢️ MySQL-এর প্রয়োজনীয় কোয়েরিগুলো সংযুক্ত করা হয়েছে ✅","archived":false,"fork":false,"pushed_at":"2025-02-19T17:30:39.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-19T18:26:31.891Z","etag":null,"topics":["database","mysql-database","sql"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rakibul263.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-19T04:57:07.000Z","updated_at":"2025-02-19T17:30:43.000Z","dependencies_parsed_at":"2025-02-19T18:36:41.919Z","dependency_job_id":null,"html_url":"https://github.com/rakibul263/MySQL-Database","commit_stats":null,"previous_names":["rakibul263/mysql-database"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rakibul263%2FMySQL-Database","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rakibul263%2FMySQL-Database/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rakibul263%2FMySQL-Database/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rakibul263%2FMySQL-Database/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rakibul263","download_url":"https://codeload.github.com/rakibul263/MySQL-Database/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239852925,"owners_count":19707778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","mysql-database","sql"],"created_at":"2025-02-20T14:26:34.988Z","updated_at":"2025-10-20T04:15:48.167Z","avatar_url":"https://github.com/rakibul263.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\" style=\"color: skyblue;\"\u003eAll About MySQL\u003c/h1\u003e\n\n\n### **`CREATE TABLE` কিভাবে কাজ করে?**  \nSQL-এ `CREATE TABLE` ব্যবহার করা হয় **একটি নতুন টেবিল তৈরি করতে**।  \n\n---\n\n## **✅ `CREATE TABLE` এর সাধারণ গঠন (Syntax)**  \n```sql\nCREATE TABLE table_name (\n    column1 datatype constraints,\n    column2 datatype constraints,\n    column3 datatype constraints,\n    ...\n);\n```\n🔹 **`table_name`** → নতুন টেবিলের নাম  \n🔹 **`column1, column2, ...`** → কলামের নাম  \n🔹 **`datatype`** → কলামের জন্য ডাটা টাইপ (যেমন: `INT`, `VARCHAR`, `DATE`, `DECIMAL` ইত্যাদি)  \n🔹 **`constraints`** → কলামের রুল (যেমন: `PRIMARY KEY`, `NOT NULL`, `UNIQUE` ইত্যাদি)  \n\n---\n\n## **✅ `employees` টেবিল তৈরি করা**  \n```sql\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT, \n    name VARCHAR(50) NOT NULL,\n    department VARCHAR(30),\n    age INT CHECK (age \u003e= 18),\n    salary DECIMAL(10,2),\n    join_date DATE\n);\n```\n🔹 **`id`** → Primary Key (স্বয়ংক্রিয়ভাবে ১, ২, ৩... হবে)  \n🔹 **`name`** → নাম (`VARCHAR(50)`, খালি রাখা যাবে না)  \n🔹 **`department`** → বিভাগ (`VARCHAR(30)`, খালি রাখা যাবে)  \n🔹 **`age`** → বয়স (কমপক্ষে ১৮ হতে হবে)  \n🔹 **`salary`** → বেতন (`DECIMAL(10,2)` অর্থাৎ, ১০ ডিজিটের মধ্যে ২ ডিজিট দশমিকের পর)  \n🔹 **`join_date`** → যোগদানের তারিখ  \n\n---\n\n## **✅ `CREATE TABLE`-এর সাথে কন্ডিশন ব্যবহার করা**\n### **১. যদি টেবিলটি আগে থেকেই থাকে, তাহলে ডিলিট করে নতুন করে তৈরি করবে**  \n```sql\nDROP TABLE IF EXISTS employees;\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    department VARCHAR(30),\n    age INT CHECK (age \u003e= 18),\n    salary DECIMAL(10,2),\n    join_date DATE\n);\n```\n🔹 **`DROP TABLE IF EXISTS employees;`** → যদি `employees` টেবিল আগে থাকে, তাহলে মুছে ফেলে নতুন করে তৈরি করবে  \n\n---\n\n### **২. যদি টেবিলটি আগে থেকে না থাকে, তাহলে নতুন তৈরি করবে**  \n```sql\nCREATE TABLE IF NOT EXISTS employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    department VARCHAR(30),\n    age INT CHECK (age \u003e= 18),\n    salary DECIMAL(10,2),\n    join_date DATE\n);\n```\n🔹 **`IF NOT EXISTS`** → যদি `employees` টেবিল না থাকে, তাহলে নতুন করে তৈরি করবে  \n\n---\n\n### **`INSERT INTO` কিভাবে কাজ করে?**  \nSQL-এ `INSERT INTO` ব্যবহার করা হয় **টেবিলে নতুন ডাটা সংযুক্ত করতে**।  \n\n---\n\n## **✅ `INSERT INTO` এর সাধারণ গঠন (Syntax)**\n```sql\nINSERT INTO table_name (column1, column2, column3, ...) \nVALUES (value1, value2, value3, ...);\n```\n🔹 **`table_name`** → যে টেবিলে ডাটা ইনসার্ট করা হবে  \n🔹 **`column1, column2, ...`** → যে কলামগুলোর জন্য ডাটা দেওয়া হবে  \n🔹 **`value1, value2, ...`** → যে মানগুলো ইনসার্ট হবে  \n\n---\n\n## **✅ `employees` টেবিলে ২০ জন কর্মীর ডাটা ইনসার্ট করা**  \n```sql\nINSERT INTO employees (name, department, age, salary, join_date) VALUES\n('Samiul', 'IT', 25, 50000.00, '2022-03-15'),\n('Fahim', 'HR', 30, 45000.50, '2021-07-10'),\n('Ayesha', 'Finance', 28, 55000.75, '2022-10-05'),\n('Rifat', 'IT', 27, 48000.00, '2023-01-12'),\n('Tanjim', 'Marketing', 29, 47000.00, '2022-06-20'),\n('Nabila', 'HR', 26, 42000.00, '2023-04-11'),\n('Hasib', 'IT', 31, 52000.50, '2021-09-14'),\n('Jannat', 'Finance', 24, 51000.00, '2022-02-07'),\n('Rakib', 'IT', 28, 50000.00, '2023-03-18'),\n('Mou', 'Marketing', 27, 46000.00, '2022-12-05'),\n('Sabbir', 'Finance', 29, 53000.00, '2021-08-25'),\n('Raihan', 'HR', 32, 41000.00, '2022-07-17'),\n('Shamim', 'IT', 26, 47000.50, '2023-05-21'),\n('Jui', 'Marketing', 30, 49000.00, '2022-11-09'),\n('Tarek', 'Finance', 28, 52000.00, '2021-06-30'),\n('Afia', 'HR', 25, 43000.00, '2023-08-14'),\n('Mamun', 'IT', 33, 54000.75, '2022-09-19'),\n('Tanvir', 'Marketing', 27, 48000.00, '2023-02-22'),\n('Faria', 'Finance', 26, 51000.00, '2022-04-16'),\n('Mehedi', 'HR', 29, 45000.00, '2023-07-29');\n```\n🔹 এখানে **২০ জন কর্মীর তথ্য ইনসার্ট করা হয়েছে**  \n🔹 **`id` কলাম `AUTO_INCREMENT` থাকলে** সেটি স্বয়ংক্রিয়ভাবে সংখ্যা অ্যাসাইন করবে  \n\n---\n\n## **✅ সব কলামে ইনসার্ট করা (কোনো নির্দিষ্ট কলাম উল্লেখ না করে)**\n```sql\nINSERT INTO employees VALUES \n(21, 'Kamal', 'IT', 30, 52000.00, '2023-06-12');\n```\n🔹 **সব কলামের জন্য মান দিতে হবে**  \n🔹 **`id` কলামে স্বয়ংক্রিয় সংখ্যা যুক্ত হলে প্রথম কলাম বাদ দেওয়া উচিত**  \n\n---\n\n## **✅ একাধিক `INSERT` একসাথে চালানো (Bulk Insert)**\n```sql\nINSERT INTO employees (name, department, age, salary, join_date) VALUES\n('Arif', 'IT', 28, 49000.00, '2023-01-05'),\n('Mahin', 'Finance', 27, 53000.00, '2022-08-23'),\n('Saima', 'HR', 26, 44000.00, '2023-10-10');\n```\n🔹 **একটি `INSERT INTO` স্টেটমেন্টে একাধিক রো ইনসার্ট করা যায়**  \n\n---\n\n## **✅ `INSERT` + `SELECT` (অন্য টেবিল থেকে ডাটা কপি করা)**  \nযদি আমরা **অন্য একটি টেবিল থেকে ডাটা কপি করে `employees` টেবিলে রাখতে চাই**:  \n```sql\nINSERT INTO employees (name, department, age, salary, join_date)\nSELECT full_name, dept, years, pay, start_date FROM old_employees;\n```\n🔹 এটি **`old_employees` টেবিল থেকে ডাটা নিয়ে `employees` টেবিলে সংযুক্ত করবে**  \n\n---\n\n## **✅ ইনসার্ট করার পর ডাটা চেক করা (`SELECT` দিয়ে)**\n```sql\nSELECT * FROM employees;\n```\n🔹 **`employees` টেবিলে নতুন যোগ করা ডাটা দেখাবে**  \n\n---\n\n### **`UPDATE` কিভাবে কাজ করে?**  \nSQL-এ `UPDATE` ব্যবহার করা হয় **অবস্থানে থাকা ডাটা পরিবর্তন করতে**।  \n\n---\n\n## **✅ `UPDATE` এর সাধারণ গঠন (Syntax)**  \n```sql\nUPDATE table_name  \nSET column1 = value1, column2 = value2, ...  \nWHERE condition;\n```\n\n🔹 **`table_name`** → যে টেবিলের ডাটা আপডেট করবেন  \n🔹 **`SET`** → যেসব কলামের মান পরিবর্তন করতে চান  \n🔹 **`WHERE`** → কোন রো (row) আপডেট হবে, সেটা ঠিক করতে  \n\n⚠️ **IMPORTANT:**  \n**`WHERE` না দিলে পুরো টেবিলের ডাটা আপডেট হয়ে যাবে!** সাবধানে ব্যবহার করুন।  \n\n---\n\n## **✅ ১. এক কলাম আপডেট করা**  \nধরি, আমরা **ID ১** নম্বর কর্মীর বেতন বাড়িয়ে **৬০০০০** করতে চাই:  \n```sql\nUPDATE employees  \nSET salary = 60000  \nWHERE id = 1;\n```\n\n🔹 **Result:** `id = 1` এর **`salary` 60000** এ আপডেট হবে।  \n\n---\n\n## **✅ ২. একাধিক কলাম আপডেট করা**  \nযদি আমরা **ID ২** নম্বর কর্মীর **বেতন ও ডিপার্টমেন্ট** পরিবর্তন করতে চাই:  \n```sql\nUPDATE employees  \nSET salary = 48000, department = 'Marketing'  \nWHERE id = 2;\n```\n\n🔹 **Result:** `id = 2` এর **বেতন** এবং **ডিপার্টমেন্ট** আপডেট হবে।  \n\n---\n\n## **✅ ৩. শর্ত অনুযায়ী আপডেট করা**  \nযদি আমরা **যারা IT ডিপার্টমেন্টে আছেন, তাদের বেতন ১০% বাড়াতে চাই**:  \n```sql\nUPDATE employees  \nSET salary = salary * 1.10  \nWHERE department = 'IT';\n```\n\n🔹 **Result:** **IT ডিপার্টমেন্টের সব কর্মীর বেতন ১০% বাড়বে।**  \n\n---\n\n## **✅ ৪. নির্দিষ্ট তারিখের উপর ভিত্তি করে আপডেট করা**  \nযদি আমরা **যারা ২০২২ সালের আগে জয়েন করেছে, তাদের ডিপার্টমেন্ট 'Senior' করতে চাই**:  \n```sql\nUPDATE employees  \nSET department = 'Senior'  \nWHERE join_date \u003c '2022-01-01';\n```\n\n🔹 **Result:** **২০২২ সালের আগে জয়েন করা কর্মীদের ডিপার্টমেন্ট 'Senior' হবে।**  \n\n---\n\n## **✅ ৫. `UPDATE` করার পর ডাটা চেক করা (`SELECT`)**  \n```sql\nSELECT * FROM employees;\n```\n\n🔹 **আপডেটেড ডাটা দেখানোর জন্য `SELECT` ব্যবহার করতে পারেন।**  \n\n---\n\n## **✅ ৬. `UPDATE` + `LIMIT` (সীমিত রো আপডেট করা)**  \nযদি আমরা **শুধু প্রথম ৫ জনের ডিপার্টমেন্ট 'Test' করতে চাই**:  \n```sql\nUPDATE employees  \nSET department = 'Test'  \nLIMIT 5;\n```\n\n🔹 **Result:** **প্রথম ৫ জন কর্মীর ডিপার্টমেন্ট 'Test' হবে।**  \n\n---\n\n## **✅ ৭. `UPDATE` + `ORDER BY` (সাজিয়ে আপডেট করা)**  \nযদি আমরা **সর্বনিম্ন বেতনের কর্মীর বেতন ৪৫০০০ করতে চাই**:  \n```sql\nUPDATE employees  \nSET salary = 45000  \nORDER BY salary ASC  \nLIMIT 1;\n```\n\n🔹 **Result:** **সবচেয়ে কম বেতন পাওয়া কর্মীর বেতন ৪৫০০০ হবে।**  \n\n---\n\n## **✅ সংক্ষেপে `UPDATE` ব্যবহার করার সুবিধা**  \n✔ **ডাটা সহজে পরিবর্তন করা যায়**  \n✔ **শর্ত অনুযায়ী নির্দিষ্ট রো আপডেট করা যায়**  \n✔ **গাণিতিক অপারেশন (যেমন: `salary * 1.10`) করা যায়**  \n\n\n\n### **`WHERE` Clause কি এবং এটি কিভাবে কাজ করে?**  \n`WHERE` ক্লজ SQL-তে **শর্ত নির্ধারণের জন্য ব্যবহৃত হয়**। যখন আমরা কোনো টেবিল থেকে **নির্দিষ্ট ডেটা ফিল্টার** করতে চাই, তখন `WHERE` ক্লজ ব্যবহার করা হয়। এটি মূলত `SELECT`, `UPDATE`, `DELETE` এবং `INSERT` স্টেটমেন্টের সাথে ব্যবহার করা হয়।\n\n---\n\n### **উদাহরণ ১: নির্দিষ্ট ডিপার্টমেন্টের কর্মচারীদের খুঁজে বের করা**  \nধরা যাক, আমরা `IT` বিভাগে কর্মরত কর্মচারীদের দেখতে চাই।  \n\n```sql\nSELECT * FROM Employees WHERE department = 'IT';\n```\n👉 এই কিউরিটি `Employees` টেবিল থেকে শুধুমাত্র `IT` বিভাগে কাজ করা কর্মচারীদের তথ্য দেখাবে।\n\n---\n\n### **উদাহরণ ২: ৩০ বছরের বেশি বয়সী কর্মচারীদের তালিকা**  \n```sql\nSELECT * FROM Employees WHERE age \u003e 30;\n```\n👉 এই কিউরি সেইসব কর্মচারীদের তথ্য দেখাবে যাদের বয়স **৩০ বছরের বেশি**।\n\n---\n\n### **উদাহরণ ৩: নির্দিষ্ট বেতনসীমার মধ্যে কর্মচারীদের তালিকা**  \nধরি, আমরা এমন কর্মচারীদের দেখতে চাই যাদের বেতন **৪০০০০ থেকে ৫০০০০** এর মধ্যে।  \n\n```sql\nSELECT * FROM Employees WHERE salary BETWEEN 40000 AND 50000;\n```\n👉 এই কিউরি শুধু তাদের দেখাবে যাদের বেতন ৪০০০০ থেকে ৫০০০০ টাকার মধ্যে আছে।\n\n---\n\n### **উদাহরণ ৪: `HR` বিভাগ বাদে অন্যদের তথ্য**  \nআমরা যদি `HR` বিভাগের কর্মচারীদের বাদ দিয়ে বাকি সকলকে দেখতে চাই:  \n\n```sql\nSELECT * FROM Employees WHERE department \u003c\u003e 'HR';\n```\n(এখানে `\u003c\u003e` অর্থ **\"সমান নয়\"**)\n\n---\n\n### **উদাহরণ ৫: ২০২১ সালের পরে যোগ দেওয়া কর্মচারীরা**  \n```sql\nSELECT * FROM Employees WHERE join_date \u003e '2021-12-31';\n```\n👉 এই কিউরিটি **২০২২ বা এর পরে** যোগ দেওয়া কর্মচারীদের দেখাবে।\n\n---\n\n### **উদাহরণ ৬: নির্দিষ্ট নামে কর্মচারী খুঁজে বের করা**  \nযদি আমরা `Rahim Islam` নামের কর্মচারীর তথ্য জানতে চাই:  \n```sql\nSELECT * FROM Employees WHERE name = 'Rahim Islam';\n```\n👉 এটি শুধুমাত্র **Rahim Islam**-এর তথ্য দেখাবে।\n\n---\n\n### **উদাহরণ ৭: একাধিক শর্ত একসাথে ব্যবহার করা (`AND` এবং `OR`)**  \n\n✅ **যদি আমরা `IT` বিভাগের কর্মচারীদের খুঁজতে চাই যাদের বয়স ২৫ বছরের বেশি:**  \n```sql\nSELECT * FROM Employees WHERE department = 'IT' AND age \u003e 25;\n```\n👉 এটি শুধু `IT` বিভাগের **যাদের বয়স ২৫ বছরের বেশি** তাদের তথ্য দেখাবে।\n\n✅ **যদি আমরা `HR` বা `Finance` বিভাগের কর্মচারীদের দেখতে চাই:**  \n```sql\nSELECT * FROM Employees WHERE department = 'HR' OR department = 'Finance';\n```\n👉 এটি `HR` এবং `Finance` বিভাগে কর্মরত সকল কর্মচারীর তথ্য দেখাবে।\n\n---\n\n### **উপসংহার**  \n🔹 `WHERE` ক্লজ **ডাটাবেজ থেকে নির্দিষ্ট ডেটা ফিল্টার করতে সাহায্য করে**।  \n🔹 এটি `=`, `\u003e`, `\u003c`, `\u003e=`, `\u003c=`, `\u003c\u003e`, `BETWEEN`, `AND`, `OR` ইত্যাদি অপারেটরের মাধ্যমে কাজ করে।  \n🔹 আমরা `WHERE` ব্যবহার করে নির্দিষ্ট বিভাগ, বয়স, বেতন, যোগদানের তারিখ ইত্যাদির ভিত্তিতে কর্মচারীদের খুঁজে বের করতে পারি।\n\n\n\n### **`BETWEEN` কিভাবে কাজ করে?**  \n`BETWEEN` **দুটি মানের মধ্যে ডাটা ফিল্টার করতে** ব্যবহার করা হয়। এটি **inclusive**, অর্থাৎ **শুরুর মান ও শেষের মান দুটোই অন্তর্ভুক্ত করে**।  \n\n#### **সাধারণ গঠন (Syntax)**  \n```sql\nSELECT column_name FROM table_name\nWHERE column_name BETWEEN value1 AND value2;\n```\nএখানে `value1` এবং `value2` এর মধ্যে থাকা সব ডাটা **রিটার্ন** করবে।  \n\n---\n\n### ***প্র্যাকটিক্যাল উদাহরণ***\nধরা যাক, আমরা `Employees` টেবিল থেকে **যারা ৪০,০০০ থেকে ৫০,০০০ টাকার মধ্যে বেতন পায় তাদের খুঁজতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE salary BETWEEN 40000 AND 50000;\n```\nএটি **৪০,০০০ থেকে ৫০,০০০ এর মধ্যে থাকা সকল salary** সহ employee দেখাবে।  \n\n---\n\n### **তারিখের জন্য `BETWEEN` কিভাবে কাজ করে?**\nধরুন, আমরা ২০২২ সালের মধ্যে জয়েন করা কর্মীদের দেখতে চাই:\n```sql\nSELECT * FROM Employees \nWHERE join_date BETWEEN '2022-01-01' AND '2022-12-31';\n```\nএখানে, **`join_date` যদি ১লা জানুয়ারি ২০২২ থেকে ৩১শে ডিসেম্বর ২০২২ এর মধ্যে পড়ে, তাহলে সেই সব রো রিটার্ন করবে**।  \n\n---\n\n### **`BETWEEN` ব্যবহার করার সুবিধা:**\n✅ **কোড ছোট হয়** → `BETWEEN` ব্যবহার করলে সহজেই রেঞ্জ সেট করা যায়  \n✅ **পারফরম্যান্স ভালো হয়** → এটি **ইন্ডেক্স** ব্যবহার করে কার্যকরভাবে ডাটা ফিল্টার করে  \n✅ **বুঝতে সহজ** → এটি `\u003e=` এবং `\u003c=` এর সমতুল্য, তবে কম জটিল  \n\n---\n\n### **`BETWEEN` এর বিকল্প (`\u003e=` এবং `\u003c=`)**\nউপরে দেওয়া query নিচের মত করেও লেখা যায়:\n```sql\nSELECT * FROM Employees \nWHERE salary \u003e= 40000 AND salary \u003c= 50000;\n```\nকিন্তু **`BETWEEN` কমপ্যাক্ট এবং সহজবোধ্য**, তাই এটিই বেশি ব্যবহৃত হয়।  \n\n\n### **`IN` কিভাবে কাজ করে?**  \nSQL-এ `IN` ব্যবহার করা হয় **একটি নির্দিষ্ট তালিকার মধ্যে থাকা মানগুলোর সাথে মিল আছে কিনা তা চেক করতে**। এটি `OR` কন্ডিশনের সহজতর বিকল্প।  \n\n---\n\n### **সাধারণ গঠন (Syntax)**  \n```sql\nSELECT column_name FROM table_name \nWHERE column_name IN (value1, value2, value3, ...);\n```\nএটি **`column_name` যদি `value1`, `value2`, বা `value3` এর কোনো একটির সমান হয়, তাহলে সেই রো রিটার্ন করবে**।  \n\n---\n\n### **প্র্যাকটিক্যাল উদাহরণ**  \nধরা যাক, আমরা **\"HR\", \"IT\", এবং \"Finance\"** ডিপার্টমেন্টের কর্মীদের খুঁজতে চাই।  \n\n✅ **`IN` ব্যবহার করে:**  \n```sql\nSELECT * FROM Employees \nWHERE department IN ('HR', 'IT', 'Finance');\n```\nএটি **শুধুমাত্র HR, IT, এবং Finance ডিপার্টমেন্টের কর্মীদের রেকর্ড রিটার্ন করবে**।  \n\n❌ **`OR` দিয়ে করলে:**  \n```sql\nSELECT * FROM Employees \nWHERE department = 'HR' OR department = 'IT' OR department = 'Finance';\n```\n`IN` ব্যবহার করলে কোড ছোট এবং সহজ হয়ে যায়।  \n\n---\n\n### **`IN` সংখ্যা বা তারিখের সাথেও কাজ করে**  \nআমরা যদি **যারা ২৫, ৩০, অথবা ৩৫ বছর বয়সী তাদের খুঁজতে চাই**, তাহলে:  \n```sql\nSELECT * FROM Employees \nWHERE age IN (25, 30, 35);\n```\nএটি **২৫, ৩০ বা ৩৫ বছর বয়সী কর্মীদের রিটার্ন করবে**।  \n\nতারিখের ক্ষেত্রেও কাজ করে:  \n```sql\nSELECT * FROM Employees \nWHERE join_date IN ('2022-01-10', '2023-04-18', '2021-07-01');\n```\nএটি শুধু **এই তিনটি তারিখে জয়েন করা কর্মীদের দেখাবে**।  \n\n---\n\n### **`IN` এবং `NOT IN`**\n#### ✅ **`IN` → নির্দিষ্ট মানগুলোকে অন্তর্ভুক্ত করে**  \n```sql\nSELECT * FROM Employees \nWHERE department IN ('IT', 'Finance');\n```\nএটি **শুধুমাত্র IT এবং Finance ডিপার্টমেন্টের কর্মীদের দেখাবে**।  \n\n#### ❌ **`NOT IN` → নির্দিষ্ট মানগুলো বাদ দেয়**  \n```sql\nSELECT * FROM Employees \nWHERE department NOT IN ('IT', 'Finance');\n```\nএটি **IT এবং Finance বাদ দিয়ে বাকি সব ডিপার্টমেন্টের কর্মীদের দেখাবে**।  \n\n---\n\n### **`IN` ব্যবহার করার সুবিধা**\n✅ **কোড ছোট হয়** → `IN` ব্যবহার করলে `OR` বারবার লিখতে হয় না  \n✅ **পারফরম্যান্স ভালো হতে পারে** → নির্দিষ্ট মানগুলোর জন্য **ইনডেক্স** ব্যবহার করে দ্রুত ফিল্টার করা যায়  \n✅ **বোঝা সহজ** → একাধিক মান চেক করার সহজতর উপায়  \n\n\n\n### **`LIKE` কিভাবে কাজ করে?**  \nSQL-এ `LIKE` ব্যবহার করা হয় **প্যাটার্ন মিলিয়ে (pattern matching) ডাটা খুঁজতে**। এটি **`WHERE`-এর সাথে ব্যবহার করা হয়** এবং সাধারণত **`%` ও `_` wildcard** ব্যবহার করা হয়।  \n\n---\n\n## **✅ `LIKE` এর সাধারণ গঠন (Syntax)**\n```sql\nSELECT column_name FROM table_name \nWHERE column_name LIKE 'pattern';\n```\nএখানে **`pattern` মানের সাথে মিললে সেই রো গুলো রিটার্ন হবে।**  \n\n---\n\n## **🔹 `LIKE`-এ Wildcard গুলো কিভাবে কাজ করে?**  \n\n| Wildcard | কাজ |\n|----------|------------------------------------------------|\n| `%` | **শূন্য বা যেকোনো সংখ্যক ক্যারেক্টার** রিপ্রেজেন্ট করে |\n| `_` | **শুধুমাত্র ১টি ক্যারেক্টার** রিপ্রেজেন্ট করে |\n\n---\n\n## **🔸 `%` Wildcard দিয়ে উদাহরণ**\n### **১️⃣ নির্দিষ্ট অক্ষর দিয়ে শুরু হওয়া ডাটা খোঁজা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নাম 'S' দিয়ে শুরু হয়েছে**  \n```sql\nSELECT * FROM Employees \nWHERE name LIKE 'S%';\n```\n🟢 এটি **S** দিয়ে শুরু হওয়া সব নাম দেখাবে (যেমন: **Samiul, Shamima, Shakila** ইত্যাদি)।  \n\n---\n\n### **২️⃣ নির্দিষ্ট অক্ষর দিয়ে শেষ হওয়া ডাটা খোঁজা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নাম 'n' দিয়ে শেষ হয়েছে**  \n```sql\nSELECT * FROM Employees \nWHERE name LIKE '%n';\n```\n🟢 এটি **n** দিয়ে শেষ হওয়া সব নাম দেখাবে (যেমন: **Jahan, Fahim, Rakibul** ইত্যাদি)।  \n\n---\n\n### **৩️⃣ নামের মাঝখানে নির্দিষ্ট ক্যারেক্টার থাকলে খোঁজা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নামের মাঝে 'ah' আছে**  \n```sql\nSELECT * FROM Employees \nWHERE name LIKE '%ah%';\n```\n🟢 এটি এমন নাম দেখাবে **যেগুলোর মাঝে 'ah' আছে** (যেমন: **Shamima, Mahmud, Fahim** ইত্যাদি)।  \n\n---\n\n## **🔹 `_` Wildcard দিয়ে উদাহরণ**\n### **১️⃣ ঠিক ১টি ক্যারেক্টার রিপ্লেস করা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নামের দ্বিতীয় ক্যারেক্টার 'a'**  \n```sql\nSELECT * FROM Employees \nWHERE name LIKE '_a%';\n```\n🟢 এটি এমন নাম দেখাবে **যেগুলোর দ্বিতীয় ক্যারেক্টার 'a'** (যেমন: **Karim, Fahim, Samiul** ইত্যাদি)।  \n\n---\n\n### **২️⃣ শেষের এক ক্যারেক্টার ফিক্সড রেখে খোঁজা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নামের শেষের আগে 'a' আছে**  \n```sql\nSELECT * FROM Employees \nWHERE name LIKE '%a_';\n```\n🟢 এটি এমন নাম দেখাবে **যেগুলোর শেষের আগে 'a' আছে** (যেমন: **Ayesha, Sumaiya** ইত্যাদি)।  \n\n---\n\n## **🔹 `NOT LIKE` ব্যবহার করা**\nযদি আমরা এমন কর্মীদের খুঁজতে চাই **যাদের নাম 'S' দিয়ে শুরু হয়নি**  \n```sql\nSELECT * FROM Employees \nWHERE name NOT LIKE 'S%';\n```\n🟢 এটি **S দিয়ে শুরু হওয়া নাম বাদ দিয়ে বাকি সব দেখাবে**।  \n\n---\n\n## **✅ `LIKE` ব্যবহারের সুবিধা**\n✔ **Flexible search:** নির্দিষ্ট অক্ষর দিয়ে শুরু, শেষ বা মাঝে কিছু থাকলে খুঁজতে পারে  \n✔ **Wildcards:** `%` এবং `_` ব্যবহার করে কাস্টম প্যাটার্ন মিলানো যায়  \n✔ **Text filtering:** নাম, ঠিকানা বা অন্য স্ট্রিং ফিল্টার করার জন্য খুবই দরকারি  \n\n---\n\n### **`AND`, `OR`, এবং `NOT` কিভাবে কাজ করে?**  \nSQL-এ `AND`, `OR`, এবং `NOT` **লজিক্যাল অপারেটর** হিসাবে কাজ করে এবং `WHERE` ক্লজের সাথে ব্যবহার করা হয় **বিভিন্ন কন্ডিশন চেক করার জন্য**।  \n\n---\n\n## **✅ ১. `AND` অপারেটর (দুটি শর্ত একসাথে পূরণ করতে হবে)**\n- `AND` ব্যবহার করলে **সব শর্ত একসাথে মিলে গেলে তবেই ডাটা রিটার্ন করবে**।  \n- অর্থাৎ, **উভয় শর্তই সত্য হতে হবে**।  \n\n### **উদাহরণ:**  \nযদি আমরা **IT ডিপার্টমেন্টে কাজ করা এবং ৩০ বছর বা তার বেশি বয়সের কর্মীদের খুঁজতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE department = 'IT' \nAND age \u003e= 30;\n```\n🔹 **Result:** `department = 'IT'` এবং `age \u003e= 30`—**উভয় শর্ত মিললে** তবেই রো রিটার্ন করবে।  \n\n---\n\n## **✅ ২. `OR` অপারেটর (একটি শর্ত মিললেই হবে)**\n- `OR` ব্যবহার করলে **শুধুমাত্র একটি শর্ত মিললেই** ডাটা রিটার্ন করবে।  \n- অর্থাৎ, **যে কোনো একটিই সত্য হতে হবে**।  \n\n### **উদাহরণ:**  \nযদি আমরা **যারা HR বা IT ডিপার্টমেন্টে কাজ করে তাদের খুঁজতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE department = 'HR' \nOR department = 'IT';\n```\n🔹 **Result:** `HR` **অথবা** `IT` ডিপার্টমেন্টের যেকোনো কর্মী দেখাবে।  \n\n---\n\n## **✅ ৩. `NOT` অপারেটর (শর্ত না মিললে রিটার্ন করবে)**\n- `NOT` ব্যবহার করলে **শর্তের উল্টো মান বের করে**।  \n- অর্থাৎ, **যে শর্ত সত্য, সেটাকে মিথ্যা বানিয়ে ফেলে**।  \n\n### **উদাহরণ:**  \nযদি আমরা **যারা IT ডিপার্টমেন্টে নেই, তাদের দেখতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE NOT department = 'IT';\n```\n🔹 **Result:** `IT` ডিপার্টমেন্ট বাদ দিয়ে **বাকি সব কর্মীদের দেখাবে**।  \n\n---\n\n## **✅ `AND`, `OR`, এবং `NOT` একসাথে ব্যবহার করা**  \nআমরা চাই যে **যারা IT বা Finance ডিপার্টমেন্টে কাজ করে এবং যাদের বয়স ২৫ বছরের বেশি, তারা যেন দেখানো হয়**:  \n```sql\nSELECT * FROM Employees \nWHERE (department = 'IT' OR department = 'Finance') \nAND age \u003e 25;\n```\n🔹 **Result:**  \n- `department = 'IT'` **অথবা** `department = 'Finance'` → **যেকোনো একটি হতে হবে**  \n- **এবং** `age \u003e 25` → **বয়স ২৫-এর বেশি হতে হবে**  \n\n---\n\n## **✅ `NOT` সহ `AND` এবং `OR` ব্যবহার করা**  \nযদি আমরা **যারা HR ডিপার্টমেন্টে নেই এবং যাদের বয়স ৩০ বছরের বেশি, শুধু তাদের দেখতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE NOT department = 'HR' \nAND age \u003e 30;\n```\n🔹 **Result:**  \n- **HR ডিপার্টমেন্ট বাদ যাবে**  \n- **যাদের বয়স ৩০ বছরের বেশি শুধু তাদের দেখাবে**  \n\n---\n\n## **✅ সংক্ষেপে পার্থক্য:**  \n\n| অপারেটর | কাজ |\n|----------|------------------------------------------------|\n| `AND` | **সব শর্ত সত্য হতে হবে** (দুটি শর্তই মিলতে হবে) |\n| `OR` | **যেকোনো এক শর্ত সত্য হলেই হবে** |\n| `NOT` | **শর্তের উল্টো মান বের করে** |\n\n---\n\n### **`ORDER BY` কিভাবে কাজ করে?**  \nSQL-এ `ORDER BY` ব্যবহার করা হয় **ডাটা সাজানোর জন্য**। এটি **বড় থেকে ছোট বা ছোট থেকে বড় ক্রমে সাজাতে পারে**।  \n\n---\n\n## **✅ `ORDER BY` এর সাধারণ গঠন (Syntax)**\n```sql\nSELECT column_name FROM table_name \nORDER BY column_name [ASC | DESC];\n```\n🔹 `ASC` (Ascending) → **ছোট থেকে বড়** (default)  \n🔹 `DESC` (Descending) → **বড় থেকে ছোট**  \n\n---\n\n## **✅ ১. `ORDER BY` দিয়ে নাম ক্রমানুসারে সাজানো**  \nধরি, আমরা **কর্মীদের নাম বর্ণানুক্রমিক (A-Z) সাজাতে চাই**:  \n```sql\nSELECT * FROM Employees \nORDER BY name;\n```\nএটি **`name` কলামের মান A থেকে Z পর্যন্ত সাজাবে**।  \n\n---\n\n## **✅ ২. `ORDER BY` দিয়ে বেতন অনুযায়ী সাজানো (Ascending \u0026 Descending)**\nযদি আমরা **কর্মীদের বেতন (salary) অনুযায়ী ছোট থেকে বড় (Ascending)** সাজাতে চাই:  \n```sql\nSELECT * FROM Employees \nORDER BY salary ASC;\n```\n🟢 এটি **সবচেয়ে কম বেতন থেকে বেশি বেতনের কর্মীদের দেখাবে**।  \n\n🔹 **বড় থেকে ছোট (Descending) সাজাতে:**  \n```sql\nSELECT * FROM Employees \nORDER BY salary DESC;\n```\n🟢 এটি **সবচেয়ে বেশি বেতন পাওয়া কর্মীকে সবার উপরে দেখাবে**।  \n\n---\n\n## **✅ ৩. একাধিক কলামের উপর `ORDER BY`**  \nযদি আমরা **ডিপার্টমেন্ট অনুযায়ী সাজাতে চাই এবং একই ডিপার্টমেন্টের ভেতরে বয়স অনুযায়ী (Ascending) সাজাতে চাই**:  \n```sql\nSELECT * FROM Employees \nORDER BY department ASC, age ASC;\n```\n🔹 এটি **ডিপার্টমেন্ট অনুযায়ী সাজাবে এবং একই ডিপার্টমেন্টের মধ্যে বয়স অনুযায়ী সাজাবে**।  \n\n---\n\n## **✅ ৪. `ORDER BY` `WHERE` এর সাথে ব্যবহার করা**  \nযদি আমরা **যারা IT ডিপার্টমেন্টে কাজ করে, শুধু তাদের বেতন অনুযায়ী সাজাতে চাই**:  \n```sql\nSELECT * FROM Employees \nWHERE department = 'IT' \nORDER BY salary DESC;\n```\n🔹 এটি **শুধুমাত্র IT ডিপার্টমেন্টের কর্মীদের দেখাবে এবং তাদের বেতন অনুযায়ী বড় থেকে ছোট সাজাবে**।  \n\n---\n\n## **✅ সংক্ষেপে `ORDER BY` এর সুবিধা**\n✔ **ডাটা সাজানো সহজ হয়**  \n✔ **Ascending বা Descending যেকোনোভাবে সাজানো যায়**  \n✔ **বড় ডাটাবেজে রিপোর্ট তৈরি করার জন্য গুরুত্বপূর্ণ**  \n\n---\n\n### **`NULL` এবং `NOT NULL` কিভাবে কাজ করে?**  \nSQL-এ **`NULL`** মানে হলো **কোনো ডাটা নেই বা অজানা মান**, আর **`NOT NULL`** মানে হলো **ঐ কলামে অবশ্যই ডাটা থাকতে হবে**।  \n\n---\n\n## **✅ `NULL` ও `NOT NULL` এর সাধারণ ব্যাখ্যা**  \n- **`NULL`** → যদি কোনো কলামে **মান না থাকে**, তাহলে সেটি `NULL` হবে।  \n- **`NOT NULL`** → যদি কোনো কলামে `NOT NULL` দেয়া থাকে, তাহলে **সেই কলামে অবশ্যই ডাটা দিতে হবে**।  \n\n---\n\n## **✅ `NULL` ও `NOT NULL` টেবিল তৈরিতে কিভাবে ব্যবহার করা হয়?**  \n```sql\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,  -- এখানে অবশ্যই নাম দিতে হবে\n    department VARCHAR(30) NULL,  -- এখানে ডাটা না দিলেও হবে\n    age INT CHECK (age \u003e= 18),\n    salary DECIMAL(10,2) NOT NULL,  -- অবশ্যই বেতন দিতে হবে\n    join_date DATE NULL  -- তারিখ দেওয়া বাধ্যতামূলক না\n);\n```\n🔹 **`NOT NULL` থাকা মানে** → ঐ কলামে ডাটা **অবশ্যই দিতে হবে**।  \n🔹 **`NULL` থাকা মানে** → ঐ কলামে ডাটা **না দিলেও চলবে**।  \n\n---\n\n## **✅ `NULL` ডাটা ইনসার্ট করা**  \n```sql\nINSERT INTO employees (name, department, age, salary, join_date)  \nVALUES ('Samiul', NULL, 25, 50000.00, '2022-03-15');\n```\n🔹 এখানে **`department` কলামে `NULL` রাখা হয়েছে**।  \n\n---\n\n## **✅ `NOT NULL` কলামে `NULL` দিলে কী হবে?**  \n```sql\nINSERT INTO employees (name, department, age, salary, join_date)  \nVALUES (NULL, 'IT', 25, 50000.00, '2022-03-15');\n```\n⚠ **Error: Column 'name' cannot be null**  \n🔹 কারণ **`name` কলামে `NOT NULL` দেয়া আছে**, তাই `NULL` দেওয়া যাবে না।  \n\n---\n\n## **✅ `NULL` চেক করা (WHERE সহ)**  \n🔹 **`IS NULL` দিয়ে চেক করা হয় কোন কলাম `NULL` আছে কিনা**  \n```sql\nSELECT * FROM employees WHERE department IS NULL;\n```\n🔹 **যেসব কর্মীর `department` `NULL`, শুধু তাদের দেখাবে**  \n\n🔹 **`IS NOT NULL` দিয়ে `NULL` না থাকা ডাটা খুঁজতে পারি**  \n```sql\nSELECT * FROM employees WHERE department IS NOT NULL;\n```\n🔹 **যাদের `department` এ মান আছে, শুধু তাদের দেখাবে**  \n\n---\n\n## **✅ `NULL` ফিল্ড আপডেট করা (`UPDATE` সহ)**  \n```sql\nUPDATE employees  \nSET department = 'HR'  \nWHERE department IS NULL;\n```\n🔹 **যাদের `department` `NULL`, তাদের `HR` সেট করা হবে**  \n\n---\n\n## **✅ `NULL` কে `DEFAULT` মান সেট করা**  \n```sql\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    department VARCHAR(30) DEFAULT 'Unknown',\n    age INT CHECK (age \u003e= 18),\n    salary DECIMAL(10,2) NOT NULL,\n    join_date DATE NULL\n);\n```\n🔹 **যদি `department`-এ কোনো মান না দেওয়া হয়, তাহলে স্বয়ংক্রিয়ভাবে 'Unknown' হয়ে যাবে**  \n\n---\n\n### 🔥 **সংক্ষেপে `NULL` এবং `NOT NULL`**  \n✔ **`NULL`** → কলামে কোনো ডাটা না থাকলে `NULL` হতে পারে  \n✔ **`NOT NULL`** → কলামে ডাটা থাকা বাধ্যতামূলক  \n✔ **`IS NULL`** → `NULL` চেক করার জন্য  \n✔ **`IS NOT NULL`** → `NULL` না থাকা চেক করার জন্য  \n✔ **`UPDATE` দিয়ে `NULL` ফিল্ড আপডেট করা যায়**  \n\n---\n\n### **🔹 `ON` কিভাবে কাজ করে? (পূর্ণাঙ্গ উদাহরণ)**  \n\nআমরা দুটি টেবিল তৈরি করবো:  \n1. **`employees`** → কর্মীদের তথ্য থাকবে  \n2. **`departments`** → ডিপার্টমেন্টের তথ্য থাকবে  \n\nএরপর আমরা **`ON` সহ `JOIN` ব্যবহার করে** কর্মীদের সাথে তাদের ডিপার্টমেন্ট মিলিয়ে দেখাবো।  \n\n---\n\n### **✅ `CREATE TABLE` - টেবিল তৈরি করা**  \n```sql\nCREATE TABLE departments (\n    id INT PRIMARY KEY,\n    department_name VARCHAR(50) NOT NULL\n);\n\nCREATE TABLE employees (\n    id INT PRIMARY KEY,\n    name VARCHAR(50) NOT NULL,\n    department_id INT,\n    FOREIGN KEY (department_id) REFERENCES departments(id)\n);\n```\n🔹 **`departments` টেবিলে প্রতিটি ডিপার্টমেন্টের নাম থাকবে।**  \n🔹 **`employees` টেবিলে `department_id` ফিল্ড আছে**, যা `departments` টেবিলের `id` এর সাথে সম্পর্কিত।  \n\n---\n\n### **✅ `INSERT INTO` - ডাটা যোগ করা**  \n```sql\nINSERT INTO departments (id, department_name) VALUES\n(101, 'IT'),\n(102, 'HR'),\n(103, 'Marketing');\n\nINSERT INTO employees (id, name, department_id) VALUES\n(1, 'Arafat', 101),\n(2, 'Samiul', 102),\n(3, 'Shuvo', 103),\n(4, 'Alex', NULL);\n```\n🔹 **`departments` টেবিলে ৩টি ডিপার্টমেন্ট যোগ করা হলো।**  \n🔹 **`employees` টেবিলে ৪ জন কর্মী যোগ করা হলো।**  \n🔹 **Alex-এর `department_id` `NULL`, মানে সে কোনো ডিপার্টমেন্টে নেই।**  \n\n---\n\n### **✅ `ON` ব্যবহার করে `INNER JOIN`**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nON employees.department_id = departments.id;\n```\n🔹 **শুধুমাত্র যাদের ডিপার্টমেন্ট আছে, তাদের দেখাবে।**  \n\n#### **📌 Output:**  \n| name   | department_name |  \n|--------|---------------|  \n| Arafat | IT            |  \n| Samiul | HR            |  \n| Shuvo  | Marketing     |  \n\n🔹 **Alex নেই, কারণ তার `department_id` `NULL`।**  \n\n---\n\n### **✅ `ON` ব্যবহার করে `LEFT JOIN`**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nLEFT JOIN departments  \nON employees.department_id = departments.id;\n```\n🔹 **সব কর্মী দেখাবে, এমনকি যাদের ডিপার্টমেন্ট নেই তাদেরও।**  \n\n#### **📌 Output:**  \n| name   | department_name |  \n|--------|---------------|  \n| Arafat | IT            |  \n| Samiul | HR            |  \n| Shuvo  | Marketing     |  \n| Alex   | NULL          |  \n\n🔹 **Alex-এর ডিপার্টমেন্ট নেই, তাই `NULL` দেখাবে।**  \n\n---\n\n### **✅ `ON` এবং `USING` এর পার্থক্য**  \n🔹 **যদি উভয় টেবিলে কলামের নাম আলাদা হয়, তাহলে `ON` ব্যবহার করতে হয়।**  \n🔹 **যদি উভয় টেবিলে একই নামের কলাম থাকে, তাহলে `USING` ব্যবহার করা যায়।**  \n\n#### **`ON` দিয়ে JOIN (যেহেতু কলামের নাম ভিন্ন)**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nON employees.department_id = departments.id;\n```\n\n#### **`USING` দিয়ে JOIN (যদি উভয় টেবিলে `department_id` থাকে)**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nUSING (department_id);\n```\n\n---\n\n### 🔥 **সংক্ষেপে `ON`**  \n✔ **`ON` মূলত `JOIN` এর ক্ষেত্রে ব্যবহার হয়।**  \n✔ **`ON` যখন ব্যবহার করতে হয়?** → যখন দুই টেবিলের সম্পর্কিত কলামের নাম ভিন্ন হয়।  \n✔ **`INNER JOIN`** → শুধুমাত্র যাদের মিল পাওয়া যায়, তাদের দেখায়।  \n✔ **`LEFT JOIN`** → সব কর্মী দেখায়, এমনকি যাদের ডিপার্টমেন্ট নেই, তাদেরও।  \n✔ **`USING` শুধুমাত্র ব্যবহার করা যায়, যখন কলামের নাম একই হয়।**  \n\n---\n\n### **🔹 `ON` কিভাবে কাজ করে? (পূর্ণাঙ্গ উদাহরণ)**  \n\nআমরা দুটি টেবিল তৈরি করবো:  \n1. **`employees`** → কর্মীদের তথ্য থাকবে  \n2. **`departments`** → ডিপার্টমেন্টের তথ্য থাকবে  \n\nএরপর আমরা **`ON` সহ `JOIN` ব্যবহার করে** কর্মীদের সাথে তাদের ডিপার্টমেন্ট মিলিয়ে দেখাবো।  \n\n---\n\n### **✅ `CREATE TABLE` - টেবিল তৈরি করা**  \n```sql\nCREATE TABLE departments (\n    id INT PRIMARY KEY,\n    department_name VARCHAR(50) NOT NULL\n);\n\nCREATE TABLE employees (\n    id INT PRIMARY KEY,\n    name VARCHAR(50) NOT NULL,\n    department_id INT,\n    FOREIGN KEY (department_id) REFERENCES departments(id)\n);\n```\n🔹 **`departments` টেবিলে প্রতিটি ডিপার্টমেন্টের নাম থাকবে।**  \n🔹 **`employees` টেবিলে `department_id` ফিল্ড আছে**, যা `departments` টেবিলের `id` এর সাথে সম্পর্কিত।  \n\n---\n\n### **✅ `INSERT INTO` - ডাটা যোগ করা**  \n```sql\nINSERT INTO departments (id, department_name) VALUES\n(101, 'IT'),\n(102, 'HR'),\n(103, 'Marketing');\n\nINSERT INTO employees (id, name, department_id) VALUES\n(1, 'Arafat', 101),\n(2, 'Samiul', 102),\n(3, 'Shuvo', 103),\n(4, 'Alex', NULL);\n```\n🔹 **`departments` টেবিলে ৩টি ডিপার্টমেন্ট যোগ করা হলো।**  \n🔹 **`employees` টেবিলে ৪ জন কর্মী যোগ করা হলো।**  \n🔹 **Alex-এর `department_id` `NULL`, মানে সে কোনো ডিপার্টমেন্টে নেই।**  \n\n---\n\n### **✅ `ON` ব্যবহার করে `INNER JOIN`**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nON employees.department_id = departments.id;\n```\n🔹 **শুধুমাত্র যাদের ডিপার্টমেন্ট আছে, তাদের দেখাবে।**  \n\n#### **📌 Output:**  \n| name   | department_name |  \n|--------|---------------|  \n| Arafat | IT            |  \n| Samiul | HR            |  \n| Shuvo  | Marketing     |  \n\n🔹 **Alex নেই, কারণ তার `department_id` `NULL`।**  \n\n---\n\n### **✅ `ON` ব্যবহার করে `LEFT JOIN`**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nLEFT JOIN departments  \nON employees.department_id = departments.id;\n```\n🔹 **সব কর্মী দেখাবে, এমনকি যাদের ডিপার্টমেন্ট নেই তাদেরও।**  \n\n#### **📌 Output:**  \n| name   | department_name |  \n|--------|---------------|  \n| Arafat | IT            |  \n| Samiul | HR            |  \n| Shuvo  | Marketing     |  \n| Alex   | NULL          |  \n\n🔹 **Alex-এর ডিপার্টমেন্ট নেই, তাই `NULL` দেখাবে।**  \n\n---\n\n### **✅ `ON` এবং `USING` এর পার্থক্য**  \n🔹 **যদি উভয় টেবিলে কলামের নাম আলাদা হয়, তাহলে `ON` ব্যবহার করতে হয়।**  \n🔹 **যদি উভয় টেবিলে একই নামের কলাম থাকে, তাহলে `USING` ব্যবহার করা যায়।**  \n\n#### **`ON` দিয়ে JOIN (যেহেতু কলামের নাম ভিন্ন)**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nON employees.department_id = departments.id;\n```\n\n#### **`USING` দিয়ে JOIN (যদি উভয় টেবিলে `department_id` থাকে)**  \n```sql\nSELECT employees.name, departments.department_name  \nFROM employees  \nINNER JOIN departments  \nUSING (department_id);\n```\n\n---\n\n### 🔥 **সংক্ষেপে `ON`**  \n✔ **`ON` মূলত `JOIN` এর ক্ষেত্রে ব্যবহার হয়।**  \n✔ **`ON` যখন ব্যবহার করতে হয়?** → যখন দুই টেবিলের সম্পর্কিত কলামের নাম ভিন্ন হয়।  \n✔ **`INNER JOIN`** → শুধুমাত্র যাদের মিল পাওয়া যায়, তাদের দেখায়।  \n✔ **`LEFT JOIN`** → সব কর্মী দেখায়, এমনকি যাদের ডিপার্টমেন্ট নেই, তাদেরও।  \n✔ **`USING` শুধুমাত্র ব্যবহার করা যায়, যখন কলামের নাম একই হয়।**  \n\n---\n\n### **🔹 SQL-এ `DUPLICATE TABLE` তৈরি করার উপায়**  \n\n🔹 **কোনো টেবিলের স্ট্রাকচার ও ডাটা ক্লোন (Copy) করার জন্য `CREATE TABLE ... AS` ব্যবহার করা হয়।**  \n🔹 **কোনো টেবিলের শুধুমাত্র স্ট্রাকচার ক্লোন করতে `CREATE TABLE ... LIKE` ব্যবহার করা হয়।**  \n\n---\n\n## **✅ ১. সম্পূর্ণ টেবিল ডুপ্লিকেট করা (`CREATE TABLE ... AS`)**  \n🔹 **একটি বিদ্যমান টেবিলের সকল ডাটা সহ নতুন টেবিল তৈরি করতে:**  \n```sql\nCREATE TABLE employees_duplicate AS  \nSELECT * FROM employees;\n```\n🔹 **`employees_duplicate` নামে নতুন টেবিল তৈরি হবে, যেখানে `employees` টেবিলের সব ডাটা থাকবে।**  \n\n#### **📌 Output (নতুন `employees_duplicate` টেবিল)**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 1  | Arafat  | IT        | 50000  |  \n| 2  | Samiul  | HR        | 40000  |  \n| 3  | Shuvo   | Marketing | 45000  |  \n\n---\n\n## **✅ ২. শুধু টেবিলের স্ট্রাকচার ডুপ্লিকেট করা (`CREATE TABLE ... LIKE`)**  \n🔹 **শুধু টেবিলের স্ট্রাকচার ক্লোন করতে চাইলে:**  \n```sql\nCREATE TABLE employees_structure LIKE employees;\n```\n🔹 **এতে শুধু কলামের স্ট্রাকচার কপি হবে, কিন্তু কোনো ডাটা থাকবে না।**  \n\n#### **📌 Output (নতুন `employees_structure` টেবিল, কিন্তু খালি)**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n|    |      |           |        |  \n\n🔹 **কোনো ডাটা নেই, কারণ `LIKE` শুধু স্ট্রাকচার কপি করে, ডাটা না।**  \n\n---\n\n## **✅ ৩. নির্দিষ্ট কিছু কলামের ডাটা কপি করা**  \n🔹 **ধরুন, শুধু `name` এবং `salary` ডাটা সহ নতুন টেবিল তৈরি করতে চাই:**  \n```sql\nCREATE TABLE high_salary_employees AS  \nSELECT name, salary FROM employees WHERE salary \u003e 40000;\n```\n🔹 **শুধুমাত্র যাদের `salary \u003e 40000` তারা `high_salary_employees` টেবিলে থাকবে।**  \n\n#### **📌 Output (নতুন `high_salary_employees` টেবিল)**  \n| name   | salary  |  \n|--------|--------|  \n| Arafat | 50000  |  \n| Shuvo  | 45000  |  \n\n---\n\n## **✅ ৪. টেবিল ডুপ্লিকেট করার পরে নতুন ডাটা যোগ করা**  \n```sql\nINSERT INTO employees_duplicate (id, name, department, salary)  \nVALUES (4, 'Alex', 'Finance', 42000);\n```\n🔹 **এতে `employees_duplicate` টেবিলে নতুন রো যোগ হবে, কিন্তু `employees` টেবিল অক্ষত থাকবে।**  \n\n---\n\n## 🔥 **সংক্ষেপে `DUPLICATE TABLE`**  \n✔ **`CREATE TABLE new_table AS SELECT * FROM old_table;`** → টেবিলের স্ট্রাকচার ও ডাটা কপি করবে।  \n✔ **`CREATE TABLE new_table LIKE old_table;`** → শুধুমাত্র স্ট্রাকচার কপি করবে, কোনো ডাটা থাকবে না।  \n✔ **নির্দিষ্ট কলামের ডাটা কপি করতে `SELECT column1, column2 FROM table` ব্যবহার করা যায়।**  \n\n---\n### **🔹 `dummy_employee` নামে `employees` টেবিলের ডুপ্লিকেট তৈরি করা**  \n\n🔹 **আপনি `employees` টেবিলের সব ডাটা ও স্ট্রাকচার কপি করতে পারেন নিচের দুটি পদ্ধতিতে:**  \n\n---\n\n### **✅ `CREATE TABLE ... AS SELECT * FROM` (ডাটা ও স্ট্রাকচার কপি করবে)**  \n```sql\nCREATE TABLE dummy_employee AS  \nSELECT * FROM employees;\n```\n🔹 **এটি `employees` টেবিলের সব কলাম ও ডাটা `dummy_employee` টেবিলে কপি করবে।**  \n\n---\n\n### **✅ `CREATE TABLE ... LIKE` (শুধুমাত্র স্ট্রাকচার কপি করবে, ডাটা থাকবে না)**  \n```sql\nCREATE TABLE dummy_employee LIKE employees;\n```\n🔹 **এতে `dummy_employee` টেবিল `employees` এর মতোই হবে, কিন্তু কোনো ডাটা থাকবে না।**  \n🔹 **ডাটা যোগ করতে চাইলে:**  \n```sql\nINSERT INTO dummy_employee SELECT * FROM employees;\n```\n\n---\n\n### **✅ নিশ্চিত করার জন্য `SELECT` করে দেখুন:**  \n```sql\nSELECT * FROM dummy_employee;\n```\n🔹 **এতে `dummy_employee` টেবিলের সব ডাটা দেখতে পাবেন।**  \n\n---\n### **🔹 `dummy_employee` টেবিল ব্যবহার করে `LIMIT` বুঝিয়ে দেওয়া**  \n\nএখন থেকে **`dummy_employee`** টেবিল নিয়ে কাজ করবো এবং `LIMIT` সম্পর্কে বিস্তারিত দেখাবো।  \n\n---\n\n## **✅ `LIMIT` দিয়ে নির্দিষ্ট সংখ্যক রো দেখানো**  \n🔹 প্রথম **৫ জন কর্মী** দেখাতে চাইলে:  \n```sql\nSELECT * FROM dummy_employee  \nLIMIT 5;\n```\n🔹 **📌 Output:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 1  | Arafat  | IT        | 50000  |  \n| 2  | Samiul  | HR        | 40000  |  \n| 3  | Shuvo   | Marketing | 45000  |  \n| 4  | Alex    | Finance   | 42000  |  \n| 5  | John    | IT        | 46000  |  \n\n---\n\n## **✅ `LIMIT` + `ORDER BY` (সবচেয়ে বেশি বেতনের ৩ জন কর্মী দেখানো)**  \n```sql\nSELECT * FROM dummy_employee  \nORDER BY salary DESC  \nLIMIT 3;\n```\n🔹 **📌 Output:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 1  | Arafat  | IT        | 50000  |  \n| 5  | John    | IT        | 46000  |  \n| 3  | Shuvo   | Marketing | 45000  |  \n\n---\n\n## **✅ `LIMIT` + `OFFSET` (দ্বিতীয় পৃষ্ঠার ডাটা আনতে)**  \n🔹 প্রথম **৫টি রো বাদ দিয়ে পরের ৫টি রো দেখতে চাইলে:**  \n```sql\nSELECT * FROM dummy_employee  \nLIMIT 5 OFFSET 5;\n```\n🔹 **📌 Output:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 6  | Michael | HR        | 39000  |  \n| 7  | Sarah   | IT        | 42000  |  \n| 8  | David   | Finance   | 41000  |  \n| 9  | Emma    | HR        | 43000  |  \n| 10 | James   | IT        | 40000  |  \n\n---\n\n## **✅ `LIMIT` + `WHERE` (শর্ত দিয়ে নির্দিষ্ট সংখ্যক রো দেখানো)**  \n🔹 **শুধুমাত্র `IT` ডিপার্টমেন্টের প্রথম ২ জন কর্মী দেখতে চাইলে:**  \n```sql\nSELECT * FROM dummy_employee  \nWHERE department = 'IT'  \nLIMIT 2;\n```\n🔹 **📌 Output:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 1  | Arafat  | IT        | 50000  |  \n| 5  | John    | IT        | 46000  |  \n\n---\n\n## **✅ `LIMIT` + `DELETE` (শুধু নির্দিষ্ট সংখ্যক রো মুছতে)**  \n🔹 যদি **শুধু প্রথম ৩ জন কর্মী ডিলিট করতে চাই:**  \n```sql\nDELETE FROM dummy_employee  \nORDER BY id ASC  \nLIMIT 3;\n```\n🔹 **📌 Result:** প্রথম ৩ জন কর্মী **মুছে যাবে।**  \n\n---\n\n## **🔥 সংক্ষেপে `LIMIT`**  \n✔ **`LIMIT n`** → প্রথম `n` সংখ্যক রো দেখায়।  \n✔ **`LIMIT n OFFSET m`** → প্রথম `m` রো বাদ দিয়ে পরের `n` রো দেখায়।  \n✔ **`ORDER BY` + `LIMIT`** → বড় বা ছোট মানের শীর্ষ `n` টা রো দেখাতে সাহায্য করে।  \n✔ **`WHERE` + `LIMIT`** → শর্ত অনুযায়ী নির্দিষ্ট সংখ্যক রো ফিল্টার করে।  \n✔ **`DELETE` + `LIMIT`** → নির্দিষ্ট সংখ্যক রো ডিলিট করে।  \n\n---\n\n\n### **🔹 SQL-এ `OFFSET` কীভাবে কাজ করে?**  \n🔹 **`OFFSET` সাধারণত `LIMIT` এর সাথে ব্যবহার হয়, যা নির্দিষ্ট সংখ্যক রো স্কিপ (বাদ) করে পরের ডাটা দেখাতে সাহায্য করে।**  \n🔹 এটি **পেজিনেশন (pagination)** করার জন্য অনেক বেশি ব্যবহৃত হয়।  \n\n---\n\n## **✅ `LIMIT` vs `LIMIT + OFFSET`**  \n📌 **কেবল `LIMIT` দিলে:** প্রথম `n` সংখ্যক রো দেখাবে।  \n📌 **`LIMIT + OFFSET` দিলে:** প্রথম `OFFSET` সংখ্যক রো বাদ দিয়ে, পরের `LIMIT` সংখ্যক রো দেখাবে।  \n\n---\n\n## **✅ `OFFSET` সহ `dummy_employee` টেবিলে কাজ করা**  \n\n### **১️⃣ প্রথম ৫ জন কর্মী দেখানো (`LIMIT` ব্যবহার করে)**  \n```sql\nSELECT * FROM dummy_employee  \nLIMIT 5;\n```\n🔹 **Result:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 1  | Arafat  | IT        | 50000  |  \n| 2  | Samiul  | HR        | 40000  |  \n| 3  | Shuvo   | Marketing | 45000  |  \n| 4  | Alex    | Finance   | 42000  |  \n| 5  | John    | IT        | 46000  |  \n\n---\n\n### **২️⃣ প্রথম ৫টি রো বাদ দিয়ে, পরের ৫টি রো দেখানো (`OFFSET` ব্যবহার করে)**  \n```sql\nSELECT * FROM dummy_employee  \nLIMIT 5 OFFSET 5;\n```\n🔹 **Result:**  \n| id | name    | department | salary  |  \n|----|--------|-----------|--------|  \n| 6  | Michael | HR        | 39000  |  \n| 7  | Sarah   | IT        | 42000  |  \n| 8  | David   | Finance   | 41000  |  \n| 9  | Emma    | HR        | 43000  |  \n| 10 | James   | IT        | 40000  |  \n\n📌 **এখানে প্রথম ৫টি রো বাদ দেওয়া হয়েছে, তাই রেজাল্ট শুরু হয়েছে `id = 6` থেকে।**  \n\n---\n\n### **৩️⃣ ১০টি রো বাদ দিয়ে, পরের ৫টি রো দেখানো**  \n```sql\nSELECT * FROM dummy_employee  \nLIMIT 5 OFFSET 10;\n```\n🔹 **Result:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 11 | Robert  | Finance   | 45000  |  \n| 12 | Sophia  | HR        | 39000  |  \n| 13 | William | IT        | 47000  |  \n| 14 | Olivia  | Marketing | 41000  |  \n| 15 | Daniel  | IT        | 43000  |  \n\n📌 **এবার প্রথম ১০টি রো বাদ দেওয়া হয়েছে, তাই রেজাল্ট শুরু হয়েছে `id = 11` থেকে।**  \n\n---\n\n## **✅ `ORDER BY` + `OFFSET` (বেশি বেতনের কর্মীদের মধ্যে ৫-১০ নম্বর অবস্থানে থাকা কর্মীরা)**  \n```sql\nSELECT * FROM dummy_employee  \nORDER BY salary DESC  \nLIMIT 5 OFFSET 5;\n```\n🔹 **Result:**  \n| id | name  | department | salary  |  \n|----|------|-----------|--------|  \n| 6  | Michael | HR        | 39000  |  \n| 7  | Sarah   | IT        | 42000  |  \n| 8  | David   | Finance   | 41000  |  \n| 9  | Emma    | HR        | 43000  |  \n| 10 | James   | IT        | 40000  |  \n\n📌 **এখানে বেশি বেতনের **শীর্ষ ৫ জন বাদ দিয়ে, পরের ৫ জনকে দেখানো হয়েছে।**  \n\n---\n\n## **✅ `DELETE` + `OFFSET` (প্রথম ৫ জন বাদ দিয়ে, পরের ৩ জন কর্মী ডিলিট করা)**  \n```sql\nDELETE FROM dummy_employee  \nORDER BY id ASC  \nLIMIT 3 OFFSET 5;\n```\n📌 **এতে প্রথম ৫ জন বাদ দিয়ে, পরের ৩ জন কর্মী ডিলিট হবে।**  \n\n---\n\n## **🔥 সংক্ষেপে `OFFSET`**  \n✔ **`LIMIT n`** → প্রথম `n` সংখ্যক রো দেখাবে।  \n✔ **`LIMIT n OFFSET m`** → প্রথম `m` সংখ্যক রো বাদ দিয়ে, পরের `n` সংখ্যক রো দেখাবে।  \n✔ **`ORDER BY` + `OFFSET`** → কোনো নির্দিষ্ট ক্রমে (সর্বোচ্চ বা সর্বনিম্ন) কিছু রো বাদ দিয়ে দেখানো যায়।  \n✔ **`DELETE` + `OFFSET`** → নির্দিষ্ট সংখ্যক রো বাদ দিয়ে কিছু রো মুছে ফেলা যায়।  \n\n---\n\n### **🔹 `GROUP BY` কীভাবে কাজ করে?**\n\n**`GROUP BY`** SQL-এর একটি শক্তিশালী ক্লজ যা ব্যবহার করে ডাটাকে এক বা একাধিক কলামের ভিত্তিতে **গ্রুপ** করা হয় এবং সাধারণত **অ্যাগ্রিগেট ফাংশন** (যেমন `SUM`, `AVG`, `COUNT`, `MIN`, `MAX`) এর সাথে ব্যবহৃত হয়। এটি আপনাকে ডাটা গ্রুপ করে প্রতিটি গ্রুপের উপর ফাংশন প্রয়োগ করতে সাহায্য করে।  \n\n---\n\n### **✅ `GROUP BY` এর সেগমেন্ট:**\n\n1. **`GROUP BY` একটি বা একাধিক কলাম নিয়ে গ্রুপ করে।**\n2. **অ্যাগ্রিগেট ফাংশন** শুধুমাত্র গ্রুপের উপর কাজ করে।\n3. **`HAVING`** (যা `WHERE` এর মতো) গ্রুপের উপর শর্ত দেয়, কিন্তু `WHERE` শুধুমাত্র রেকর্ডগুলোর উপর কাজ করে।\n\n---\n\n### **✅ উদাহরণ ১: `GROUP BY` এক কলাম দিয়ে**\n\nধরা যাক **`dummy_employee`** টেবিলে কর্মীদের বেতন দেখানোর পাশাপাশি, **ডিপার্টমেন্ট অনুযায়ী গড় বেতন** দেখতে চাই।\n\n#### **`GROUP BY` দিয়ে `department` অনুযায়ী গড় বেতন বের করা:**\n```sql\nSELECT department, AVG(salary) AS avg_salary \nFROM dummy_employee\nGROUP BY department;\n```\n\n🔹 **Result:**  \n| department | avg_salary |  \n|------------|------------|  \n| IT         | 47000.00   |  \n| HR         | 42000.00   |  \n| Marketing  | 43000.00   |  \n| Finance    | 42000.00   |  \n\n---\n\n### **✅ উদাহরণ ২: `GROUP BY` একাধিক কলাম দিয়ে**\n\nধরা যাক, আপনি ডিপার্টমেন্ট এবং বেতন অনুসারে কর্মীদের **গণনা** করতে চান। আপনি দুটি কলাম ব্যবহার করতে পারেন — `department` এবং `salary`।\n\n#### **`GROUP BY` দিয়ে `department` এবং `salary` অনুযায়ী মোট কর্মী গণনা:**\n```sql\nSELECT department, salary, COUNT(*) AS total_employees\nFROM dummy_employee\nGROUP BY department, salary;\n```\n\n🔹 **Result:**  \n| department | salary | total_employees |  \n|------------|--------|-----------------|  \n| IT         | 50000  | 2               |  \n| HR         | 39000  | 1               |  \n| Marketing  | 45000  | 1               |  \n| Finance    | 42000  | 1               |  \n| IT         | 46000  | 1               |  \n| HR         | 43000  | 1               |  \n| Marketing  | 41000  | 1               |  \n\n---\n\n### **✅ `GROUP BY` + `HAVING`**\n\n**`HAVING`** হল একটি শর্ত যা **`GROUP BY`** এর পরে ব্যবহৃত হয়, এবং এটি গ্রুপ করা রেকর্ডের উপর শর্ত প্রয়োগ করে। এটি **`WHERE`** এর মতো কাজ করে, তবে **`WHERE`** কেবল রেকর্ডের জন্য ব্যবহার করা যায়, আর **`HAVING`** গ্রুপের জন্য।\n\n#### **উদাহরণ:**  \nযদি আপনি চাচ্ছেন, এমন ডিপার্টমেন্টগুলো দেখাতে যেখানে গড় বেতন ৪৫০০০ টাকার বেশি:\n\n```sql\nSELECT department, AVG(salary) AS avg_salary \nFROM dummy_employee\nGROUP BY department\nHAVING AVG(salary) \u003e 45000;\n```\n\n🔹 **Result:**  \n| department | avg_salary |  \n|------------|------------|  \n| IT         | 47000.00   |  \n\n---\n\n### **✅ `GROUP BY` + `ORDER BY`**\n\nআপনি **`GROUP BY`** এর সাথে **`ORDER BY`** ব্যবহার করে গ্রুপের রেজাল্টগুলো নির্দিষ্ট অর্ডারে সাজাতে পারেন।\n\n#### **উদাহরণ:**  \n**`department` অনুযায়ী গড় বেতন দেখানোর পাশাপাশি, `avg_salary` অনুসারে সাজানো:**\n\n```sql\nSELECT department, AVG(salary) AS avg_salary \nFROM dummy_employee\nGROUP BY department\nORDER BY avg_salary DESC;\n```\n\n🔹 **Result:**  \n| department | avg_salary |  \n|------------|------------|  \n| IT         | 47000.00   |  \n| Marketing  | 43000.00   |  \n| Finance    | 42000.00   |  \n| HR         | 42000.00   |  \n\n---\n\n### **🔥 সংক্ষেপে `GROUP BY`:**\n\n- **`GROUP BY column`** → একটি কলাম (বা একাধিক কলাম) ব্যবহার করে রেকর্ডগুলো গ্রুপ করে।\n- **`HAVING`** → `GROUP BY` এর পরে শর্ত দেয় (গ্রুপের ওপর)।\n- **`ORDER BY`** → গ্রুপগুলিকে সাজাতে ব্যবহৃত হয়।\n- **অ্যাগ্রিগেট ফাংশন** (যেমন `AVG`, `SUM`, `COUNT`, `MIN`, `MAX`) গ্রুপের উপর কাজ করে।\n\n---\n\n### **🔹 SQL-এ `MIN`, `MAX`, `COUNT`, `AVG`, `SUM` ফাংশন**  \nএই ফাংশনগুলো SQL এ **অ্যাগ্রিগেট ফাংশন** (Aggregate Functions) হিসেবে পরিচিত, যেগুলি ডাটার উপর গণনা করার জন্য ব্যবহৃত হয়। এগুলো সাধারণত **`GROUP BY`** এবং **`WHERE`** এর সাথে ব্যবহার করা হয়, কিন্তু এককভাবে ডাটার মোটামুটি এক্সট্র্যাক্ট করতে পারা যায়।  \n\n---\n\n### **✅ ১. `MIN` (সর্বনিম্ন মান)**  \n🔹 **`MIN` ফাংশন একটি কলামে সর্বনিম্ন মান খুঁজে বের করে।**\n\n#### **উদাহরণ:**  \n**`dummy_employee` টেবিলের `salary` কলাম থেকে সর্বনিম্ন বেতন খুঁজে বের করা:**\n```sql\nSELECT MIN(salary) AS min_salary FROM dummy_employee;\n```\n🔹 **Result:**  \n| min_salary |  \n|------------|  \n| 39000      |  \n\n---\n\n### **✅ ২. `MAX` (সর্বোচ্চ মান)**  \n🔹 **`MAX` ফাংশন একটি কলামে সর্বোচ্চ মান খুঁজে বের করে।**\n\n#### **উদাহরণ:**  \n**`dummy_employee` টেবিলের `salary` কলাম থেকে সর্বোচ্চ বেতন খুঁজে বের করা:**\n```sql\nSELECT MAX(salary) AS max_salary FROM dummy_employee;\n```\n🔹 **Result:**  \n| max_salary |  \n|------------|  \n| 50000      |  \n\n---\n\n### **✅ ৩. `COUNT` (ডাটা সংখ্যা গোনা)**  \n🔹 **`COUNT` ফাংশন কোনো কলামে মোট রেকর্ডের সংখ্যা গণনা করে।**\n\n#### **উদাহরণ:**  \n**`dummy_employee` টেবিলের মোট কর্মীর সংখ্যা জানার জন্য:**\n```sql\nSELECT COUNT(*) AS total_employees FROM dummy_employee;\n```\n🔹 **Result:**  \n| total_employees |  \n|-----------------|  \n| 15              |  \n\n---\n\n### **✅ ৪. `AVG` (গড় মান)**  \n🔹 **`AVG` ফাংশন কোনো কলামের গড় মান বের করে।**\n\n#### **উদাহরণ:**  \n**`dummy_employee` টেবিলের `salary` কলামের গড় বেতন বের করা:**\n```sql\nSELECT AVG(salary) AS avg_salary FROM dummy_employee;\n```\n🔹 **Result:**  \n| avg_salary |  \n|------------|  \n| 43500.00   |  \n\n---\n\n### **✅ ৫. `SUM` (মোট মান)**  \n🔹 **`SUM` ফাংশন কোনো কলামে সব মানের যোগফল বের করে।**\n\n#### **উদাহরণ:**  \n**`dummy_employee` টেবিলের `salary` কলামের মোট বেতন বের করা:**\n```sql\nSELECT SUM(salary) AS total_salary FROM dummy_employee;\n```\n🔹 **Result:**  \n| total_salary |  \n|--------------|  \n| 652500      |  \n\n---\n\n### **📌 একত্রে ব্যবহার**  \n**যদি সব ফাংশন একসাথে ব্যবহার করতে চান:**  \n```sql\nSELECT \n    MIN(salary) AS min_salary,\n    MAX(salary) AS max_salary,\n    COUNT(*) AS total_employees,\n    AVG(salary) AS avg_salary,\n    SUM(salary) AS total_salary\nFROM dummy_employee;\n```\n\n🔹 **Result:**  \n| min_salary | max_salary | total_employees | avg_salary | total_salary |  \n|------------|------------|-----------------|------------|--------------|  \n| 39000      | 50000      | 15              | 43500.00   | 652500       |  \n\n---\n\n### **🔥 সংক্ষেপে ফাংশনগুলো:**\n\n- **`MIN(column)`** → কলামের সর্বনিম্ন মান।\n- **`MAX(column)`** → কলামের সর্বোচ্চ মান।\n- **`COUNT(*)`** → মোট রেকর্ড সংখ্যা।\n- **`AVG(column)`** → কলামের গড় মান।\n- **`SUM(column)`** → কলামের সব মানের যোগফল।\n\n---\n\n### **🔹 `DISTINCT` কীভাবে কাজ করে?**\n\nSQL-এ **`DISTINCT`** একটি কিওয়ার্ড যা **ডুপ্লিকেট (পুনরাবৃত্ত) মান** বাদ দিয়ে, একক বা অনন্য (unique) মানগুলো প্রদর্শন করে। এটি মূলত ডুপ্লিকেট ডেটা ফিল্টার করতে ব্যবহৃত হয় এবং আপনি যেকোনো কলামে বা একাধিক কলামে **ডিস্টিংক্ট** মান দেখতে চাইলে এটি ব্যবহার করতে পারেন।  \n\n---\n\n### **✅ `DISTINCT` ব্যবহার:**\n\n**`DISTINCT`** কিওয়ার্ডটি আপনি **`SELECT`** কুইরি দিয়ে ব্যবহার করেন, এবং এটি ডুপ্লিকেট মান বাদ দিয়ে ফলাফল দেখায়।\n\n---\n\n### **✅ উদাহরণ ১: এক কলামে ডিস্টিংক্ট মান**\n\nধরা যাক, আপনি **`dummy_employee`** টেবিলের `department` কলাম থেকে শুধুমাত্র অনন্য ডিপার্টমেন্টগুলো দেখতে চান।\n\n```sql\nSELECT DISTINCT department FROM dummy_employee;\n```\n\n🔹 **Result:**  \n| department |  \n|------------|  \n| IT         |  \n| HR         |  \n| Marketing  |  \n| Finance    |  \n\nএখানে **`DISTINCT`** কিওয়ার্ডটি **ডিপার্টমেন্ট** কলামে ডুপ্লিকেট মান বাদ দিয়েছে এবং শুধুমাত্র অনন্য ডিপার্টমেন্ট নামগুলো দেখিয়েছে।\n\n---\n\n### **✅ উদাহরণ ২: একাধিক কলামে ডিস্টিংক্ট মান**\n\nআপনি **`department`** এবং **`salary`** কলাম দুটোতে **ডিস্টিংক্ট** মান দেখতে চাইলে:\n\n```sql\nSELECT DISTINCT department, salary FROM dummy_employee;\n```\n\n🔹 **Result:**  \n| department | salary |  \n|------------|--------|  \n| IT         | 50000  |  \n| HR         | 39000  |  \n| Marketing  | 45000  |  \n| Finance    | 42000  |  \n| IT         | 46000  |  \n| HR         | 43000  |  \n\nএখানে, **`DISTINCT`** ডিপার্টমেন্ট এবং বেতনের ইউনিক (অনন্য) কম্বিনেশনগুলো দেখিয়েছে, অর্থাৎ **একই ডিপার্টমেন্ট এবং বেতন একাধিক বার না দেখিয়ে, একবার দেখিয়েছে।**\n\n---\n\n### **✅ `DISTINCT` + `COUNT`**\n\nধরা যাক, আপনি **ডিপার্টমেন্টের সংখ্যা** জানাতে চান, কিন্তু একই ডিপার্টমেন্টের জন্য একাধিক কর্মী থাকলেও, শুধুমাত্র **অনন্য** ডিপার্টমেন্টের সংখ্যা চাইছেন।\n\n```sql\nSELECT COUNT(DISTINCT department) AS unique_departments \nFROM dummy_employee;\n```\n\n🔹 **Result:**  \n| unique_departments |  \n|--------------------|  \n| 4                  |  \n\nএখানে **`COUNT(DISTINCT department)`** **ডিস্টিংক্ট ডিপার্টমেন্ট** গুনে সংখ্যা দেখিয়েছে।  \n\n---\n\n### **📌 `DISTINCT` এর কিছু গুরুত্বপূর্ণ পয়েন্ট:**\n\n- **একাধিক কলাম:** যদি আপনি একাধিক কলামে **`DISTINCT`** ব্যবহার করেন, তাহলে কেবলমাত্র ঐ কলামের **কম্বিনেশন** হিসেবেই অনন্য (unique) মান দেখাবে।\n- **`DISTINCT`** কেবল **`SELECT`** কুইরিতে ব্যবহার করা হয়, ডেটা পরিবর্তন বা মুছে ফেলার ক্ষেত্রে নয়।\n- **কোনো ডুপ্লিকেট না থাকলে:** যখন ডুপ্লিকেট মান থাকে না, তখন `DISTINCT` কাজ করবে না এবং **সাধারণ `SELECT`** কুইরির মত রেজাল্ট দেখাবে।\n\n---\n\n### **🔥 সংক্ষেপে:**\n\n- **`DISTINCT`** → ডুপ্লিকেট মান বাদ দিয়ে অনন্য (unique) মান দেখায়।\n- একক কলাম বা একাধিক কলামে ব্যবহার করা যায়।\n- **`DISTINCT`** ব্যবহার করলে, ডুপ্লিকেট মান বাদ দেওয়া হয় এবং ফলাফল হিসেবে শুধুমাত্র একক বা অনন্য মান প্রদর্শিত হয়।\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frakibul263%2Fmysql-database","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frakibul263%2Fmysql-database","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frakibul263%2Fmysql-database/lists"}