ভূমিকা
সিনিয়র Java ডেভেলপার হিসেবে টেক ইন্টারভিউতে SQL একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। নিচে ১০টি প্রায়শই জিজ্ঞাসিত SQL ইন্টারভিউ প্রশ্ন এবং তাদের বিস্তারিত উত্তর বাংলায় দেওয়া হলো।
১. INNER JOIN, LEFT JOIN, RIGHT JOIN এবং FULL OUTER JOIN এর মধ্যে পার্থক্য কী?
উত্তর:
SQL JOIN ব্যবহার করে দুটি বা তার বেশি টেবিলের ডেটা একত্রিত করা হয়।
- INNER JOIN: শুধুমাত্র সেই রেকর্ডগুলো রিটার্ন করে যেগুলো উভয় টেবিলে মিলে যায়।
- LEFT JOIN: বাম টেবিলের সব রেকর্ড এবং ডান টেবিলের শুধুমাত্র মিলে যাওয়া রেকর্ড রিটার্ন করে। না মিললে NULL আসে।
- RIGHT JOIN: ডান টেবিলের সব রেকর্ড এবং বাম টেবিলের শুধুমাত্র মিলে যাওয়া রেকর্ড রিটার্ন করে।
- FULL OUTER JOIN: উভয় টেবিলের সব রেকর্ড রিটার্ন করে। না মিললে NULL দিয়ে পূরণ করে।
-- INNER JOIN উদাহরণ
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
-- LEFT JOIN উদাহরণ
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
২. SQL-এ HAVING এবং WHERE এর মধ্যে পার্থক্য কী?
উত্তর:
- WHERE clause: GROUP BY এর আগে ফিল্টার করে। এটি individual row-এর উপর কাজ করে এবং aggregate function ব্যবহার করা যায় না।
- HAVING clause: GROUP BY এর পরে ফিল্টার করে। এটি grouped data-র উপর কাজ করে এবং aggregate function (SUM, COUNT, AVG) ব্যবহার করা যায়।
-- WHERE দিয়ে: age > 25 এমন কর্মীদের বিভাগ এবং গড় বেতন
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
WHERE age > 25
GROUP BY dept_id
HAVING AVG(salary) > 50000;
৩. SQL-এ Subquery কী এবং Correlated Subquery কীভাবে কাজ করে?
উত্তর:
Subquery হলো একটি query-এর ভিতরে আরেকটি query। এটি main query চালানোর আগে execute হয় এবং একটি value বা result set রিটার্ন করে।
Correlated Subquery হলো এমন একটি subquery যেটি outer query-র প্রতিটি row-এর জন্য আলাদাভাবে execute হয় এবং outer query-র column ব্যবহার করে।
-- সাধারণ Subquery: সর্বোচ্চ বেতনের কর্মী
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
-- Correlated Subquery: যারা তাদের বিভাগের গড় বেতনের বেশি পান
SELECT name, salary, dept_id
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.dept_id = e1.dept_id
);
৪. Database Indexing কী এবং কখন Index ব্যবহার করা উচিত?
উত্তর:
Index হলো একটি database object যা query-র performance উন্নত করে। এটি একটি book-এর সূচিপত্রের মতো কাজ করে — পুরো টেবিল scan না করে দ্রুত ডেটা খুঁজে পেতে সাহায্য করে।
Index কখন ব্যবহার করবেন:
- WHERE clause-এ বারবার ব্যবহৃত column-এ
- JOIN condition-এ ব্যবহৃত column-এ
- ORDER BY বা GROUP BY-তে ব্যবহৃত column-এ
- বড় টেবিলে যেখানে SELECT query বেশি হয়
Index কখন এড়িয়ে চলবেন:
- ছোট টেবিলে
- INSERT/UPDATE/DELETE বেশি হলে (কারণ Index maintain করতে overhead হয়)
- কম unique value আছে এমন column-এ (যেমন boolean field)
-- Index তৈরি
CREATE INDEX idx_employee_email ON employees(email);
-- Composite Index
CREATE INDEX idx_emp_dept_salary ON employees(dept_id, salary);
৫. SQL-এ Window Function কী? RANK(), DENSE_RANK() এবং ROW_NUMBER() এর পার্থক্য কী?
উত্তর:
Window Function হলো এমন function যা row-এর একটি set বা "window"-এর উপর calculation করে, কিন্তু result set কমায় না (GROUP BY এর মতো নয়)।
- ROW_NUMBER(): প্রতিটি row-কে একটি unique sequential number দেয়।
- RANK(): একই value-এর row-গুলোকে same rank দেয় এবং পরের rank skip করে।
- DENSE_RANK(): একই value-এর row-গুলোকে same rank দেয় কিন্তু পরের rank skip করে না।
SELECT
name,
salary,
dept_id,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS row_num,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dense_rnk
FROM employees;
উদাহরণ ফলাফল (একটি department-এ বেতন ৬০০০০, ৬০০০০, ৫০০০০):
| salary | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 60000 | 1 | 1 | 1 |
| 60000 | 2 | 1 | 1 |
| 50000 | 3 | 3 | 2 |
৬. SQL Transactions কী এবং ACID properties কী কী?
উত্তর:
Transaction হলো একটি বা একাধিক SQL operation-এর একটি logical unit যা হয় সম্পূর্ণভাবে সম্পন্ন হবে অথবা সম্পূর্ণভাবে বাতিল হবে।
ACID Properties:
- Atomicity (পরমাণুতা): Transaction-এর সব operation হয় সম্পূর্ণ হবে, নয়তো একটিও হবে না। ব্যর্থ হলে সব ROLLBACK হয়।
- Consistency (সামঞ্জস্যতা): Transaction শেষে database সবসময় একটি valid state-এ থাকবে।
- Isolation (বিচ্ছিন্নতা): একটি transaction-এর intermediate result অন্য transaction দেখতে পাবে না।
- Durability (স্থায়িত্ব): COMMIT হওয়ার পর ডেটা permanently stored থাকবে, এমনকি system failure-এও।
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
-- সব ঠিক থাকলে
COMMIT;
-- কোনো সমস্যা হলে
-- ROLLBACK;
৭. Normalization কী? 1NF, 2NF এবং 3NF ব্যাখ্যা করুন।
উত্তর:
Normalization হলো database design-এর একটি প্রক্রিয়া যা data redundancy কমায় এবং data integrity নিশ্চিত করে।
1NF (First Normal Form):
- প্রতিটি column-এ atomic (অবিভাজ্য) value থাকবে
- কোনো repeating group থাকবে না
- প্রতিটি row unique হবে (Primary Key থাকবে)
2NF (Second Normal Form):
- 1NF পূরণ করতে হবে
- Composite primary key থাকলে, non-key attribute গুলো পুরো primary key-এর উপর dependent হতে হবে (partial dependency থাকবে না)
3NF (Third Normal Form):
- 2NF পূরণ করতে হবে
- Transitive dependency থাকবে না। অর্থাৎ কোনো non-key column অন্য non-key column-এর উপর নির্ভরশীল হবে না।
-- 3NF লঙ্ঘন: dept_name, dept_location নির্ভর করে dept_id-এর উপর,
-- dept_id নির্ভর করে emp_id-এর উপর (transitive dependency)
-- সমাধান: আলাদা departments টেবিল তৈরি করুন
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(100),
dept_location VARCHAR(100)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(100),
dept_id INT REFERENCES departments(dept_id)
);
৮. SQL-এ Stored Procedure এবং Function-এর মধ্যে পার্থক্য কী?
উত্তর:
| বৈশিষ্ট্য | Stored Procedure | Function |
|---|---|---|
| Return value | Optional, OUT parameter দিয়ে | অবশ্যই একটি value return করতে হবে |
| SELECT-এ ব্যবহার | সরাসরি ব্যবহার করা যায় না | SELECT statement-এ ব্যবহার করা যায় |
| DML operations | INSERT, UPDATE, DELETE করা যায় | সাধারণত করা যায় না |
| Transaction | নিজস্ব transaction handle করতে পারে | পারে না |
| কল করার পদ্ধতি | EXEC বা CALL দিয়ে | SELECT-এর মধ্যে সরাসরি |
-- Stored Procedure উদাহরণ
CREATE PROCEDURE GetEmployeeByDept(IN dept_id INT)
BEGIN
SELECT name, salary FROM employees WHERE dept_id = dept_id;
END;
CALL GetEmployeeByDept(3);
-- Function উদাহরণ
CREATE FUNCTION GetAverageSalary(dept_id INT)
RETURNS DECIMAL(10,2)
BEGIN
DECLARE avg_sal DECIMAL(10,2);
SELECT AVG(salary) INTO avg_sal FROM employees WHERE dept_id = dept_id;
RETURN avg_sal;
END;
SELECT GetAverageSalary(3);
৯. SQL-এ Deadlock কী এবং এটি কীভাবে প্রতিরোধ করা যায়?
উত্তর:
Deadlock হলো এমন একটি পরিস্থিতি যেখানে দুটি বা তার বেশি transaction একে অপরের lock release-এর জন্য অপেক্ষা করে — ফলে কোনোটিই এগোতে পারে না।
উদাহরণ:
- Transaction A, Table 1 lock করে Table 2-এর জন্য অপেক্ষা করছে
- Transaction B, Table 2 lock করে Table 1-এর জন্য অপেক্ষা করছে
Deadlock প্রতিরোধের উপায়:
- সব transaction-এ একই order-এ resource access করুন
- Transaction যতটা সম্ভব ছোট এবং দ্রুত রাখুন
- Appropriate isolation level ব্যবহার করুন (যেমন READ COMMITTED)
- Index সঠিকভাবে ব্যবহার করুন যাতে lock কম হয়
- Timeout set করুন যাতে deadlock হলে স্বয়ংক্রিয়ভাবে rollback হয়
-- Java/Spring-এ @Transactional দিয়ে timeout set করা
-- @Transactional(timeout = 30, isolation = Isolation.READ_COMMITTED)
-- সঠিক order: সবসময় একই ক্রমে lock নিন
-- Transaction A এবং B উভয়ই Table 1 তারপর Table 2 access করবে
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- প্রথমে id=1
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- তারপর id=2
COMMIT;
১০. SQL-এ Query Optimization কীভাবে করবেন?
উত্তর:
Query Optimization হলো SQL query-কে দ্রুততর এবং কম resource-consuming করার প্রক্রিয়া।
প্রধান কৌশলসমূহ:
১. EXPLAIN/EXPLAIN ANALYZE ব্যবহার করুন:
EXPLAIN SELECT * FROM employees WHERE dept_id = 5;
-- Query execution plan দেখায়, কোথায় Full Table Scan হচ্ছে বোঝা যায়
২. SELECT * এড়িয়ে চলুন:
-- খারাপ
SELECT * FROM employees;
-- ভালো
SELECT id, name, salary FROM employees;
৩. Proper Indexing ব্যবহার করুন:
CREATE INDEX idx_dept ON employees(dept_id);
৪. Subquery-র বদলে JOIN ব্যবহার করুন:
-- কম efficient (Subquery)
SELECT name FROM employees
WHERE dept_id IN (SELECT id FROM departments WHERE location = 'Dhaka');
-- বেশি efficient (JOIN)
SELECT e.name FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE d.location = 'Dhaka';
৫. LIMIT ব্যবহার করুন বড় result set-এ:
SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10;
৬. Avoid functions on indexed columns in WHERE:
-- খারাপ: Index ব্যবহার হবে না
WHERE YEAR(created_at) = 2024
-- ভালো: Index ব্যবহার হবে
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31'
উপসংহার
SQL ইন্টারভিউতে শুধু syntax জানলেই হয় না — concept, performance এবং real-world use case বুঝতে হয়। উপরের প্রশ্নগুলো ভালোভাবে অনুশীলন করুন এবং নিজে হাতে-কলমে practice করুন। Java ডেভেলপার হিসেবে JPA/Hibernate-এর সাথে কীভাবে SQL optimize করতে হয় সেটাও জানা জরুরি।