এই পাঁচটি টুল শিক্ষানবিশ ট্র্যাকের বাইরে — জানা থাকা মূল্যবান, আর এই অংশে এতক্ষণ যা আলোচিত হয়েছে তা স্বাভাবিক মনে হলে ব্যবহার করার মতো। এটি দিয়েই SQL অংশ শেষ হচ্ছে।
একটি সংরক্ষিত কোয়েরি যা থেকে আপনি একটি ভার্চুয়াল টেবিলের মতো SELECT করতে পারেন — অন্তর্নিহিত তথ্য কপি করা হয় না, আর প্রতিবার ব্যবহারের সময় কোয়েরিটি আবার চলে।
CREATE VIEW view_name AS
SELECT ...;CREATE VIEW HighEarners AS
SELECT name, department, salary
FROM Employee
WHERE salary > 70000;
SELECT * FROM HighEarners;| name | department | salary |
|---|---|---|
| Alice | HR | 75000 |
| Priya | IT | 82000 |
সাধারণ ভুল
এক বা একাধিক কলামের উপর তৈরি একটি লুকআপ কাঠামো, যা ইঞ্জিনকে পুরো টেবিল স্ক্যান করার বদলে সরাসরি মিলে যাওয়া সারিতে লাফিয়ে যেতে দেয়।
CREATE INDEX index_name
ON table_name (column);CREATE INDEX idx_employee_department
ON Employee (department);
EXPLAIN SELECT * FROM Employee
WHERE department = 'IT';| type | key | rows |
|---|---|---|
| ALL | NULL | 5,000 |
| type | key | rows |
|---|---|---|
| ref | idx_employee_department | 12 |
type: ALL-এর মানে একটি ফুল টেবিল স্ক্যান — 5,000 সারির প্রতিটিই পরীক্ষা করা হয়।type: ref-এর মানে ইঞ্জিন idx_employee_department ব্যবহার করে সরাসরি প্রায় 12টি মিলে যাওয়া সারিতে লাফিয়ে গেছে।সাধারণ ভুল
নাম দিয়ে ডাকা যায় এমন একটি সংরক্ষিত SQL লজিকের ব্লক, ঐচ্ছিকভাবে প্যারামিটার পাস করে — লজিকটি প্রতিটি অ্যাপে বারবার লেখার বদলে ডেটাবেসে একবারই থাকে।
CREATE PROCEDURE name(params)
BEGIN
...
END;CREATE PROCEDURE GiveRaise(IN emp_id INT, IN amount DECIMAL(10,2))
BEGIN
UPDATE Employee
SET salary = salary + amount
WHERE id = emp_id;
END;
CALL GiveRaise(1, 5000.00);CALL নাম দিয়ে প্রসিডিউরটি চালায়, emp_id আর amount প্যারামিটার হিসেবে পাস করে।সাধারণ ভুল
একটি নির্দিষ্ট টেবিল ইভেন্ট — একটি INSERT, UPDATE, বা DELETE — ঘটলে স্বয়ংক্রিয়ভাবে চলা একটি SQL ব্লক, কোনো অ্যাপ্লিকেশন কোড ছাড়াই।
CREATE TRIGGER name
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON table
FOR EACH ROW
statement;CREATE TRIGGER LogSalaryChange
AFTER UPDATE ON Employee
FOR EACH ROW
INSERT INTO SalaryLog (employee_id, old_salary, new_salary)
VALUES (OLD.id, OLD.salary, NEW.salary);
UPDATE Employee SET salary = 70000 WHERE id = 1;| employee_id | old_salary | new_salary |
|---|---|---|
| 1 | 65000 | 70000 |
OLD আর NEW ট্রিগারকে একই স্টেটমেন্টে সারির আগের আর নতুন মান দুটোতেই অ্যাক্সেস দেয়।সাধারণ ভুল
EXPLAIN দেখায় ইঞ্জিন আসলে একটি কোয়েরি কীভাবে চালানোর পরিকল্পনা করছে — এটি সবকিছু স্ক্যান করছে নাকি একটি ইনডেক্স ব্যবহার করছে — অনুমান করে সময় নষ্ট করার আগেই।
EXPLAIN SELECT * FROM Employee
WHERE department = 'IT';| id | select_type | table | type | key | rows |
|---|---|---|---|---|---|
| 1 | SIMPLE | Employee | ALL | NULL | 5,000 |
type: ALL আর key: NULL একসাথে মানে কোনো ইনডেক্স ব্যবহৃত হচ্ছে না — প্রতিটি সারি স্ক্যান করা হয়।সাধারণ ভুল
একটি ইনডেক্স যোগ করে এটি আসলেই ব্যবহৃত হচ্ছে কি না তা নিশ্চিত করতে কখনো EXPLAIN না চালানো।
| টুল | যার জন্য ব্যবহৃত |
|---|---|
| VIEW | একটি সংরক্ষিত, পুনর্ব্যবহারযোগ্য কোয়েরি যা টেবিলের মতো আচরণ করে |
| INDEX | প্রায়ই ফিল্টার বা জয়েন করা কলামে দ্রুত লুকআপ |
| STORED PROCEDURE | পুনর্ব্যবহারযোগ্য SQL লজিক, যেকোনো অ্যাপ্লিকেশন থেকে নাম দিয়ে ডাকা |
| TRIGGER | একটি টেবিল ইভেন্টে স্বয়ংক্রিয়ভাবে চলা SQL |
| EXPLAIN | একটি কোয়েরি আসলে কীভাবে চলে তা দেখায়, অনুমান করার আগেই |
প্রথম দিনেই এগুলো দরকার নেই
উপযোগী SQL লিখতে এই পাঁচটিতে দক্ষ হওয়ার দরকার নেই — কমন টেবিল এক্সপ্রেশন পর্যন্ত যা আলোচিত হয়েছে তা মূল বিষয়গুলো পুঙ্খানুপুঙ্খভাবে কভার করে। এগুলো জানা থাকা মূল্যবান, আর বাকি সবকিছু স্বাভাবিক মনে হলে আবার ফিরে আসার মতো।
এখানেই SQL অংশ শেষ হচ্ছে — একটি একক SELECT স্টেটমেন্ট থেকে শুরু করে ইনডেক্স, প্রসিডিউর, আর ট্রিগার পর্যন্ত। এখানে যা কিছু আছে তা শুরুর দিকে আলোচিত চারটি পরিবারের উপরেই সরাসরি গড়ে উঠেছে: DDL, DML, DCL, আর TCL হলো সেই ভিত্তি যা পরের প্রতিটি পাঠ ধরে নিয়েছে।