এসকিউএল 2026-এ সবচেয়ে গুরুত্বপূর্ণ ক্যোয়ারী ল্যাঙ্গুয়েজ রয়ে গেছে — প্রতিটি ডেটা রোল, ব্যাকএন্ড ডেভেলপার পজিশন এবং অ্যানালিটিক্স কাজের জন্য SQL দক্ষতা প্রয়োজন। এই নির্দেশিকাটি মৌলিক SELECT স্টেটমেন্ট থেকে শুরু করে উন্নত উইন্ডো ফাংশন, ক্যোয়ারী অপ্টিমাইজেশান, এবং ডাটাবেস ডিজাইন পর্যন্ত সবচেয়ে সাধারণ SQL ইন্টারভিউ প্রশ্নগুলি কভার করে৷
📋 Table of Contents
মৌলিক SQL প্রশ্ন
1. WHERE এবং HAVING এর মধ্যে পার্থক্য কি?
-- WHERE filters rows BEFORE grouping
SELECT department, COUNT(*) as count
FROM employees
WHERE salary > 50000 -- filters rows first
GROUP BY department;
-- HAVING filters groups AFTER GROUP BY
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 60000; -- filters groups
-- Key rule: WHERE cannot use aggregate functions
-- HAVING can use aggregate functions
2. বিভিন্ন ধরনের JOIN ব্যাখ্যা কর
-- Setup: users and orders tables
-- users: id, name
-- orders: id, user_id, total
-- INNER JOIN — only matching rows
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- Returns only users who HAVE orders
-- LEFT JOIN — all from left, matching from right
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- Returns ALL users (total=NULL if no orders)
-- RIGHT JOIN — all from right, matching from left
-- Rarely used (just flip LEFT JOIN)
-- FULL OUTER JOIN — all from both
SELECT u.name, o.total
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
-- CROSS JOIN — every combination (cartesian product)
SELECT u.name, p.name
FROM users u
CROSS JOIN products p; -- n x m rows
3. সূচকগুলি কী এবং কখন সেগুলি ব্যবহার করা উচিত?
-- Index = B-tree data structure for fast lookups
-- When to create:
-- 1. Frequently queried columns (WHERE, JOIN ON, ORDER BY)
CREATE INDEX idx_users_email ON users(email);
-- 2. Compound index (for multi-column queries)
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
-- 3. Unique constraint
CREATE UNIQUE INDEX idx_users_email_unique ON users(email);
-- When NOT to create:
-- - Small tables (full scan may be faster)
-- - Frequently updated columns (updates must update index too)
-- - Low-cardinality columns (e.g., gender with 2 values)
-- Check if index is used
EXPLAIN SELECT * FROM users WHERE email = 'alice@example.com';
ইন্টারমিডিয়েট প্রশ্ন
4. দ্বিতীয় সর্বোচ্চ বেতন খুঁজতে একটি প্রশ্ন লিখুন
-- Method 1: LIMIT/OFFSET
SELECT DISTINCT salary
FROM employees
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
-- Method 2: Subquery
SELECT MAX(salary) as second_highest
FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);
-- Method 3: Dense rank (best for Nth highest)
SELECT salary
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) as rank
FROM employees
) ranked
WHERE rank = 2
LIMIT 1;
5. ডুপ্লিকেট রেকর্ড খুঁজুন
-- Find duplicates
SELECT email, COUNT(*) as count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
-- Show all duplicate rows
SELECT *
FROM users u1
WHERE EXISTS (
SELECT 1 FROM users u2
WHERE u2.email = u1.email
AND u2.id != u1.id
);
-- Delete duplicates (keep lowest ID)
DELETE FROM users
WHERE id NOT IN (
SELECT MIN(id)
FROM users
GROUP BY email
);
6. উইন্ডো ফাংশন ব্যাখ্যা করুন
-- Window functions operate on a set of rows related to current row
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) as dept_avg,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank,
salary - LAG(salary) OVER (ORDER BY hire_date) as salary_change,
SUM(salary) OVER (ORDER BY hire_date ROWS UNBOUNDED PRECEDING) as running_total
FROM employees;
-- ROW_NUMBER vs RANK vs DENSE_RANK
-- ROW_NUMBER: 1,2,3,4,5 (no ties)
-- RANK: 1,2,2,4,5 (ties get same rank, gap after)
-- DENSE_RANK: 1,2,2,3,4 (ties get same rank, no gap)
উন্নত প্রশ্ন
7. CTE কি এবং কখন ব্যবহার করতে হবে?
-- Common Table Expression (WITH clause)
WITH
monthly_revenue AS (
SELECT
DATE_TRUNC('month', created_at) AS month,
SUM(total) AS revenue
FROM orders
GROUP BY 1
),
growth_rates AS (
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_month,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month)) /
LAG(revenue) OVER (ORDER BY month), 2
) AS growth_pct
FROM monthly_revenue
)
SELECT * FROM growth_rates WHERE month >= '2026-01-01';
-- Benefits: readability, reusability, no nested subquery hell
-- Recursive CTE: for hierarchical data (org charts, file trees)
8. ব্যাখ্যা কী এবং আপনি প্রশ্নগুলি অপ্টিমাইজ করতে কীভাবে এটি ব্যবহার করবেন?
EXPLAIN ANALYZE SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at > NOW() - INTERVAL '30 days'
GROUP BY u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC;
-- Look for:
-- Seq Scan (sequential scan) on large table → needs index
-- Index Scan → using index (good)
-- Hash Join vs Nested Loop → Hash better for large tables
-- High cost estimates → consider query rewrite
-- rows= vs actual rows= discrepancy → run ANALYZE
9. এসিড বৈশিষ্ট্য – তারা কি?
- পরমাণু– লেনদেনের সমস্ত ক্রিয়াকলাপ সফল বা সমস্ত ব্যর্থ হয়
- ধারাবাহিকতা— ডাটাবেস একটি বৈধ অবস্থা থেকে অন্য অবস্থায় যায়
- আলাদা করা— সমসাময়িক লেনদেন একে অপরের মধ্যবর্তী অবস্থা দেখতে পায় না
- স্থায়িত্ব– প্রতিশ্রুতিবদ্ধ লেনদেন সিস্টেমের ব্যর্থতা থেকে বেঁচে থাকে
10. N+1 ক্যোয়ারী সমস্যা কি এবং আপনি কিভাবে এটি ঠিক করবেন?
-- N+1: 1 query for list, then 1 query per item
-- Bad (N+1 in application):
-- SELECT * FROM users -- 1 query
-- SELECT * FROM orders WHERE user_id = 1 -- then N more queries!
-- Fix: JOIN to get data in one query
SELECT u.id, u.name, o.id as order_id, o.total
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.id IN (1, 2, 3);
-- Or use subquery for aggregates
SELECT u.id, u.name,
(SELECT COUNT(*) FROM orders WHERE user_id = u.id) as order_count
FROM users u;
এসকিউএল ইন্টারভিউ প্রস্তুতি: স্ক্র্যাচ থেকে প্রশ্ন লেখার অভ্যাস করুন, যোগদানগুলিকে গভীরভাবে বুঝুন, উইন্ডো ফাংশনগুলি ঠান্ডা জানুন এবং ব্যাখ্যা করতে পারবেন আউটপুট ব্যাখ্যা করতে। বেশিরভাগ এসকিউএল ইন্টারভিউতে একটি ব্যবহারিক উপাদান রয়েছে — leetcode.com/study-plan/sql/ বা sqlzoo.net-এ অনুশীলন করুন। আপনার প্রশ্নের সময় এবং তাদের অপ্টিমাইজ করুন.
🔗 Share this article
✍️ Leave a Comment